From 0d6b320def9180cf907ceaed56b23a972a11b757 Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Mon, 2 Mar 2009 00:43:34 -0500 Subject: [PATCH] http://ftp.ksu.edu.tw/FTP/FreeBSD/distfiles/xscreensaver-4.23.tar.gz -rw-r--r-- 1 zblaxell zblaxell 4939070 Oct 22 2005 xscreensaver-4.23.tar.gz b7d3f0b4a94d879a2450a268ae941b92ca4fc39e xscreensaver-4.23.tar.gz --- README | 21 +- configure | 111 +- configure.in | 18 +- driver/XScreenSaver.ad.in | 11 +- driver/XScreenSaver_ad.h | 7 +- driver/demo-Gtk.c | 32 +- driver/lock.c | 26 +- driver/prefs.c | 24 +- driver/remote.c | 4 +- driver/setuid.c | 2 +- driver/subprocs.c | 187 +- driver/timers.c | 10 + driver/windows.c | 17 +- driver/xscreensaver-command.c | 14 +- driver/xscreensaver-demo.glade2 | 42 + driver/xscreensaver-getimage-desktop | 53 +- driver/xscreensaver-getimage.c | 7 +- driver/xscreensaver-text | 5 +- driver/xscreensaver.c | 12 + driver/xscreensaver.man | 8 + hacks/Makefile.in | 16 +- hacks/apple2-main.c | 22 +- hacks/celtic.c | 1032 +++++++ hacks/celtic.man | 60 + hacks/compile_axp.com | 1 + hacks/compile_decc.com | 1 + hacks/config/README | 48 +- hacks/config/ant.xml | 6 +- hacks/config/boxed.xml | 12 + hacks/config/celtic.xml | 22 + hacks/config/cosmos.xml | 2 +- hacks/config/cube21.xml | 63 + hacks/config/glhanoi.xml | 26 + hacks/config/hyperball.xml | 14 +- hacks/config/hypercube.xml | 12 +- hacks/config/hypertorus.xml | 10 + hacks/config/interaggregate.xml | 2 +- hacks/config/jigglypuff.xml | 4 +- hacks/config/juggler3d.xml | 34 + hacks/config/polyhedra.xml | 306 +- hacks/config/ripples.xml | 2 + hacks/config/squiral.xml | 6 +- hacks/config/tangram.xml | 15 +- hacks/config/timetunnel.xml | 24 + hacks/config/whirlwindwarp.xml | 4 +- hacks/config/whirlygig.xml | 22 +- hacks/config/xmountains.xml | 8 +- hacks/glx/Makefile.in | 55 +- hacks/glx/antmaze.c | 48 +- hacks/glx/boxed.c | 86 +- hacks/glx/crackberg.c | 4 +- hacks/glx/cube21-tex.h | 4106 ++++++++++++++++++++++++++ hacks/glx/cube21.c | 788 +++++ hacks/glx/cube21.man | 149 + hacks/glx/gears.c | 20 +- hacks/glx/glhanoi.c | 1484 ++++++++++ hacks/{ant.man => glx/glhanoi.man} | 72 +- hacks/glx/gltrackball.c | 8 + hacks/glx/gltrackball.h | 4 + hacks/glx/grab-ximage.c | 7 + hacks/glx/hypertorus.c | 413 ++- hacks/glx/hypertorus.man | 48 +- hacks/glx/juggler3d.c | 2143 ++++++++++++++ hacks/glx/juggler3d.man | 88 + hacks/glx/molecule.c | 21 +- hacks/glx/polytopes.c | 202 +- hacks/glx/polytopes.man | 13 +- hacks/glx/tangram.c | 1792 +++++------ hacks/glx/tangram.man | 5 +- hacks/glx/tangram_shapes.c | 41 +- hacks/glx/timetunnel.c | 1234 ++++++++ hacks/glx/timetunnel.man | 81 + hacks/glx/xpm-ximage.c | 32 +- hacks/images/timetunnel0.xpm | 343 +++ hacks/images/timetunnel1.xpm | 1111 +++++++ hacks/images/timetunnel2.xpm | 599 ++++ hacks/images/tunnelstar.xpm | 323 ++ hacks/interaggregate.c | 4 +- hacks/noseguy.c | 2 +- hacks/noseguy.man | 2 +- hacks/ripples.c | 98 +- hacks/ripples.man | 6 + hacks/sonar.c | 22 +- hacks/spotlight.c | 4 +- hacks/webcollage | 83 +- hacks/webcollage-helper.c | 1 + hacks/whirlygig.man | 34 +- hacks/xlyap.c | 20 +- po/POTFILES.in | 7 +- setup.com | 2 +- utils/version.h | 2 +- xscreensaver.spec | 4 +- 92 files changed, 16334 insertions(+), 1662 deletions(-) create mode 100644 hacks/celtic.c create mode 100644 hacks/celtic.man create mode 100644 hacks/config/celtic.xml create mode 100644 hacks/config/cube21.xml create mode 100644 hacks/config/glhanoi.xml create mode 100644 hacks/config/juggler3d.xml create mode 100644 hacks/config/timetunnel.xml create mode 100644 hacks/glx/cube21-tex.h create mode 100644 hacks/glx/cube21.c create mode 100644 hacks/glx/cube21.man create mode 100644 hacks/glx/glhanoi.c rename hacks/{ant.man => glx/glhanoi.man} (52%) create mode 100644 hacks/glx/juggler3d.c create mode 100644 hacks/glx/juggler3d.man create mode 100644 hacks/glx/timetunnel.c create mode 100644 hacks/glx/timetunnel.man create mode 100644 hacks/images/timetunnel0.xpm create mode 100644 hacks/images/timetunnel1.xpm create mode 100644 hacks/images/timetunnel2.xpm create mode 100644 hacks/images/tunnelstar.xpm diff --git a/README b/README index beac235b..0df5d685 100644 --- a/README +++ b/README @@ -65,7 +65,7 @@ there's no need to recompile or reinstall anything. Along with the xscreensaver daemon itself, this package also includes numerous graphics hacks for use as screensavers. There is nothing magic about these: they are just programs that draw on the root window. -More than 190 such programs are included. For details, see the +More than 200 such programs are included. For details, see the xscreensaver web page, or the enclosed manual pages. The latest version of xscreensaver is always available on the web at @@ -76,6 +76,25 @@ the XScreenSaver FAQ about that: http://www.jwz.org/xscreensaver/faq.html ============ +Changes since 4.22: * New hacks, `glhanoi', `cube21', `timetunnel', + `juggler3d', and `celtic'. + * New versions of `tangram', `webcollage', `hypertorus', + `polytopes', and `ripples'. + * `sonar' is now quiet about unresolvable hosts. + * Minor corrections to BASIC code in `apple2'. + * xscreensaver-demo now provides an RPM clue when none + of the hacks seem to be installed. + * Don't install `ant' by default, since there is some + Java tool of that name, which was causing confusion. + And also it's boring. + * Made screen grabbing work again on MacOS 10.4.2. + * No longer prints bogus warnings about ClientMessages + intended for the window manager. + * Ignore unprintable characters in passwd entry field. + * Fixed yet another cross-host-display image-loading + endian problem. + * `xscreensaver-command -watch' and `-time' now work + on 64-bit machines. Changes since 4.21: * Fixed a bug in the new mouse-motion code that caused the screen to never blank on multi-head non-Xinerama systems. Oops. diff --git a/configure b/configure index 9873d74b..4238a72e 100755 --- a/configure +++ b/configure @@ -7167,6 +7167,15 @@ echo "$as_me:$LINENO: result: $ac_macosx" >&5 echo "${ECHO_T}$ac_macosx" >&6 +if test "$ac_macosx" = yes; then + if test -n "$GCC"; then + # Without these, every link against libGL gets a bunch of useless warnings. + osx_crud="-bind_at_load -multiply_defined suppress" + echo "$as_me:$LINENO: result: adding \"$osx_crud\" to LDFLAGS" >&5 +echo "${ECHO_T}adding \"$osx_crud\" to LDFLAGS" >&6 + LDFLAGS="$LDFLAGS $osx_crud" + fi +fi ############################################################################### # @@ -14387,7 +14396,6 @@ echo $ECHO_N "checking for $login_manager_tmp... $ECHO_C" >&6 if test -x "$login_manager_tmp" ; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 - with_login_manager="$login_manager_tmp" else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 @@ -14695,6 +14703,7 @@ fi echo "$as_me:$LINENO: result: $ac_cv_gtk_config_libs" >&5 echo "${ECHO_T}$ac_cv_gtk_config_libs" >&6 fi + ac_gtk_config_cflags=$ac_cv_gtk_config_cflags ac_gtk_config_libs=$ac_cv_gtk_config_libs @@ -16112,7 +16121,7 @@ if test "${ac_cv_mesagl_version_string+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat > conftest.$ac_ext < #ifndef MESA_MAJOR_VERSION @@ -16983,6 +16992,7 @@ fi echo "$as_me:$LINENO: result: $ac_cv_gdk_pixbuf_config_libs" >&5 echo "${ECHO_T}$ac_cv_gdk_pixbuf_config_libs" >&6 fi + ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs @@ -18378,6 +18388,7 @@ echo "$as_me:$LINENO: result: $ac_cv_lib_util_forkpty" >&5 echo "${ECHO_T}$ac_cv_lib_util_forkpty" >&6 if test $ac_cv_lib_util_forkpty = yes; then PTY_LIBS="-lutil" + ac_have_forkpty=yes cat >>confdefs.h <<\_ACEOF #define HAVE_FORKPTY 1 _ACEOF @@ -18389,6 +18400,102 @@ fi # LIBS="$ac_save_LIBS" +if test "$ac_have_forkpty" != yes ; then + # we don't need (or have) -lutil on MacOS 10.4.2... + + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" +# ac_save_LIBS="$LIBS" + + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + # note: $X_CFLAGS includes $x_includes + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + # note: $X_LIBS includes $x_libraries + LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS" + + echo "$as_me:$LINENO: checking for forkpty in -lc" >&5 +echo $ECHO_N "checking for forkpty in -lc... $ECHO_C" >&6 +if test "${ac_cv_lib_c_forkpty+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char forkpty (); +int +main () +{ +forkpty (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_c_forkpty=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_c_forkpty=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_c_forkpty" >&5 +echo "${ECHO_T}$ac_cv_lib_c_forkpty" >&6 +if test $ac_cv_lib_c_forkpty = yes; then + PTY_LIBS="" + cat >>confdefs.h <<\_ACEOF +#define HAVE_FORKPTY 1 +_ACEOF + +fi + + CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS" +# LIBS="$ac_save_LIBS" + +fi ############################################################################### # diff --git a/configure.in b/configure.in index 7889de45..fbde9f84 100644 --- a/configure.in +++ b/configure.in @@ -1144,6 +1144,14 @@ AC_MSG_CHECKING(whether this is MacOS X) AC_MSG_RESULT($ac_macosx) +if test "$ac_macosx" = yes; then + if test -n "$GCC"; then + # Without these, every link against libGL gets a bunch of useless warnings. + osx_crud="-bind_at_load -multiply_defined suppress" + AC_MSG_RESULT(adding "$osx_crud" to LDFLAGS) + LDFLAGS="$LDFLAGS $osx_crud" + fi +fi ############################################################################### # @@ -2260,7 +2268,6 @@ if test -n "$with_login_manager_req" ; then AC_MSG_CHECKING([for $login_manager_tmp]) if test -x "$login_manager_tmp" ; then AC_MSG_RESULT(yes) - with_login_manager="$login_manager_tmp" else AC_MSG_RESULT(no) with_login_manager="" @@ -2420,6 +2427,7 @@ if test "$with_gtk" = yes; then AC_CACHE_CHECK([for Gtk libs], ac_cv_gtk_config_libs, [ac_cv_gtk_config_libs=`$pkg_config --libs $pkgs`]) fi + ac_gtk_config_cflags=$ac_cv_gtk_config_cflags ac_gtk_config_libs=$ac_cv_gtk_config_libs @@ -2955,6 +2963,7 @@ if test "$with_gdk_pixbuf" = yes; then AC_CACHE_CHECK([for gdk-pixbuf libs], ac_cv_gdk_pixbuf_config_libs, [ac_cv_gdk_pixbuf_config_libs=`$pkg_config --libs $pkgs`]) fi + ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs @@ -3107,8 +3116,15 @@ PTY_LIBS= AC_CHECK_HEADERS(pty.h util.h) AC_CHECK_X_LIB(util, forkpty, [PTY_LIBS="-lutil" + ac_have_forkpty=yes AC_DEFINE(HAVE_FORKPTY)]) +if test "$ac_have_forkpty" != yes ; then + # we don't need (or have) -lutil on MacOS 10.4.2... + AC_CHECK_X_LIB(c, forkpty, + [PTY_LIBS="" + AC_DEFINE(HAVE_FORKPTY)]) +fi ############################################################################### # diff --git a/driver/XScreenSaver.ad.in b/driver/XScreenSaver.ad.in index 807892d8..6f608c30 100644 --- a/driver/XScreenSaver.ad.in +++ b/driver/XScreenSaver.ad.in @@ -4,8 +4,8 @@ ! a screen saver and locker for the X window system ! by Jamie Zawinski ! -! version 4.22 -! 22-Jun-2005 +! version 4.23 +! 21-Oct-2005 ! ! See "man xscreensaver" for more info. The latest version is always ! available at http://www.jwz.org/xscreensaver/ @@ -226,7 +226,6 @@ GetViewPortIsFullOfLies: False triangle -root -delay 1 \n\ - worm -root \n\ - rotor -root \n\ -- ant -root \n\ - demon -root \n\ - loop -root \n\ - vines -root \n\ @@ -318,6 +317,7 @@ GetViewPortIsFullOfLies: False fireworkx -root \n\ fiberlamp -root \n\ boxfit -root \n\ + celtic -root \n\ - default-n: webcollage -root \n\ - default-n: "WebCollage (whacked)" \ webcollage -root -filter \ @@ -401,6 +401,10 @@ GetViewPortIsFullOfLies: False @GL_KLUDGE@ GL: tangram -root \n\ @GL_KLUDGE@ GL: crackberg -root -flat -lit -crack \ -color random \n\ +@GL_KLUDGE@ GL: glhanoi -root \n\ +@GL_KLUDGE@ GL: cube21 -root -colormode six \n\ +@GL_KLUDGE@ GL: timetunnel -root \n\ +@GL_KLUDGE@ GL: juggler3d -root \n\ \ - xdaliclock -root -builtin3 -cycle \n\ - default-n: xearth -nofork -nostars -ncolors 50 \ @@ -543,6 +547,7 @@ XScreenSaver.bourneShell: /bin/sh *hacks.memscroller.name: MemScroller *hacks.boxfit.name: BoxFit *hacks.fliptext.name: FlipText +*hacks.glhanoi.name: GLHanoi ! obsolete, but still used by xscreensaver-demo-Xm. *hacks.documentation.isInstalled: True diff --git a/driver/XScreenSaver_ad.h b/driver/XScreenSaver_ad.h index 663c37e0..c05ccf84 100644 --- a/driver/XScreenSaver_ad.h +++ b/driver/XScreenSaver_ad.h @@ -127,7 +127,6 @@ triangle -root -delay 1 \\n\ - worm -root \\n\ - rotor -root \\n\ -- ant -root \\n\ - demon -root \\n\ - loop -root \\n\ - vines -root \\n\ @@ -219,6 +218,7 @@ fireworkx -root \\n\ fiberlamp -root \\n\ boxfit -root \\n\ + celtic -root \\n\ - default-n: webcollage -root \\n\ - default-n: \"WebCollage (whacked)\" \ webcollage -root -filter \ @@ -302,6 +302,10 @@ GL: tangram -root \\n\ GL: crackberg -root -flat -lit -crack \ -color random \\n\ + GL: glhanoi -root \\n\ + GL: cube21 -root -colormode six \\n\ + GL: timetunnel -root \\n\ + GL: juggler3d -root \\n\ \ - xdaliclock -root -builtin3 -cycle \\n\ - default-n: xearth -nofork -nostars -ncolors 50 \ @@ -414,4 +418,5 @@ "*hacks.memscroller.name: MemScroller", "*hacks.boxfit.name: BoxFit", "*hacks.fliptext.name: FlipText", +"*hacks.glhanoi.name: GLHanoi", "*hacks.documentation.isInstalled: True", diff --git a/driver/demo-Gtk.c b/driver/demo-Gtk.c index 7d1ca042..4a6f3cf1 100644 --- a/driver/demo-Gtk.c +++ b/driver/demo-Gtk.c @@ -190,6 +190,7 @@ typedef struct { int *list_elt_to_hack_number; /* table for sorting the hack list */ int *hack_number_to_list_elt; /* the inverse table */ Bool *hacks_available_p; /* whether hacks are on $PATH */ + int total_available; /* how many are on $PATH */ int list_count; /* how many items are in the list: this may be less than p->screenhacks_count, if some are suppressed. */ @@ -645,7 +646,6 @@ run_hack (state *s, int list_elt, Bool report_errors_p) strcpy (buf, "Unknown error!"); warning_dialog (s->toplevel_widget, buf, False, 100); } - if (err) free (err); } else { @@ -845,7 +845,8 @@ doc_menu_cb (GtkMenuItem *menuitem, gpointer user_data) p->load_url_command, p->help_url, p->help_url, p->help_url, p->help_url); strcat (help_command, " ) &"); - system (help_command); + if (system (help_command) < 0) + fprintf (stderr, "%s: fork error\n", blurb()); free (help_command); } @@ -889,7 +890,8 @@ restart_menu_cb (GtkWidget *widget, gpointer user_data) flush_dialog_changes_and_save (s); xscreensaver_command (GDK_DISPLAY(), XA_EXIT, 0, False, NULL); sleep (1); - system ("xscreensaver -nosplash &"); + if (system ("xscreensaver -nosplash &") < 0) + fprintf (stderr, "%s: fork error\n", blurb()); await_xscreensaver (s); } @@ -1051,7 +1053,8 @@ manual_cb (GtkButton *button, gpointer user_data) cmd, name2, name2, name2, name2); strcat (cmd2, " ) &"); - system (cmd2); + if (system (cmd2) < 0) + fprintf (stderr, "%s: fork error\n", blurb()); free (cmd2); } else @@ -1080,9 +1083,11 @@ force_list_select_item (state *s, GtkWidget *list, int list_elt, Bool scroll_p) #ifdef HAVE_GTK2 model = gtk_tree_view_get_model (GTK_TREE_VIEW (list)); STFU g_assert (model); - gtk_tree_model_iter_nth_child (model, &iter, NULL, list_elt); - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list)); - gtk_tree_selection_select_iter (selection, &iter); + if (gtk_tree_model_iter_nth_child (model, &iter, NULL, list_elt)) + { + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list)); + gtk_tree_selection_select_iter (selection, &iter); + } #else /* !HAVE_GTK2 */ gtk_list_select_item (GTK_LIST (list), list_elt); #endif /* !HAVE_GTK2 */ @@ -3315,13 +3320,16 @@ initialize_sort_map (state *s) calloc (sizeof(int), p->screenhacks_count + 1); s->hacks_available_p = (Bool *) calloc (sizeof(Bool), p->screenhacks_count + 1); + s->total_available = 0; /* Check which hacks actually exist on $PATH */ for (i = 0; i < p->screenhacks_count; i++) { screenhack *hack = p->screenhacks[i]; - s->hacks_available_p[i] = on_path_p (hack->command); + int on = on_path_p (hack->command) ? 1 : 0; + s->hacks_available_p[i] = on; + s->total_available += on; } /* Initialize list->hack table to unsorted mapping, omitting nonexistent @@ -3473,11 +3481,14 @@ clear_preview_window (state *s) Bool available_p = (hack_number >= 0 ? s->hacks_available_p [hack_number] : True); + Bool nothing_p = (s->total_available < 5); + #ifdef HAVE_GTK2 GtkWidget *notebook = name_to_widget (s, "preview_notebook"); gtk_notebook_set_page (GTK_NOTEBOOK (notebook), (s->running_preview_error_p - ? (available_p ? 1 : 2) + ? (available_p ? 1 : + nothing_p ? 3 : 2) : 0)); #else /* !HAVE_GTK2 */ if (s->running_preview_error_p) @@ -3718,7 +3729,8 @@ get_best_gl_visual (state *s) close (out); /* don't need this one */ *buf = 0; - fgets (buf, sizeof(buf)-1, f); + if (!fgets (buf, sizeof(buf)-1, f)) + *buf = 0; fclose (f); /* Wait for the child to die. */ diff --git a/driver/lock.c b/driver/lock.c index 169880b1..65162a59 100644 --- a/driver/lock.c +++ b/driver/lock.c @@ -17,6 +17,7 @@ # include "config.h" #endif +#include #include #include #include /* for time() */ @@ -1424,14 +1425,25 @@ handle_passwd_key (saver_info *si, XKeyEvent *event) break; default: - i = strlen (typed_passwd); - if (i >= pw_size-1) - XBell (si->dpy, 0); + /* Though technically the only illegal characters in Unix passwords + are LF and NUL, most GUI programs (e.g., GDM) use regular text-entry + fields that only let you type printable characters. So, people + who use funky characters in their passwords are already broken. + We follow that precedent. + */ + if (isprint ((unsigned char) *s)) + { + i = strlen (typed_passwd); + if (i >= pw_size-1) + XBell (si->dpy, 0); + else + { + typed_passwd [i] = *s; + typed_passwd [i+1] = 0; + } + } else - { - typed_passwd [i] = *s; - typed_passwd [i+1] = 0; - } + XBell (si->dpy, 0); break; } diff --git a/driver/prefs.c b/driver/prefs.c index d34d2935..1ef9a276 100644 --- a/driver/prefs.c +++ b/driver/prefs.c @@ -86,7 +86,14 @@ chase_symlinks (const char *file) # ifdef HAVE_REALPATH if (file) { - char buf [2048]; +# ifndef PATH_MAX +# ifdef MAXPATHLEN +# define PATH_MAX MAXPATHLEN +# else +# define PATH_MAX 2048 +# endif +# endif + char buf[PATH_MAX]; if (realpath (file, buf)) return strdup (buf); @@ -1576,11 +1583,15 @@ stop_the_insanity (saver_preferences *p) p->dpms_off < 10 * 1000) p->dpms_off = 4 * 60 * 60 * 1000; /* 4 hours */ - /* standby may not be greater than suspend. - suspend may not be greater than off. + /* suspend may not be greater than off, unless off is 0. + standby may not be greater than suspend, unless suspend is 0. */ - if (p->dpms_standby > p->dpms_suspend) p->dpms_standby = p->dpms_suspend; - if (p->dpms_suspend > p->dpms_off) p->dpms_suspend = p->dpms_off; + if (p->dpms_off != 0 && + p->dpms_suspend > p->dpms_off) + p->dpms_suspend = p->dpms_off; + if (p->dpms_suspend != 0 && + p->dpms_standby > p->dpms_suspend) + p->dpms_standby = p->dpms_suspend; if (p->dpms_standby == 0 && /* if *all* are 0, then DPMS is disabled */ @@ -1589,6 +1600,9 @@ stop_the_insanity (saver_preferences *p) p->dpms_enabled_p = False; + /* Set watchdog timeout to about half of the cycle timeout, but + don't let it be faster than 1/2 minute or slower than 1 minute. + */ p->watchdog_timeout = p->cycle * 0.6; if (p->watchdog_timeout < 27000) p->watchdog_timeout = 27000; /* 27 secs */ if (p->watchdog_timeout > 57000) p->watchdog_timeout = 57000; /* 57 secs */ diff --git a/driver/remote.c b/driver/remote.c index d56d5e9f..6039324f 100644 --- a/driver/remote.c +++ b/driver/remote.c @@ -1,5 +1,4 @@ -/* xscreensaver-command, Copyright (c) 1991-1998 - * by Jamie Zawinski +/* xscreensaver-command, Copyright (c) 1991-2005 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -201,7 +200,6 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg, else fprintf (stderr, "%s: %s\n", progname, err); - if (v) free (v); status = -1; goto DONE; } diff --git a/driver/setuid.c b/driver/setuid.c index 74d8318b..86d3535a 100644 --- a/driver/setuid.c +++ b/driver/setuid.c @@ -97,7 +97,7 @@ setgroups_needed_p (uid_t target_group) if (n < 0) { char buf [1024]; - sprintf (buf, "%s: getgroups(%d, ...)", blurb(), sizeof(groups)-1); + sprintf (buf, "%s: getgroups(%ld, ...)", blurb(), (long)sizeof(groups)-1); perror (buf); return 1; } diff --git a/driver/subprocs.c b/driver/subprocs.c index ffabe483..01329d0e 100644 --- a/driver/subprocs.c +++ b/driver/subprocs.c @@ -71,6 +71,59 @@ extern int kill (pid_t, int); /* signal() is in sys/signal.h... */ extern saver_info *global_si_kludge; /* I hate C so much... */ +/* Used when printing error/debugging messages from signal handlers. + */ +static const char * +no_malloc_number_to_string (long num) +{ + static char string[128] = ""; + int num_digits; + Bool negative_p = False; + + num_digits = 0; + + if (num == 0) + return "0"; + + if (num < 0) + { + negative_p = True; + num = -num; + } + + while ((num > 0) && (num_digits < sizeof(string - 1))) + { + int digit; + digit = (int) num % 10; + num_digits++; + string[sizeof(string) - 1 - num_digits] = digit + '0'; + num /= 10; + } + + if (negative_p) + { + num_digits++; + string[sizeof(string) - 1 - num_digits] = '-'; + } + + return string + sizeof(string) - 1 - num_digits; +} + +/* Like write(), but runs strlen() on the arg to get the length. */ +static int +write_string (int fd, const char *str) +{ + return write (fd, str, strlen (str)); +} + +static int +write_long (int fd, long n) +{ + const char *str = no_malloc_number_to_string (n); + return write_string (fd, str); +} + + /* RLIMIT_AS (called RLIMIT_VMEM on some systems) controls the maximum size of a process's address space, i.e., the maximal brk(2) and mmap(2) values. Setting this lets you put a cap on how much memory a process can allocate. @@ -412,8 +465,19 @@ sigchld_handler (int sig) saver_info *si = global_si_kludge; /* I hate C so much... */ if (si->prefs.debug_p) - fprintf(stderr, "%s: got SIGCHLD%s\n", blurb(), + { + /* Don't call fprintf() from signal handlers, as it might malloc. + fprintf(stderr, "%s: got SIGCHLD%s\n", blurb(), (block_sigchld_handler ? " (blocked)" : "")); + */ + write_string (STDERR_FILENO, blurb()); + write_string (STDERR_FILENO, ": got SIGCHLD"); + + if (block_sigchld_handler) + write_string (STDERR_FILENO, " (blocked)\n"); + else + write_string (STDERR_FILENO, "\n"); + } if (block_sigchld_handler < 0) abort(); @@ -430,6 +494,7 @@ sigchld_handler (int sig) #ifndef VMS + static void await_dying_children (saver_info *si) { @@ -444,11 +509,29 @@ await_dying_children (saver_info *si) if (si->prefs.debug_p) { if (kid < 0 && errno) - fprintf (stderr, "%s: waitpid(-1) ==> %ld (%d)\n", blurb(), - (long) kid, errno); - else - fprintf (stderr, "%s: waitpid(-1) ==> %ld\n", blurb(), - (long) kid); + { + /* Don't call fprintf() from signal handlers, as it might malloc. + fprintf (stderr, "%s: waitpid(-1) ==> %ld (%d)\n", blurb(), + (long) kid, errno); + */ + write_string (STDERR_FILENO, blurb()); + write_string (STDERR_FILENO, ": waitpid(-1) ==> "); + write_long (STDERR_FILENO, (long) kid); + write_string (STDERR_FILENO, " ("); + write_long (STDERR_FILENO, (long) errno); + write_string (STDERR_FILENO, ")\n"); + } + else + { + /* Don't call fprintf() from signal handlers, as it might malloc. + fprintf (stderr, "%s: waitpid(-1) ==> %ld\n", blurb(), + (long) kid); + */ + write_string (STDERR_FILENO, blurb()); + write_string (STDERR_FILENO, ": waitpid(-1) ==> "); + write_long (STDERR_FILENO, (long) kid); + write_string (STDERR_FILENO, "\n"); + } } /* 0 means no more children to reap. @@ -488,12 +571,38 @@ describe_dead_child (saver_info *si, pid_t kid, int wait_status) if (!job || (exit_status != 0 && (p->verbose_p || job->status != job_killed))) - fprintf (stderr, - "%s: %d: child pid %lu (%s) exited abnormally (code %d).\n", - blurb(), screen_no, (unsigned long) kid, name, exit_status); + { + /* Don't call fprintf() from signal handlers, as it might malloc. + fprintf (stderr, + "%s: %d: child pid %lu (%s) exited abnormally (code %d).\n", + blurb(), screen_no, (unsigned long) kid, name, exit_status); + */ + write_string (STDERR_FILENO, blurb()); + write_string (STDERR_FILENO, ": "); + write_long (STDERR_FILENO, (long) screen_no); + write_string (STDERR_FILENO, ": child pid "); + write_long (STDERR_FILENO, (long) kid); + write_string (STDERR_FILENO, " ("); + write_string (STDERR_FILENO, name); + write_string (STDERR_FILENO, ") exited abnormally (code "); + write_long (STDERR_FILENO, (long) exit_status); + write_string (STDERR_FILENO, ").\n"); + } else if (p->verbose_p) - fprintf (stderr, "%s: %d: child pid %lu (%s) exited normally.\n", - blurb(), screen_no, (unsigned long) kid, name); + { + /* Don't call fprintf() from signal handlers, as it might malloc. + fprintf (stderr, "%s: %d: child pid %lu (%s) exited normally.\n", + blurb(), screen_no, (unsigned long) kid, name); + */ + write_string (STDERR_FILENO, blurb()); + write_string (STDERR_FILENO, ": "); + write_long (STDERR_FILENO, (long) screen_no); + write_string (STDERR_FILENO, ": child pid "); + write_long (STDERR_FILENO, (long) kid); + write_string (STDERR_FILENO, " ("); + write_string (STDERR_FILENO, name); + write_string (STDERR_FILENO, ") exited normally.\n"); + } if (job) job->status = job_dead; @@ -504,9 +613,23 @@ describe_dead_child (saver_info *si, pid_t kid, int wait_status) !job || job->status != job_killed || WTERMSIG (wait_status) != SIGTERM) - fprintf (stderr, "%s: %d: child pid %lu (%s) terminated with %s.\n", - blurb(), screen_no, (unsigned long) kid, name, - signal_name (WTERMSIG(wait_status))); + { + /* Don't call fprintf() from signal handlers, as it might malloc. + fprintf (stderr, "%s: %d: child pid %lu (%s) terminated with %s.\n", + blurb(), screen_no, (unsigned long) kid, name, + signal_name (WTERMSIG(wait_status))); + */ + write_string (STDERR_FILENO, blurb()); + write_string (STDERR_FILENO, ": "); + write_long (STDERR_FILENO, (long) screen_no); + write_string (STDERR_FILENO, ": child pid "); + write_long (STDERR_FILENO, (long) kid); + write_string (STDERR_FILENO, " ("); + write_string (STDERR_FILENO, name); + write_string (STDERR_FILENO, ") terminated with signal "); + write_long (STDERR_FILENO, WTERMSIG(wait_status)); + write_string (STDERR_FILENO, ".\n"); + } if (job) job->status = job_dead; @@ -514,17 +637,41 @@ describe_dead_child (saver_info *si, pid_t kid, int wait_status) else if (WIFSTOPPED (wait_status)) { if (p->verbose_p) - fprintf (stderr, "%s: child pid %lu (%s) stopped with %s.\n", - blurb(), (unsigned long) kid, name, - signal_name (WSTOPSIG (wait_status))); + { + /* Don't call fprintf() from signal handlers, as it might malloc. + fprintf (stderr, "%s: child pid %lu (%s) stopped with %s.\n", + blurb(), (unsigned long) kid, name, + signal_name (WSTOPSIG (wait_status))); + */ + write_string (STDERR_FILENO, blurb()); + write_string (STDERR_FILENO, ": "); + write_long (STDERR_FILENO, (long) screen_no); + write_string (STDERR_FILENO, ": child pid "); + write_long (STDERR_FILENO, (long) kid); + write_string (STDERR_FILENO, " ("); + write_string (STDERR_FILENO, name); + write_string (STDERR_FILENO, ") stopped with signal "); + write_long (STDERR_FILENO, WSTOPSIG(wait_status)); + write_string (STDERR_FILENO, ".\n"); + } if (job) job->status = job_stopped; } else { + /* Don't call fprintf() from signal handlers, as it might malloc. fprintf (stderr, "%s: child pid %lu (%s) died in a mysterious way!", blurb(), (unsigned long) kid, name); + */ + write_string (STDERR_FILENO, blurb()); + write_string (STDERR_FILENO, ": "); + write_long (STDERR_FILENO, (long) screen_no); + write_string (STDERR_FILENO, ": child pid "); + write_long (STDERR_FILENO, (long) kid); + write_string (STDERR_FILENO, " ("); + write_string (STDERR_FILENO, name); + write_string (STDERR_FILENO, ") died in a mysterious way!"); if (job) job->status = job_dead; } @@ -637,7 +784,8 @@ print_path_error (const char *program) fprintf (stderr, "\n"); *path = 0; # if defined(HAVE_GETCWD) - getcwd (path, sizeof(path)); + if (! getcwd (path, sizeof(path))) + *path = 0; # elif defined(HAVE_GETWD) getwd (path); # endif @@ -1090,7 +1238,8 @@ get_best_gl_visual (saver_screen_info *ssi) close (out); /* don't need this one */ *buf = 0; - fgets (buf, sizeof(buf)-1, f); + if (! fgets (buf, sizeof(buf)-1, f)) + *buf = 0; fclose (f); /* Wait for the child to die. */ diff --git a/driver/timers.c b/driver/timers.c index 1f432142..f64190bc 100644 --- a/driver/timers.c +++ b/driver/timers.c @@ -331,6 +331,16 @@ reset_timers (saver_info *si) if (si->cycle_id) abort (); /* no cycle timer when inactive */ si->last_activity_time = time ((time_t *) 0); + + /* This will (hopefully, supposedly) tell the server to re-set its + DPMS timer. Without this, the -deactivate clientmessage would + prevent xscreensaver from blanking, but would not prevent the + monitor from powering down. */ + XForceScreenSaver (si->dpy, ScreenSaverReset); + + /* And if the monitor is already powered off, turn it on. + You'd think the above would do that, but apparently not? */ + monitor_power_on (si); } diff --git a/driver/windows.c b/driver/windows.c index e9891af7..e6ca0bf5 100644 --- a/driver/windows.c +++ b/driver/windows.c @@ -30,7 +30,7 @@ #endif /* HAVE_UNAME */ #include -#include /* for CARD32 */ +/* #include / * for CARD32 */ #include #include /* for XSetClassHint() */ #include @@ -39,6 +39,13 @@ #include #include +/* You might think that to store an array of 32-bit quantities onto a + server-side property, you would pass an array of 32-bit data quantities + into XChangeProperty(). You would be wrong. You have to use an array + of longs, even if long is 64 bits (using 32 of each 64.) + */ +typedef long PROP32; + #ifdef HAVE_MIT_SAVER_EXTENSION # include #endif /* HAVE_MIT_SAVER_EXTENSION */ @@ -966,16 +973,16 @@ store_saver_id (saver_screen_info *ssi) void store_saver_status (saver_info *si) { - CARD32 *status; + PROP32 *status; int size = si->nscreens + 2; int i; - status = (CARD32 *) calloc (size, sizeof(CARD32)); + status = (PROP32 *) calloc (size, sizeof(PROP32)); - status[0] = (CARD32) (si->screen_blanked_p + status[0] = (PROP32) (si->screen_blanked_p ? (si->locked_p ? XA_LOCK : XA_BLANK) : 0); - status[1] = (CARD32) si->blank_time; + status[1] = (PROP32) si->blank_time; for (i = 0; i < si->nscreens; i++) { diff --git a/driver/xscreensaver-command.c b/driver/xscreensaver-command.c index 6c039fb2..a74b0c1b 100644 --- a/driver/xscreensaver-command.c +++ b/driver/xscreensaver-command.c @@ -23,7 +23,7 @@ # include #endif -#include /* for CARD32 */ +/* #include / * for CARD32 */ #include #include #include /* for XGetClassHint() */ @@ -31,6 +31,14 @@ #include /* only needed to get through xscreensaver.h */ + +/* You might think that to read an array of 32-bit quantities out of a + server-side property, you would pass an array of 32-bit data quantities + into XGetWindowProperty(). You would be wrong. You have to use an array + of longs, even if long is 64 bits (using 32 of each 64.) + */ +typedef long PROP32; + #include "remote.h" #include "version.h" @@ -325,7 +333,7 @@ watch (Display *dpy) Window window = RootWindow (dpy, 0); XWindowAttributes xgwa; XEvent event; - CARD32 *last = 0; + PROP32 *last = 0; if (v) free (v); XGetWindowAttributes (dpy, window, &xgwa); @@ -357,7 +365,7 @@ watch (Display *dpy) char *s; Bool changed = False; Bool running = False; - CARD32 *data = (CARD32 *) dataP; + PROP32 *data = (PROP32 *) dataP; if (type != XA_INTEGER || nitems < 3) { diff --git a/driver/xscreensaver-demo.glade2 b/driver/xscreensaver-demo.glade2 index 07861e58..92078445 100644 --- a/driver/xscreensaver-demo.glade2 +++ b/driver/xscreensaver-demo.glade2 @@ -814,6 +814,48 @@ Installed tab + + + + True + Very few (or no) screen savers appear to be available. + +This probably means that the "xscreensaver-extras" and +"xscreensaver-gl-extras" packages are not installed. + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 0 + 0 + + + False + True + + + + + + True + nothing + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + tab + + diff --git a/driver/xscreensaver-getimage-desktop b/driver/xscreensaver-getimage-desktop index 40c6173c..158dea09 100755 --- a/driver/xscreensaver-getimage-desktop +++ b/driver/xscreensaver-getimage-desktop @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# Copyright © 2003 Jamie Zawinski . +# Copyright © 2003, 2005 Jamie Zawinski . # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that @@ -34,7 +34,7 @@ use diagnostics; use strict; my $progname = $0; $progname =~ s@.*/@@g; -my $version = q{ $Revision: 1.2 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; +my $version = q{ $Revision: 1.3 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; my @grabber = ("screencapture", "-x"); my @converter = ("pdf2jpeg"); @@ -101,22 +101,45 @@ sub grab_image { } } - # Convert the PDF to a JPEG + # On MacOS 10.3, "screencapture -x" always wrote a PDF. + # On 10.4.2, it writes a PNG by default, and the output format can be + # changed with the new "-t" argument. + # + # So, for maximal compatibility, we run it without "-t", but look at + # the first few bytes to see if it's a PDF, and if it is, convert it + # to a JPEG first. Otherwise, we assume that whatever screencapture + # wrote is a file format that xscreensaver-getimage-file can already + # cope with (though it will have the extension ".pdf", regardless of + # what is actually in the file). + # + my $pdf_p = 0; { - my $jpgfile = $tmpfile; - $jpgfile =~ s/\.[^.]+$//; - $jpgfile .= ".jpg"; - - @cmd = (@converter, $tmpfile, $jpgfile); - push @cmd, "--verbose" if ($verbose); - - print STDERR "$progname: executing \"" . join(' ', @cmd) . "\"\n" - if ($verbose); - system (@cmd); - unlink $tmpfile; - $tmpfile = $jpgfile; + local *IN; + open (IN, "<$tmpfile") || error ("$tmpfile: $!"); + my $buf = ''; + read (IN, $buf, 10); + close IN; + $pdf_p = ($buf =~ m/^%PDF-/s); } + # If it's a PDF, convert it to a JPEG. + # + if ($pdf_p) + { + my $jpgfile = $tmpfile; + $jpgfile =~ s/\.[^.]+$//; + $jpgfile .= ".jpg"; + + @cmd = (@converter, $tmpfile, $jpgfile); + push @cmd, "--verbose" if ($verbose); + + print STDERR "$progname: executing \"" . join(' ', @cmd) . "\"\n" + if ($verbose); + system (@cmd); + unlink $tmpfile; + $tmpfile = $jpgfile; + } + @st = stat($tmpfile); $size = (@st ? $st[7] : 0); if ($size <= 2048) { diff --git a/driver/xscreensaver-getimage.c b/driver/xscreensaver-getimage.c index 174bfd97..24c0246e 100644 --- a/driver/xscreensaver-getimage.c +++ b/driver/xscreensaver-getimage.c @@ -136,6 +136,7 @@ ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error) return 0; } +#ifndef USE_EXTERNAL_SCREEN_GRABBER static int ignore_badmatch_ehandler (Display *dpy, XErrorEvent *error) { @@ -144,6 +145,7 @@ ignore_badmatch_ehandler (Display *dpy, XErrorEvent *error) else return x_ehandler (dpy, error); } +#endif /* ! USE_EXTERNAL_SCREEN_GRABBER */ /* Returns True if the given Drawable is a Window; False if it's a Pixmap. @@ -295,6 +297,7 @@ compute_image_scaling (int src_w, int src_h, If out of memory, returns False, and the XImage will have been destroyed and freed. */ +#ifndef USE_EXTERNAL_SCREEN_GRABBER static Bool scale_ximage (Screen *screen, Visual *visual, XImage *ximage, int new_width, int new_height) @@ -342,6 +345,7 @@ scale_ximage (Screen *screen, Visual *visual, return True; } +#endif /* ! USE_EXTERNAL_SCREEN_GRABBER */ #ifdef HAVE_GDK_PIXBUF @@ -1197,7 +1201,8 @@ get_filename_1 (Screen *screen, const char *directory, grab_type type, close (out); /* don't need this one */ *buf = 0; - fgets (buf, sizeof(buf)-1, f); + if (! fgets (buf, sizeof(buf)-1, f)) + *buf = 0; fclose (f); /* Wait for the child to die. */ diff --git a/driver/xscreensaver-text b/driver/xscreensaver-text index 52f9f577..4449f9c9 100755 --- a/driver/xscreensaver-text +++ b/driver/xscreensaver-text @@ -24,7 +24,7 @@ use Text::Wrap qw(wrap); use bytes; my $progname = $0; $progname =~ s@.*/@@g; -my $version = q{ $Revision: 1.5 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; +my $version = q{ $Revision: 1.6 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; my $verbose = 0; my $http_proxy = undef; @@ -282,7 +282,8 @@ sub output() { } elsif ($text_mode eq 'program') { - $text_program = which ($text_program); + my ($prog, $args) = ($text_program =~ m/^([^\s]+)(.*)$/); + $text_program = which ($prog) . $args; print STDERR "$progname: running $text_program\n" if ($verbose); if ($wrap_columns && $wrap_columns > 0) { diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c index 058dd86c..cb41a494 100644 --- a/driver/xscreensaver.c +++ b/driver/xscreensaver.c @@ -1598,10 +1598,12 @@ clientmessage_response (saver_info *si, Window w, Bool error, static void bogus_clientmessage_warning (saver_info *si, XEvent *event) { + saver_preferences *p = &si->prefs; char *str = XGetAtomName_safe (si->dpy, event->xclient.message_type); Window w = event->xclient.window; char wdesc[255]; int screen = 0; + Bool root_p = False; *wdesc = 0; for (screen = 0; screen < si->nscreens; screen++) @@ -1613,9 +1615,19 @@ bogus_clientmessage_warning (saver_info *si, XEvent *event) else if (w == RootWindow (si->dpy, screen)) { strcpy (wdesc, "root"); + root_p = True; break; } + /* If this ClientMessage was sent to the real root window instead of to the + xscreensaver window, then it might be intended for someone else who is + listening on the root window (e.g., the window manager). So only print + the warning if: we are in debug mode; or if the bogus message was + actually sent to one of the xscreensaver-created windows. + */ + if (root_p && !p->debug_p) + return; + if (!*wdesc) { XErrorHandler old_handler; diff --git a/driver/xscreensaver.man b/driver/xscreensaver.man index 26e9808a..9484831f 100644 --- a/driver/xscreensaver.man +++ b/driver/xscreensaver.man @@ -796,6 +796,14 @@ Name=XScreensaver Type=Application X-KDE-StartupNotify=false .EE +.TP 3 +\fB4: Make the various "lock session" buttons call xscreensaver.\fP +Replace the file \fI/usr/bin/kdesktop_lock\fP with these two lines: +.EX +#!/bin/sh +xscreensaver-command -lock +.EE +Make sure the file is executable (chmod a+x). .RE .PP Now use xscreensaver normally, controlling it via the usual diff --git a/hacks/Makefile.in b/hacks/Makefile.in index 18d031b4..0e5fde95 100644 --- a/hacks/Makefile.in +++ b/hacks/Makefile.in @@ -108,7 +108,7 @@ SRCS = attraction.c blitspin.c bouboule.c braid.c bubbles.c \ mismunch.c pacman.c pacman_ai.c pacman_level.c \ fuzzyflakes.c anemotaxis.c memscroller.c substrate.c \ intermomentary.c fireworkx.c fireworkx_mmx.S fiberlamp.c \ - boxfit.c interaggregate.c + boxfit.c interaggregate.c celtic.c SCRIPTS = vidwhacker webcollage ljlatest OBJS = attraction.o blitspin.o bouboule.o braid.o bubbles.o \ @@ -138,7 +138,7 @@ OBJS = attraction.o blitspin.o bouboule.o braid.o bubbles.o \ mismunch.o pacman.o pacman_ai.o pacman_level.o \ fuzzyflakes.o anemotaxis.o memscroller.o substrate.o \ intermomentary.o fireworkx.o fiberlamp.o boxfit.o \ - interaggregate.o + interaggregate.o celtic.o NEXES = attraction blitspin bouboule braid bubbles decayscreen deco \ drift flag flame forest vines galaxy grav greynetic halo \ @@ -147,7 +147,7 @@ NEXES = attraction blitspin bouboule braid bubbles decayscreen deco \ penrose pyro qix rocks rorschach sierpinski slidescreen \ slip sphere spiral strange swirl goop starfish munch \ fadeplot rd-bomb coral mountain triangle lissie worm rotor \ - ant xjack xlyap jigsaw cynosure moire2 flow epicycle \ + xjack xlyap jigsaw cynosure moire2 flow epicycle \ interference truchet bsod crystal discrete distort kumppa \ demon loop t3d penetrate deluxe compass squiral xflame \ wander spotlight critical phosphor xmatrix petri shadebobs \ @@ -159,6 +159,7 @@ NEXES = attraction blitspin bouboule braid bubbles decayscreen deco \ fontglide apple2 xanalogtv pong wormhole mismunch \ pacman fuzzyflakes anemotaxis memscroller substrate \ intermomentary fireworkx fiberlamp boxfit interaggregate \ + celtic \ @JPEG_EXES@ SEXES = sonar JPEG_EXES = webcollage-helper @@ -176,7 +177,7 @@ XDBE_OBJS = $(UTILS_BIN)/xdbe.o HDRS = bubbles.h screenhack.h xlockmore.h xlockmoreI.h automata.h \ bumps.h xpm-pixmap.h apple2.h analogtv.h \ pacman.h pacman_ai.h pacman_level.h -MEN = anemone.man ant.man apollonian.man attraction.man \ +MEN = anemone.man apollonian.man attraction.man \ blaster.man blitspin.man bouboule.man braid.man bsod.man \ bubbles.man bumps.man ccurve.man compass.man coral.man \ critical.man crystal.man cynosure.man decayscreen.man \ @@ -206,7 +207,7 @@ MEN = anemone.man ant.man apollonian.man attraction.man \ wormhole.man mismunch.man pacman.man fuzzyflakes.man \ anemotaxis.man memscroller.man substrate.man \ intermomentary.man fireworkx.man fiberlamp.man boxfit.man \ - interaggregate.man + interaggregate.man celtic.man STAR = * EXTRAS = README Makefile.in xlock_23.h xml2man.pl .gdbinit \ euler2d.tex \ @@ -842,6 +843,9 @@ boxfit: boxfit.o $(HACK_OBJS) $(COL) $(GRAB) ifs: ifs.o $(HACK_OBJS) $(COL) $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS) +celtic: celtic.o $(HACK_OBJS) $(COL) $(ERASE) + $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS) + # The rules for those hacks which follow the `xlockmore' API. # @@ -1086,6 +1090,8 @@ bumps.o: ../config.h bumps.o: $(srcdir)/screenhack.h ccurve.o: ../config.h ccurve.o: $(srcdir)/screenhack.h +celtic.o: ../config.h +celtic.o: $(srcdir)/screenhack.h cloudlife.o: ../config.h cloudlife.o: $(srcdir)/screenhack.h compass.o: ../config.h diff --git a/hacks/apple2-main.c b/hacks/apple2-main.c index 12fe95f3..3beeeeea 100644 --- a/hacks/apple2-main.c +++ b/hacks/apple2-main.c @@ -1507,17 +1507,17 @@ struct basic_controller_data { */ static char *moire_program[]={ "10 HGR2\n", - "20 FOR Y = 0 TO 191 STEP 2\n", + "20 FOR Y = 0 TO 190 STEP 2\n", "30 HCOLOR=4 : REM BLACK\n", - "40 HLINE 0,191-Y TO 279,Y\n", + "40 HPLOT 0,191-Y TO 279,Y\n", "60 HCOLOR=7 : REM WHITE\n", - "80 HLINE 0,190-Y TO 279,Y+1\n", + "80 HPLOT 0,190-Y TO 279,Y+1\n", "90 NEXT Y\n", - "100 FOR X = 0 TO 279 STEP 3\n", + "100 FOR X = 0 TO 278 STEP 3\n", "110 HCOLOR=4\n", - "120 HLINE 279-X,0 TO X,192\n", + "120 HPLOT 279-X,0 TO X,191\n", "140 HCOLOR=7\n", - "150 HLINE 278-X,0 TO X+1,192\n", + "150 HPLOT 278-X,0 TO X+1,191\n", "160 NEXT X\n", NULL }; @@ -1527,9 +1527,9 @@ static char *sinewave_program[] = { "25 K=0\n", "30 FOR X = 0 TO 279\n", "32 HCOLOR= 0\n", - "35 HLINE X,0 TO X,159\n", + "35 HPLOT X,0 TO X,159\n", "38 HCOLOR= 3\n", - "40 Y = 80 + SIN(15*(X-K)/279)\n", + "40 Y = 80 + SIN(15*(X-K)/279) * 40\n", "50 HPLOT X,Y\n", "60 NEXT X\n", "70 K=K+4\n", @@ -1551,13 +1551,13 @@ static char *random_lores_program[]={ "100 COLOR= RND(1)*16\n", "110 X=RND(1)*40\n", - "120 Y1=RND(1)*48\n", - "130 Y2=RND(1)*48\n", + "120 Y1=RND(1)*40\n", + "130 Y2=RND(1)*40\n", "140 FOR Y = Y1 TO Y2\n", "150 PLOT X,Y\n", "160 NEXT Y\n", - "210 Y=RND(1)*48\n", + "210 Y=RND(1)*40\n", "220 X1=RND(1)*40\n", "230 X2=RND(1)*40\n", "240 FOR X = X1 TO X2\n", diff --git a/hacks/celtic.c b/hacks/celtic.c new file mode 100644 index 00000000..deb3f332 --- /dev/null +++ b/hacks/celtic.c @@ -0,0 +1,1032 @@ +/* celtic, Copyright (c) 2005 Max Froumentin + * + * 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. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#include +#include +#include "screenhack.h" +#include "erase.h" + +#define SQRT3_2 .86602540378443864676 + +/*-----------------------------------------*/ +Display *dpy; +Window window; +int ncolors; +XColor *colors; +GC gc,shadow_gc,gc_graph; + +struct params { + unsigned long curve_width, shadow_width; + double shape1, shape2; + unsigned long margin; + + enum graph_type { polar, grid, kennicott, triangle } type; + unsigned long edge_size; + unsigned long cluster_size; /* only used if type is kennicott */ + unsigned long delay; /* controls curve drawing speed (step delay + * in microsecs) */ + unsigned long nb_orbits; /* only used if type is polar */ + unsigned long nb_nodes_per_orbit; /* only used if type is polar */ + + double angle; /* angle of rotation of the graph around the centre */ +} params; + + +/*-----------------------------------------*/ +typedef enum direction { + CLOCKWISE=0, ANTICLOCKWISE=1 +} Direction; + + +/*-----------------------------------------*/ +typedef struct array { + int nb_elements; + int nb_allocated_elements; + int increment; + void **elements; +} *Array; + +static Array array_new(int increment) +{ + Array new; + assert(new=(Array)calloc(1,sizeof(struct array))); + new->nb_elements=0; + new->nb_allocated_elements=0; + new->increment=increment; + return new; +} + +static void array_del(Array a, void (*free_element)(void*)) +{ + int i; + if (free_element) + for (i=0;inb_elements;i++) + free_element(a->elements[i]); + free(a->elements); + free(a); +} + +static void array_add_element(Array a, void *element) +{ + if (a->nb_elements == a->nb_allocated_elements) { + /* we must allocate more */ + a->nb_allocated_elements+=a->increment; + a->elements=realloc(a->elements,a->nb_allocated_elements*sizeof(void *)); + } + a->elements[a->nb_elements++]=element; +} +/*-----------------------------------------*/ + +typedef struct node { + double x,y; + Array edges; +} *Node; + +typedef struct edge { + Node node1, node2; + double angle1, angle2; +} *Edge; + +/*-----------------------------------------*/ +/* Node functions */ + +static Node node_new(double x, double y) +{ + Node new; + assert(new = (Node)calloc(1,sizeof(struct node))); + new->x=x; + new->y=y; + new->edges = array_new(10); + return new; +} + +static void node_del(void *n) +{ /* not Node * because the function is passed to array_del */ + array_del(((Node)n)->edges,NULL); + free(n); +} + +#if 0 +static void node_to_s(Node n, FILE *f) +{ + fprintf(f,"Node: %g %g\n",n->x,n->y); +} +#endif + +static void node_draw(Node n) +{ + XDrawArc(dpy,window,gc_graph,(int)rint(n->x)-5,(int)rint(n->y)-5,10,10,0,360*64); +} + +static void node_add_edge(Node n, Edge e) +{ + array_add_element(n->edges,e); +} + + +/*-----------------------------------------*/ +/* Edge functions */ + +static Edge edge_new(Node n1, Node n2) +{ + Edge new; + assert(new = (Edge)calloc(1,sizeof(struct edge))); + new->node1=n1; + new->node2=n2; + new->angle1=atan2(new->node2->y - new->node1->y, new->node2->x - new->node1->x); + if (new->angle1 < 0) new->angle1+=6.28; + + new->angle2=atan2(new->node1->y - new->node2->y, new->node1->x - new->node2->x); + if (new->angle2 < 0) new->angle2+=6.28; + return new; +} + +static void edge_del(void *e) /* not Edge * because the function is passed to array_del */ +{ + free(e); +} + +#if 0 +static void edge_to_s(Edge e, FILE *f) +{ + fprintf(f,"Edge: (%g, %g), (%g, %g) angles: %g, %g\n", + e->node1->x, e->node1->y, e->node2->x, e->node2->y, + e->angle1, e->angle2); +} +#endif + +static void edge_draw(Edge e) +{ + XDrawLine(dpy,window,gc_graph, e->node1->x, e->node1->y, e->node2->x, e->node2->y); +} + +static double edge_angle(Edge e, Node n) +{ + /* returns the angle of the edge at Node n */ + assert(n==e->node1 || n==e->node2); + if (n==e->node1) return e->angle1; else return e->angle2; +} + +static Node edge_other_node(Edge e, Node n) +{ + assert(n==e->node1 || n==e->node2); + if (n==e->node1) return e->node2; else return e->node1; +} + +static double edge_angle_to(Edge e, Edge e2, Node node, Direction direction) +{ + /* returns the absolute angle from this edge to "edge2" around + "node" following "direction" */ + double a; + + if (direction==CLOCKWISE) + a=edge_angle(e,node) - edge_angle(e2,node); + else + a=edge_angle(e2,node) - edge_angle(e,node); + + if (a<0) return a+2*M_PI; else return a; +} + +/*-----------------------------------------*/ + +typedef struct graph { + Array nodes; + Array edges; +} *Graph; + +static Graph graph_new(void) +{ + Graph new; + assert(new = (Graph)calloc(1,sizeof(struct graph))); + new->nodes = array_new(100); + new->edges = array_new(100); + return new; +} + +static void graph_del(Graph g) +{ + array_del(g->nodes, &node_del); + array_del(g->edges, &edge_del); + free(g); +} + + +static void graph_add_node(Graph g, Node n) +{ + array_add_element(g->nodes, n); +} + +static void graph_add_edge(Graph g, Edge e) +{ + array_add_element(g->edges, e); + + /* for each node n of e, add n to pointer e */ + node_add_edge(e->node1, e); + node_add_edge(e->node2, e); +} + +static Edge graph_next_edge_around(Graph g, Node n, Edge e, Direction direction) +{ + /* return the next edge after e around node n clockwise */ + double angle, minangle=20; + Edge next_edge = e, edge; + int i; + + for (i=0;iedges->nb_elements;i++) { + edge=n->edges->elements[i]; + if (edge != e) { + angle = edge_angle_to(e,edge,n,direction); + if (angle < minangle) { + next_edge=edge; + minangle=angle; + } + } + } + return next_edge; +} + +#if 0 +static void graph_to_s(Graph g, FILE *f) +{ + int i; + for (i=0;inodes->nb_elements;i++) + node_to_s(g->nodes->elements[i],f); + for (i=0;iedges->nb_elements;i++) + edge_to_s(g->edges->elements[i],f); +} +#endif + +static void graph_draw(Graph g) +{ + int i; + + for (i=0;inodes->nb_elements;i++) + node_draw(g->nodes->elements[i]); + for (i=0;iedges->nb_elements;i++) + edge_draw(g->edges->elements[i]); + XSync(dpy,False); +} + +static void graph_rotate(Graph g, double angle, int cx, int cy) +{ + /* rotate all the nodes of the graph around the centre */ + int i; + float c=cos(angle),s=sin(angle),x,y; + Node n; + for (i=0;inodes->nb_elements;i++) { + n=g->nodes->elements[i]; + x=n->x; y=n->y; + n->x = (x-cx)*c-(y-cy)*s + cx; + n->y = (x-cx)*s+(y-cy)*c + cy; + } +} + + +/*---------------------------*/ + +static Graph make_polar_graph(int xmin, int ymin, int width, int height, + int nbp, /* number of points on each orbit */ + int nbo /* number of orbits */) + /* make a simple grid graph, with edges present or absent randomly */ +{ + int cx = width/2+xmin, cy=height/2+ymin; /* centre */ + int os = (widthsegments=array_new(30); + new->color=color; + return new; +} + +static void spline_del(void *s) +{ + array_del(((Spline)s)->segments,&free); + free(s); +} + +static void spline_add_segment(Spline s, + double x1, double y1, double x2, double y2, + double x3, double y3, double x4, double y4) +{ + SplineSegment ss=(SplineSegment)calloc(1,sizeof(struct spline_segment)); + ss->x1=x1; ss->x2=x2; ss->x3=x3; ss->x4=x4; + ss->y1=y1; ss->y2=y2; ss->y3=y3; ss->y4=y4; + array_add_element(s->segments,ss); +} + +#if 0 +static void spline_to_s(Spline s, FILE *f) +{ + int i; + SplineSegment ss; + fprintf(f,"Spline: \n"); + for (i=0;isegments->nb_elements;i++) { + ss=s->segments->elements[i]; + fprintf(f," - segment %d: (%g, %g),(%g, %g),(%g, %g),(%g, %g)\n", + i,ss->x1,ss->y1,ss->x2,ss->y2,ss->x3,ss->y3,ss->x4,ss->y4); + } +} +#endif + +static void spline_value_at(Spline s, double *x, double *y, double t, int *segment) +{ + int si; + double tt; + SplineSegment ss; + si = floor(t*s->segments->nb_elements); + tt = t*s->segments->nb_elements - si; + assert(tt>=0 && tt<1); + ss=s->segments->elements[si]; + + *x = ss->x1*(1-tt)*(1-tt)*(1-tt)+3*ss->x2*tt*(1-tt)*(1-tt)+3*ss->x3*tt*tt*(1-tt)+ss->x4*tt*tt*tt; + *y = ss->y1*(1-tt)*(1-tt)*(1-tt)+3*ss->y2*tt*(1-tt)*(1-tt)+3*ss->y3*tt*tt*(1-tt)+ss->y4*tt*tt*tt; + + *segment=si; +} + +/*---------------------------*/ +typedef struct edge_couple { + int **array; + int size; +} *EdgeCouple; + +static EdgeCouple edge_couple_new(int nb_edges) { + int i; + EdgeCouple new = (EdgeCouple)calloc(1,sizeof(struct edge_couple)); + new->array = (int **)calloc(nb_edges, sizeof(int*)); + new->size = nb_edges; + + for (i=0;iarray[i]=(int *)calloc(2,sizeof(int)); + new->array[i][CLOCKWISE]=0; + new->array[i][ANTICLOCKWISE]=0; + } + return new; +} + +static void edge_couple_del(EdgeCouple e) +{ + int i; + for (i=0;isize;i++) free(e->array[i]); + free(e->array); + free(e); +} + +/*---------------------------*/ + +typedef struct pattern { + double shape1, shape2; + EdgeCouple ec; + Graph graph; + Array splines; + int ncolors; +} *Pattern; + +static Pattern pattern_new(Graph g, int ncolors, double shape1, double shape2) +{ + Pattern new; + assert(new=(Pattern)calloc(1,sizeof(struct pattern))); + new->shape1=shape1; + new->shape2=shape2; + new->graph=g; + new->ec=edge_couple_new(g->edges->nb_elements); + new->splines=array_new(10); + new->ncolors=ncolors; + return new; +} + +static void pattern_del(Pattern p) +{ + edge_couple_del(p->ec); + array_del(p->splines,&spline_del); + free(p); +} + +static void pattern_edge_couple_set(Pattern p, Edge e, Direction d, int value) +{ + int i; + for (i=0;igraph->edges->nb_elements;i++) + if (p->graph->edges->elements[i]==e) { + p->ec->array[i][d]=value; + return; + } +} + +static void pattern_draw_spline_direction(Pattern p, Spline s, + Node node, Edge edge1, Edge edge2, + Direction direction) +{ + double x1=(edge1->node1->x+edge1->node2->x)/2.0; + double y1=(edge1->node1->y+edge1->node2->y)/2.0; + + /* P2 (x2,y2) is the middle point of edge1 */ + double x4=(edge2->node1->x+edge2->node2->x)/2.0; + double y4=(edge2->node1->y+edge2->node2->y)/2.0; + + double alpha=edge_angle_to(edge1,edge2,node,direction)*p->shape1; + double beta=p->shape2; + + double i1x,i1y,i2x,i2y,x2,y2,x3,y3; + + if (direction == ANTICLOCKWISE) { + /* I1 must stick out to the left of NP1 and I2 to the right of NP4 */ + i1x = alpha*(node->y-y1)+x1; + i1y = -alpha*(node->x-x1)+y1; + i2x = -alpha*(node->y-y4)+x4; + i2y = alpha*(node->x-x4)+y4; + x2 = beta*(y1-i1y) + i1x; + y2 = -beta*(x1-i1x) + i1y; + x3 = -beta*(y4-i2y) + i2x; + y3 = beta*(x4-i2x) + i2y; + } + else { + /* I1 must stick out to the left of NP1 and I2 to the right of NP4 */ + i1x = -alpha*(node->y-y1)+x1; + i1y = alpha*(node->x-x1)+y1; + i2x = alpha*(node->y-y4)+x4; + i2y = -alpha*(node->x-x4)+y4; + x2 = -beta*(y1-i1y) + i1x; + y2 = beta*(x1-i1x) + i1y; + x3 = beta*(y4-i2y) + i2x; + y3 = -beta*(x4-i2x) + i2y; + } + + spline_add_segment(s,x1,y1,x2,y2,x3,y3,x4,y4); +} + +static int pattern_next_unfilled_couple(Pattern p, Edge *e, Direction *d) +{ + int i; + for (i=0;iec->size;i++) { + if (p->ec->array[i][CLOCKWISE]==0) { + *e=p->graph->edges->elements[i]; + *d=CLOCKWISE; + return 1; + } + else if (p->ec->array[i][ANTICLOCKWISE]==0) { + *e=p->graph->edges->elements[i]; + *d=ANTICLOCKWISE; + return 1; + } + } + return 0; +} + +static void pattern_make_curves(Pattern p) +{ + int i; + Edge current_edge, first_edge, next_edge; + Node current_node, first_node; + Direction current_direction, first_direction; + Spline s; + + i=0; + while (pattern_next_unfilled_couple(p, &first_edge, &first_direction)) { + /* start a new loop */ + s=spline_new(random()%(p->ncolors-2)+2); + array_add_element(p->splines, s); + + current_edge=first_edge; + current_node=first_node=current_edge->node1; + current_direction=first_direction; + + do { + pattern_edge_couple_set(p, current_edge, current_direction, 1); + next_edge = graph_next_edge_around(p->graph,current_node,current_edge,current_direction); + + /* add the spline segment to the spline */ + pattern_draw_spline_direction(p,s,current_node, + current_edge,next_edge,current_direction); + + /* cross the edge */ + current_edge = next_edge; + current_node = edge_other_node(next_edge, current_node); + current_direction=1-current_direction; + + } while (current_node!=first_node || current_edge!=first_edge || current_direction!=first_direction); + + if (s->segments->nb_elements==2) /* spline is just one point: remove it */ + p->splines->elements[p->splines->nb_elements-1]=NULL; + + } +} + +static void pattern_animate(Pattern p, unsigned long delay) +{ + double t,t2; + double x,y,x2,y2,x3,y3,x4,y4; + int i,segment,unused; + int ticks = 0; + double step=0.0001; /* TODO: set the step (or the delay) as a + * function of the spline length, so that + * drawing speed is constant + */ + Spline s; + + XSetLineAttributes(dpy,gc,params.curve_width,LineSolid,CapRound,JoinRound); + XSetLineAttributes(dpy,shadow_gc,params.shadow_width,LineSolid,CapRound,JoinRound); + + for (t=0.0;t<1;t+=step) { + for (i=0;isplines->nb_elements;i++) + if ((s=p->splines->elements[i])) { /* skip if one-point spline */ + spline_value_at(s, &x, &y, fmod(t,1.0),&segment); + spline_value_at(s, &x2, &y2, fmod(t+step,1.0),&unused); + + /* look ahead for the shadow segment */ + t2=t+step; + if (t2<=1.0) { + spline_value_at(s, &x3, &y3, fmod(t2,1.0),&unused); + while (t2+step<1.0 && (x3-x2)*(x3-x2)+(y3-y2)*(y3-y2) < params.shadow_width*params.shadow_width) { + t2+=step; + spline_value_at(s, &x3, &y3, fmod(t2,1.0),&unused); + } + + spline_value_at(s, &x4, &y4, fmod(t2+step,1.0),&unused); + + /* draw shadow line */ + XDrawLine(dpy,window,shadow_gc, + (int)rint(x3),(int)rint(y3), + (int)rint(x4),(int)rint(y4)); + } + /* draw line segment */ + if (p->splines->nb_elements==1) + XSetForeground(dpy, gc, colors[segment%(ncolors-3)+2].pixel); + else + XSetForeground(dpy, gc, colors[s->color].pixel); + XDrawLine(dpy,window,gc, + (int)rint(x),(int)rint(y), + (int)rint(x2),(int)rint(y2)); + } + + if (++ticks > 100) { + XSync(dpy,False); + usleep(delay); + screenhack_handle_events (dpy); + ticks = 0; + } + } + + /* at the end we redraw back to remove shadow spillage */ + for (i=0;isplines->nb_elements;i++) { + if ((s=p->splines->elements[i])) { + double offset=step; + XSetForeground(dpy, gc, colors[s->color].pixel); + spline_value_at(s, &x, &y, fmod(t,1.0),&unused); + + spline_value_at(s, &x2, &y2, fmod(t-offset,1.0),&unused); + + while ((x2-x)*(x2-x)+(y2-y)*(y2-y) < params.shadow_width*params.shadow_width) { + offset+=step; + spline_value_at(s, &x2, &y2, fmod(t-offset,1.0),&unused); + } + + XDrawLine(dpy,window,gc, (int)rint(x),(int)rint(y), (int)rint(x2),(int)rint(y2)); + } + } + XSync(dpy,False); +} + +/*======================================================================*/ + +char *progclass = "Celtic"; + +char *defaults[] = { + ".background: black", + ".foreground: grey20", + "*ncolors: 20", + "*delay: 10000", + "*delay2: 5", + "*showGraph: False", + 0 +}; + +XrmOptionDescRec options[] = { + {"-background", ".background", XrmoptionSepArg, 0}, + {"-foreground", ".foreground", XrmoptionSepArg, 0}, + {"-ncolors", ".ncolors", XrmoptionSepArg, 0}, + {"-delay", ".delay", XrmoptionSepArg, 0}, + {"-delay2", ".delay2", XrmoptionSepArg, 0}, + {"-graph", ".showGraph", XrmoptionNoArg, "True"}, + {0, 0, 0, 0} +}; + +#if 0 +static void params_to_s(FILE *f) +{ + switch (params.type) { + case polar: fprintf(f,"type: polar\n"); + fprintf(f,"nb_orbits: %ld\n",params.nb_orbits); + fprintf(f,"nb_nodes_per_orbit: %ld\n",params.nb_nodes_per_orbit); + break; + case grid: fprintf(f,"type: grid\n"); + fprintf(f,"edge_size: %ld\n",params.edge_size); + break; + case triangle: fprintf(f,"type: triangle\n"); + fprintf(f,"edge_size: %ld\n",params.edge_size); + break; + case kennicott: + fprintf(f,"type: kennicott\n"); + fprintf(f,"edge_size: %ld\n",params.edge_size); + fprintf(f,"cluster_size: %ld\n",params.cluster_size); + break; + } + + fprintf(f,"curve width: %ld\n",params.curve_width); + fprintf(f,"shadow width: %ld\n",params.shadow_width); + fprintf(f,"shape1: %g\n",params.shape1); + fprintf(f,"shape2: %g\n",params.shape2); + fprintf(f,"margin: %ld\n",params.margin); + fprintf(f,"angle: %g\n",params.angle); + fprintf(f,"delay: %ld\n",params.delay); +} +#endif + +void screenhack(Display * d, Window w) +{ + XGCValues gcv; + XWindowAttributes xgwa; + Bool showGraph=get_boolean_resource ("showGraph", "Boolean"); + Pattern p; + Graph g; + + dpy=d; window=w; + ncolors = get_integer_resource ("ncolors", "Integer"); + + + XGetWindowAttributes (dpy, window, &xgwa); + assert(colors = (XColor *) calloc (ncolors,sizeof(XColor))); + + if (get_boolean_resource("mono", "Boolean")) + { + MONO: + ncolors = 1; + colors[0].pixel = get_pixel_resource("foreground", "Foreground", + dpy, xgwa.colormap); + } + else + { +#if 0 + make_random_colormap (dpy, xgwa.visual, xgwa.colormap, + colors, &ncolors, True, True, 0, True); +#else + make_smooth_colormap (dpy, xgwa.visual, xgwa.colormap, + colors, &ncolors, True, 0, True); +#endif + if (ncolors < 2) + goto MONO; + else { + colors[0].pixel = get_pixel_resource("foreground", "Foreground", + dpy, xgwa.colormap); + colors[1].pixel = get_pixel_resource("background", "Background", + dpy, xgwa.colormap); + } + } + + + /* graphic context for curves */ + gcv.foreground = colors[0].pixel; + gcv.background = colors[1].pixel; + gcv.line_width = params.curve_width; + gcv.cap_style=CapRound; + gc = XCreateGC (dpy, window, GCForeground|GCBackground|GCLineWidth|GCCapStyle, &gcv); + + /* graphic context for graphs */ + gcv.foreground = colors[0].pixel; + gcv.background = colors[1].pixel; + gc_graph = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv); + + /* graphic context for shadows */ + gcv.foreground = colors[1].pixel; + gcv.line_width = params.shadow_width; + gcv.cap_style=CapRound; + shadow_gc = XCreateGC(dpy, window, GCForeground|GCLineWidth|GCCapStyle, &gcv); + + /*=======================================================*/ + + for (;;) { + + params.curve_width=random()%5+4; + params.shadow_width=params.curve_width+4; + params.shape1=(random()%20)/10.0 -1.0; + params.shape2=(random()%20)/10.0 -1.0; + params.edge_size=10*(random()%5)+20; + params.delay=get_integer_resource("delay", "Delay"); + params.angle=random()%360*2*M_PI/360; + + switch (random()%4) { + case 0: + params.type=grid; + params.margin=(random()%30)*10; + break; + case 1: + params.type=kennicott; + params.edge_size=10*(random()%3)+50; + params.cluster_size=params.edge_size/(2+random()%3)-1; + params.margin=(random()%30)*10; + break; + case 2: + params.type=triangle; + params.margin=(random()%10)*10; + break; + case 3: + params.type=polar; + params.nb_orbits=2+random()%20; + params.nb_nodes_per_orbit=4+random()%20; + params.margin=(random()%10)*20-50; + break; + } + +/* params_to_s(stdout); */ + + /*=======================================================*/ + + + switch (params.type) { + case grid: + g=make_grid_graph(params.margin,params.margin, + xgwa.width-2*params.margin, + xgwa.height-2*params.margin, + params.edge_size); + break; + case kennicott: + g=make_kennicott_graph(params.margin,params.margin, + xgwa.width-2*params.margin, + xgwa.height-2*params.margin, + params.edge_size, + params.cluster_size); + break; + case triangle: + g=make_triangle_graph(params.margin,params.margin, + xgwa.width-2*params.margin, + xgwa.height-2*params.margin, + params.edge_size); + break; + case polar: + g=make_polar_graph(params.margin,params.margin, + xgwa.width-2*params.margin, + xgwa.height-2*params.margin, + params.nb_nodes_per_orbit, + params.nb_orbits); + break; + default: + g=make_grid_graph(params.margin,params.margin, + xgwa.width-2*params.margin, + xgwa.height-2*params.margin, + params.edge_size); + break; + } + + graph_rotate(g,params.angle,xgwa.width/2,xgwa.height/2); + + if (showGraph) + graph_draw(g); + + p=pattern_new(g,ncolors, params.shape1, params.shape2); + pattern_make_curves(p); + pattern_animate(p,params.delay); + + { + int d2 = get_integer_resource("delay2", "Delay2"); + int i; + for (i = 0; i < d2; i++) { + XSync (dpy, False); + screenhack_handle_events (dpy); + sleep(1); + } + } + + pattern_del(p); + graph_del(g); + + erase_full_window(dpy,window); + + /* recolor each time */ + { + int ncolors = get_integer_resource ("ncolors", "Integer"); + if (ncolors > 2) + make_smooth_colormap (dpy, xgwa.visual, xgwa.colormap, + colors, &ncolors, True, 0, True); + } + + } +} diff --git a/hacks/celtic.man b/hacks/celtic.man new file mode 100644 index 00000000..7f564fa9 --- /dev/null +++ b/hacks/celtic.man @@ -0,0 +1,60 @@ +.TH XScreenSaver 1 "" "X Version 11" +.SH NAME +celtic - draws celtic cross-stich patterns +.SH SYNOPSIS +.B ifs +[\-display \fIhost:display.screen\fP] +[\-visual \fIvisual\fP] +[\-window] +[\-root] +[\-delay \fInumber\fP] +[\-delay2 \fInumber\fP] +[\-ncolors \fInumber\fP] +[\-graph \fImode\fP] +.SH DESCRIPTION +The \fIceltic\fP program repeatedly draws random cross-stitch patterns. +.SH OPTIONS +.TP 8 +.B \-visual \fIvisual\fP +Specify which visual to use. Legal values are the name of a visual class, +or the id number (decimal or hex) of a specific visual. +.TP 8 +.B \-window +Draw on a newly-created window. This is the default. +.TP 8 +.B \-root +Draw on the root window. +.TP 8 +.B \-delay \fInumber\fP +Per-frame delay, in microseconds. Default: 10000. +.TP 8 +.B \-delay2 \fInumber\fP +Delay between patterns, in seconds. Default: 5. +.TP 8 +.B \-ncolors \fInumber\fP +Number of colours to use. Default: 20. +.TP 8 +.B \-graph +Whether to render the underlying graph. Default: no. +.SH ENVIRONMENT +.PP +.TP 8 +.B DISPLAY +to get the default host and display number. +.TP 8 +.B XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 2005 by Max Froumentin. 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. No representations are made about the +suitability of this software for any purpose. It is provided "as is" without +express or implied warranty. +.SH AUTHOR +Max Froumentin diff --git a/hacks/compile_axp.com b/hacks/compile_axp.com index 5c9cdb2e..87ed9867 100644 --- a/hacks/compile_axp.com +++ b/hacks/compile_axp.com @@ -17,6 +17,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES-DEFAULT.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUMPS.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CCURVE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CELTIC.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CLOUDLIFE.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) COMPASS.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CORAL.C diff --git a/hacks/compile_decc.com b/hacks/compile_decc.com index 5c9cdb2e..87ed9867 100644 --- a/hacks/compile_decc.com +++ b/hacks/compile_decc.com @@ -17,6 +17,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES-DEFAULT.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUMPS.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CCURVE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CELTIC.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CLOUDLIFE.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) COMPASS.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CORAL.C diff --git a/hacks/config/README b/hacks/config/README index ce3626ff..955f5c1a 100644 --- a/hacks/config/README +++ b/hacks/config/README @@ -4,8 +4,8 @@ a screen saver and locker for the X window system by Jamie Zawinski - version 4.22 - 22-Jun-2005 + version 4.23 + 21-Oct-2005 http://www.jwz.org/xscreensaver/ @@ -60,11 +60,11 @@ The tags and parameters used here are: into the command line (that's what makes it the default.) For example: - + or if "foo" is the default, and must be explicity turned off, - + ----------------------------------------------------------------------- @@ -131,9 +131,9 @@ The tags and parameters used here are: This creates a selection popup menu. - Options should have _arg-set (_arg-unset is not used here.) + Options should have arg-set (arg-unset is not used here.) - One of the menu items (the default) should have no _arg-set. + One of the menu items (the default) should have no arg-set. ----------------------------------------------------------------------- @@ -154,6 +154,37 @@ The tags and parameters used here are: This creates a file entry field (a text field with a "Browse" button next to it.) +----------------------------------------------------------------------- + +
+ [ ... s ... ] + [ ... s ... ] + [ ... s ... ] + [ ... s ... ] + [ ... s ... ] + [ ...
s ... ] + + + A vertical group of widgets/groups. No more than 10 widgets + or groups should be used in a column. + + Since the default alignment of widgets is a column, the + element is only of use inside an
element. + ----------------------------------------------------------------------- <_description> @@ -169,3 +200,8 @@ The tags and parameters used here are: entities are allowed; HTML (and other markup) is not. ----------------------------------------------------------------------- + +If you are DTD-minded, you may also find the included files "xss.dtd" +and "xss.xsd" useful. + +----------------------------------------------------------------------- diff --git a/hacks/config/ant.xml b/hacks/config/ant.xml index 36499dfc..86a38127 100644 --- a/hacks/config/ant.xml +++ b/hacks/config/ant.xml @@ -27,15 +27,15 @@ diff --git a/hacks/config/boxed.xml b/hacks/config/boxed.xml index f3eda095..f4882e3a 100644 --- a/hacks/config/boxed.xml +++ b/hacks/config/boxed.xml @@ -13,6 +13,18 @@ _label="Motion Speed" _low-label="Slow" _high-label="Fast" low="0.001" high="4.0" default="0.5"/> + + + + + +
diff --git a/hacks/config/celtic.xml b/hacks/config/celtic.xml new file mode 100644 index 00000000..7380d46b --- /dev/null +++ b/hacks/config/celtic.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + <_description> +Repeatedly draws random Celtic cross-stitch patterns. +By Max Froumentin. + + diff --git a/hacks/config/cosmos.xml b/hacks/config/cosmos.xml index 90954fc3..87a45bad 100644 --- a/hacks/config/cosmos.xml +++ b/hacks/config/cosmos.xml @@ -1,7 +1,7 @@ - + <_description> Draws fireworks and zooming, fading flares. By Tom Campbell. diff --git a/hacks/config/cube21.xml b/hacks/config/cube21.xml new file mode 100644 index 00000000..0e250f67 --- /dev/null +++ b/hacks/config/cube21.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_description> +Animates a Rubik-like puzzle known as Cube 21 or Square-1. +The rotations are chosen randomly. Requires OpenGL. + +Written by Vasek Potocek. + + diff --git a/hacks/config/glhanoi.xml b/hacks/config/glhanoi.xml new file mode 100644 index 00000000..ec3bb834 --- /dev/null +++ b/hacks/config/glhanoi.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + <_description> +Solves the Towers of Hanoi puzzle. Move N disks from one pole to another, one disk at a time, with no disk ever resting on a disk smaller than itself. +Written by Dave Atkinson. + + diff --git a/hacks/config/hyperball.xml b/hacks/config/hyperball.xml index 4dfeb459..fad730f9 100644 --- a/hacks/config/hyperball.xml +++ b/hacks/config/hyperball.xml @@ -19,31 +19,31 @@ + low="0" high="20" default="0"/> + low="0" high="20" default="3"/> + low="0" high="20" default="5"/> + low="0" high="20" default="10"/> + low="0" high="20" default="0"/> + low="0" high="20" default="0"/>
<_description> Hyperball is to hypercube as dodecahedron is to cube: this displays a 2D projection of the sequence of 3D objects which are the projections -of the 4D analog to the dodecahedron. Technically, it is a "120 cell +of the 4D analog to the dodecahedron. Technically, it is a "120 cell polytope." Written by Joe Keane. See also the "polytopes" hack for a more general version of this diff --git a/hacks/config/hypercube.xml b/hacks/config/hypercube.xml index 3bed1094..67a2f558 100644 --- a/hacks/config/hypercube.xml +++ b/hacks/config/hypercube.xml @@ -17,24 +17,24 @@ + low="0" high="20" default="0"/> + low="0" high="20" default="3"/> + low="0" high="20" default="5"/> + low="0" high="20" default="10"/> + low="0" high="20" default="0"/> + low="0" high="20" default="0"/>
diff --git a/hacks/config/hypertorus.xml b/hacks/config/hypertorus.xml index 1dff4d64..76789cbe 100644 --- a/hacks/config/hypertorus.xml +++ b/hacks/config/hypertorus.xml @@ -18,6 +18,16 @@ arg-set="-solid"/>
- - @@ -95,7 +95,7 @@ _low-label="Yf 0.0" _high-label="1.0" low="0.0" high="1.0" default="0.0"/> - + <_description> XMountains generates realistic-looking fractal terrains of snow-capped diff --git a/hacks/glx/Makefile.in b/hacks/glx/Makefile.in index ba30f691..ba7fb514 100644 --- a/hacks/glx/Makefile.in +++ b/hacks/glx/Makefile.in @@ -101,7 +101,7 @@ SRCS = xscreensaver-gl-helper.c normals.c glxfonts.c \ mirrorblob.c blinkbox.c noof.c polyhedra.c polyhedra-gl.c \ antinspect.c providence.c pinion.c boing.c texfont.c \ carousel.c fliptext.c antmaze.c tangram.c tangram_shapes.c \ - crackberg.c + crackberg.c glhanoi.c cube21.c timetunnel.c juggler3d.c OBJS = xscreensaver-gl-helper.o normals.o glxfonts.o \ atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \ @@ -132,7 +132,7 @@ OBJS = xscreensaver-gl-helper.o normals.o glxfonts.o \ mirrorblob.o blinkbox.o noof.o polyhedra.o polyhedra-gl.o \ antinspect.o providence.o pinion.o boing.o texfont.o \ carousel.o fliptext.o antmaze.o tangram.o tangram_shapes.o \ - crackberg.o + crackberg.o glhanoi.o cube21.o timetunnel.o juggler3d.o GL_EXES = cage gears moebius pipes sproingies stairs superquadrics \ morph3d rubik atlantis lament bubble3d glplanet pulsar \ @@ -144,7 +144,7 @@ GL_EXES = cage gears moebius pipes sproingies stairs superquadrics \ glknots blocktube flipflop antspotlight polytopes \ gleidescope mirrorblob blinkbox noof polyhedra \ antinspect providence pinion boing carousel fliptext \ - antmaze tangram crackberg + antmaze tangram crackberg glhanoi cube21 timetunnel juggler3d GLE_EXES = extrusion GL_UTIL_EXES = xscreensaver-gl-helper HACK_EXES = @GL_EXES@ @GLE_EXES@ @@ -164,7 +164,7 @@ HDRS = atlantis.h bubble3d.h buildlwo.h e_textures.h xpm-ximage.h \ glut_roman.h marching.h rotator.h trackball.h gltrackball.h \ chessmodels.h chessgames.h gllist.h flurry.h tunnel_draw.h \ ants.h polyhedra.h normals.h glxfonts.h texfont.h \ - tangram_shapes.h + tangram_shapes.h cube21-tex.h GL_MEN = atlantis.man boxed.man bubble3d.man cage.man circuit.man \ cubenetic.man dangerball.man engine.man extrusion.man \ flipscreen3d.man gears.man gflux.man glforestfire.man \ @@ -181,7 +181,8 @@ GL_MEN = atlantis.man boxed.man bubble3d.man cage.man circuit.man \ mirrorblob.man blinkbox.man noof.man polyhedra.man \ antinspect.man providence.man pinion.man boing.man \ carousel.man fliptext.man antmaze.man tangram.man \ - crackberg.man + crackberg.man glhanoi.man cube21.man timetunnel.man \ + juggler3d.man MEN = @GL_MEN@ EXTRAS = README Makefile.in dxf2gl.pl starwars.txt @@ -586,8 +587,8 @@ jigglypuff: jigglypuff.o xpm-ximage.o $(HACK_TRACK_OBJS) klein: klein.o $(HACK_TRACK_OBJS) $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS) -hypertorus: hypertorus.o $(HACK_OBJS) - $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS) +hypertorus: hypertorus.o $(HACK_TRACK_OBJS) + $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS) glmatrix: glmatrix.o xpm-ximage.o $(HACK_OBJS) $(CC_HACK) -o $@ $@.o xpm-ximage.o $(HACK_OBJS) $(XPM_LIBS) @@ -607,8 +608,8 @@ flipflop: flipflop.o $(HACK_TRACK_OBJS) antspotlight: antspotlight.o $(HACK_TRACK_GRAB_OBJS) $(CC_HACK) -o $@ $@.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS) -polytopes: polytopes.o $(HACK_OBJS) - $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS) +polytopes: polytopes.o $(HACK_TRACK_OBJS) + $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS) # This one works differently (it's not xlock-like.) # @@ -669,12 +670,26 @@ fliptext: fliptext.o texfont.o $(HACK_OBJS) antmaze: antmaze.o $(HACK_TRACK_OBJS) $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS) -tangram: tangram.o tangram_shapes.o $(HACK_OBJS) - $(CC_HACK) -o $@ $@.o tangram_shapes.o $(HACK_OBJS) $(HACK_LIBS) +TANGRAM_OBJS=tangram_shapes.o glxfonts.o $(HACK_OBJS) +tangram: tangram.o $(TANGRAM_OBJS) + $(CC_HACK) -o $@ $@.o $(TANGRAM_OBJS) $(HACK_LIBS) crackberg: crackberg.o $(HACK_OBJS) $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS) +glhanoi: glhanoi.o $(HACK_TRACK_OBJS) + $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS) + +cube21: cube21.o $(HACK_OBJS) + $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS) + +TIMETUNNEL_OBJS = xpm-ximage.o $(HACK_TRACK_OBJS) +timetunnel: timetunnel.o $(TIMETUNNEL_OBJS) + $(CC_HACK) -o $@ $@.o $(TIMETUNNEL_OBJS) $(XPM_LIBS) + +juggler3d: juggler3d.o $(HACK_TRACK_OBJS) + $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS) + dnalogo: dnalogo.o tube.o normals.o $(HACK_TRACK_OBJS) $(CC_HACK) -o $@ $@.o tube.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS) @@ -746,6 +761,8 @@ cow_horns.o: $(srcdir)/gllist.h cow_tail.o: $(srcdir)/gllist.h cow_udder.o: $(srcdir)/gllist.h crackberg.o: ../../config.h +cube21.o: ../../config.h +cube21.o: $(srcdir)/cube21-tex.h cubenetic.o: ../../config.h cubenetic.o: $(srcdir)/gltrackball.h cubenetic.o: $(srcdir)/rotator.h @@ -828,6 +845,8 @@ glforestfire.o: ../../config.h glforestfire.o: $(HACK_SRC)/images/ground.xpm glforestfire.o: $(HACK_SRC)/images/tree.xpm glforestfire.o: $(srcdir)/xpm-ximage.h +glhanoi.o: ../../config.h +glhanoi.o: $(srcdir)/rotator.h glknots.o: ../../config.h glknots.o: $(srcdir)/gltrackball.h glknots.o: $(srcdir)/rotator.h @@ -865,10 +884,13 @@ glxfonts.o: ../../config.h glxfonts.o: $(srcdir)/glxfonts.h grab-ximage.o: ../../config.h hypertorus.o: ../../config.h +hypertorus.o: $(srcdir)/gltrackball.h jigglypuff.o: ../../config.h jigglypuff.o: $(srcdir)/gltrackball.h jigglypuff.o: $(HACK_SRC)/images/jigglymap.xpm jigglypuff.o: $(srcdir)/xpm-ximage.h +juggler3d.o: ../../config.h +juggler3d.o: $(srcdir)/gltrackball.h klein.o: ../../config.h klein.o: $(srcdir)/gltrackball.h klein.o: $(srcdir)/rotator.h @@ -922,6 +944,7 @@ polyhedra-gl.o: $(srcdir)/rotator.h polyhedra.o: ../../config.h polyhedra.o: $(srcdir)/polyhedra.h polytopes.o: ../../config.h +polytopes.o: $(srcdir)/gltrackball.h providence.o: ../../config.h providence.o: $(srcdir)/gltrackball.h pulsar.o: ../../config.h @@ -975,9 +998,19 @@ superquadrics.o: ../../config.h swim.o: $(srcdir)/atlantis.h swim.o: ../../config.h tangram.o: ../../config.h +tangram.o: $(srcdir)/glxfonts.h tangram.o: $(srcdir)/tangram_shapes.h texfont.o: ../../config.h texfont.o: $(srcdir)/texfont.h +timetunnel.o: ../../config.h +timetunnel.o: $(srcdir)/gltrackball.h +timetunnel.o: $(HACK_SRC)/images/timetunnel0.xpm +timetunnel.o: $(HACK_SRC)/images/timetunnel1.xpm +timetunnel.o: $(HACK_SRC)/images/timetunnel2.xpm +timetunnel.o: $(HACK_SRC)/images/tunnelstar.xpm +timetunnel.o: $(srcdir)/rotator.h +timetunnel.o: $(UTILS_SRC)/images/logo-180.xpm +timetunnel.o: $(srcdir)/xpm-ximage.h toast2.o: $(srcdir)/gllist.h toaster_base.o: $(srcdir)/gllist.h toaster_handle2.o: $(srcdir)/gllist.h diff --git a/hacks/glx/antmaze.c b/hacks/glx/antmaze.c index 4ce50878..8ab835d3 100644 --- a/hacks/glx/antmaze.c +++ b/hacks/glx/antmaze.c @@ -56,21 +56,21 @@ static int noants; static XrmOptionDescRec opts[] = { - {(char *) "-solidmoebius", (char *) ".moebius.solidmoebius", XrmoptionNoArg, (caddr_t) "on"}, - {(char *) "+solidmoebius", (char *) ".moebius.solidmoebius", XrmoptionNoArg, (caddr_t) "off"}, - {(char *) "-noants", (char *) ".moebius.noants", XrmoptionNoArg, (caddr_t) "on"}, - {(char *) "+noants", (char *) ".moebius.noants", XrmoptionNoArg, (caddr_t) "off"} + {"-solidmoebius", ".moebius.solidmoebius", XrmoptionNoArg, "on"}, + {"+solidmoebius", ".moebius.solidmoebius", XrmoptionNoArg, "off"}, + {"-noants", ".moebius.noants", XrmoptionNoArg, "on"}, + {"+noants", ".moebius.noants", XrmoptionNoArg, "off"} }; static argtype vars[] = { - {(caddr_t *) & solidmoebius, (char *) "solidmoebius", (char *) "Solidmoebius", (char *) DEF_SOLIDMOEBIUS, t_Bool}, - {(caddr_t *) & noants, (char *) "noants", (char *) "Noants", (char *) DEF_NOANTS, t_Bool} - + {&solidmoebius, "solidmoebius", "Solidmoebius", DEF_SOLIDMOEBIUS, t_Bool}, + {&noants, "noants", "Noants", DEF_NOANTS, t_Bool} }; + static OptionStruct desc[] = { - {(char *) "-/+solidmoebius", (char *) "select between a SOLID or a NET Moebius Strip"}, - {(char *) "-/+noants", (char *) "turn on/off walking ants"} + {"-/+solidmoebius", "select between a SOLID or a NET Moebius Strip"}, + {"-/+noants", "turn on/off walking ants"} }; ModeSpecOpt moebius_opts = @@ -79,7 +79,7 @@ ModeSpecOpt moebius_opts = #ifdef USE_MODULES ModStruct moebius_description = {"moebius", "init_moebius", "draw_moebius", "release_moebius", - "draw_moebius", "change_moebius", (char *) NULL, &moebius_opts, + "draw_moebius", "change_moebius", NULL, &moebius_opts, 1000, 1, 1, 1, 4, 1.0, "", "draws some ants", 0, NULL}; @@ -113,7 +113,7 @@ typedef struct { #include "ants.h" static GLfloat MaterialRed[] = {0.6, 0.0, 0.0, 1.0}; -static GLfloat MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0}; +/*static GLfloat MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0};*/ static GLfloat MaterialGray8[] = {0.8, 0.8, 0.8, 1.0}; static GLfloat MaterialGray35[] = {0.30, 0.30, 0.30, 1.0}; static GLfloat MaterialGray4[] = {0.40, 0.40, 0.40, 1.0}; @@ -150,6 +150,7 @@ static Bool mySphere(float radius) { return True; } +#if 0 /* silhouette sphere */ static Bool mySphere2(float radius) { GLUquadricObj *quadObj; @@ -162,6 +163,7 @@ static Bool mySphere2(float radius) { return True; } +#endif /* textured sphere */ static Bool mySphereTex(float radius) { @@ -193,7 +195,7 @@ static Bool myCone(float radius) { /* no cone */ static Bool myCone2(float radius) { return True; } -#define ANTCOUNT 4 +#define ANTCOUNT 5 #define PI 3.14157 static int focus = 0; @@ -269,11 +271,11 @@ GLuint checktexture, brushedtexture; double elevator = 0.0; void makeCheckImage(void) { - int i, j, r, c, k; + int i, j; for (i = 0; i < checkImageWidth; i++) { for (j = 0; j < checkImageHeight; j++) { - if((((i&0x8)==0)^((j&0x8))==0)) { + if(((((i&0x8)==0)^((j&0x8)))==0)) { int c = 102 + random()%32; checkers[i][j][0] = c; checkers[i][j][1] = c; @@ -302,7 +304,7 @@ void makeCheckImage(void) { } void makeBrushedImage(void) { - int i, j, r, c, k; + int i, j, c; for(i = 0; i < checkImageWidth; ++i) for(j = 0; j < checkImageHeight; ++j) { @@ -972,6 +974,9 @@ double fadeoutspeed = 0.0; void update_ants(void) { int i; + GLfloat df[4]; + df[0] = df[1] = df[2] = 0.8*fadeout; + df[3] = 1.0; /* fade out */ if(fadeoutspeed < -0.00001) { @@ -985,7 +990,6 @@ void update_ants(void) { fadeout += fadeoutspeed; - GLfloat df[4] = {0.8*fadeout, 0.8*fadeout, 0.8*fadeout, 1.0}; glLightfv(GL_LIGHT0, GL_DIFFUSE, df); glLightfv(GL_LIGHT1, GL_DIFFUSE, df); } @@ -998,7 +1002,6 @@ void update_ants(void) { fadeoutspeed = 0.0; entroducing = 12; } - GLfloat df[4] = {0.8*fadeout, 0.8*fadeout, 0.8*fadeout, 1.0}; glLightfv(GL_LIGHT0, GL_DIFFUSE, df); glLightfv(GL_LIGHT1, GL_DIFFUSE, df); } @@ -1171,10 +1174,12 @@ void update_ants(void) { ideal += Pi; /* compute correction */ - double dt = sign(ideal) * min(fabs(ideal), PI/90.0); - antdirection[i] += dt; - if(antdirection[i] > 2.0*PI) - antdirection[i] = 0.0; + { + double dt = sign(ideal) * min(fabs(ideal), PI/90.0); + antdirection[i] += dt; + if(antdirection[i] > 2.0*PI) + antdirection[i] = 0.0; + } } antposition[i][0] += antvelocity[i] * cos(antdirection[i]); @@ -1183,7 +1188,6 @@ void update_ants(void) { } static void pinit(void) { - int status; glClearDepth(1.0); glClearColor(0.0, 0.0, 0.0, 1.0); diff --git a/hacks/glx/boxed.c b/hacks/glx/boxed.c index e875f0fa..9f7706c6 100644 --- a/hacks/glx/boxed.c +++ b/hacks/glx/boxed.c @@ -1,4 +1,4 @@ -/* thebox --- 3D bouncing balls that explode */ +/* boxed --- 3D bouncing balls that explode */ #if 0 static const char sccsid[] = "@(#)boxed.c 0.9 01/09/26 xlockmore"; @@ -23,6 +23,9 @@ static const char sccsid[] = "@(#)boxed.c 0.9 01/09/26 xlockmore"; * as an OpenGL screensaver for the xscreensaver package. * Lots of hardcoded values still in place. Also, there are some * copy/paste leftovers from the gears hack. opts don't work. + * + * 2005: opts work. added options -balls, -ballsize, -explosion + * */ #include @@ -42,6 +45,9 @@ static const char sccsid[] = "@(#)boxed.c 0.9 01/09/26 xlockmore"; # define boxed_opts xlockmore_opts # define DEF_SPEED "0.5" +# define DEF_BALLS "25" +# define DEF_BALLSIZE "2.0" +# define DEF_EXPLOSION "25.0f" # define DEFAULTS "*delay: 20000 \n" \ "*showFPS: False \n" \ "*wireframe: False \n" @@ -60,14 +66,23 @@ static const char sccsid[] = "@(#)boxed.c 0.9 01/09/26 xlockmore"; #define rnd() (frand(1.0)) GLfloat speed; /* jwz -- overall speed factor applied to all motion */ +int cfg_balls; +GLfloat cfg_ballsize; +GLfloat cfg_explosion; static XrmOptionDescRec opts[] = { {"-speed", ".boxed.speed", XrmoptionSepArg, 0}, + {"-balls", ".boxed.balls", XrmoptionSepArg, 0}, + {"-ballsize", ".boxed.ballsize", XrmoptionSepArg, 0}, + {"-explosion", ".boxed.explosion", XrmoptionSepArg, 0}, }; static argtype vars[] = { {&speed, "speed", "Speed", DEF_SPEED, t_Float}, + {&cfg_balls, "balls", "Balls", DEF_BALLS, t_Int}, + {&cfg_ballsize, "ballsize", "Ball Size", DEF_BALLSIZE, t_Float}, + {&cfg_explosion, "explosion", "Exlosion", DEF_BALLSIZE, t_Float}, }; ModeSpecOpt boxed_opts = {countof(opts), opts, countof(vars), vars, NULL}; @@ -86,12 +101,6 @@ ModStruct boxed_description = { #define TRUE 1 #define FALSE 0 -/* rendering defines */ - - -/* box size */ -#define BOX_SIZE 20.0f - /* camera */ #define CAM_HEIGHT 100.0f #define CAMDISTANCE_MIN 20.0 @@ -103,11 +112,6 @@ ModStruct boxed_description = { #define SPHERE_VERTICES (2+MESH_SIZE*MESH_SIZE*2) #define SPHERE_INDICES ((MESH_SIZE*4 + MESH_SIZE*4*(MESH_SIZE-1))*3) -#define EXPLOSION 10.0f -#define MAXBALLS 50; -#define NUMBALLS 12; -#define BALLSIZE 3.0f; - /* **----------------------------------------------------------------------------- ** Typedefs @@ -169,6 +173,7 @@ typedef struct { float cam_x_speed, cam_z_speed, cam_y_speed; boxed_config config; float tic; + float camtic; vectorf spherev[SPHERE_VERTICES]; GLint spherei[SPHERE_INDICES]; ballman bman; @@ -352,8 +357,8 @@ void createball(ball *newball) newball->dir.z = (0.5-rnd()) * speed; newball->offside = 0; newball->bounced = FALSE; - newball->radius = BALLSIZE; - while (r+g+b < 1.7f ) { + newball->radius = cfg_ballsize; + while (r+g+b < 1.8f ) { newball->color.x = r=rnd(); newball->color.y = g=rnd(); newball->color.z = b=rnd(); @@ -371,7 +376,7 @@ void updateballs(ballman *bman) for (b=0;bnum_balls;b++) { - GLfloat gravity = 0.15f * speed; + GLfloat gravity = 0.30f * speed; /* apply gravity */ bman->balls[b].dir.y -= gravity; @@ -379,10 +384,10 @@ void updateballs(ballman *bman) addvectors(&bman->balls[b].loc,&bman->balls[b].loc,&bman->balls[b].dir); /* boundary check */ if (bman->balls[b].loc.y < bman->balls[b].radius) { /* ball onder bodem? (bodem @ y=0) */ - if ((bman->balls[b].loc.x < -100.0) || - (bman->balls[b].loc.x > 100.0) || - (bman->balls[b].loc.z < -100.0) || - (bman->balls[b].loc.z > 100.0)) { + if ((bman->balls[b].loc.x < -95.0) || + (bman->balls[b].loc.x > 95.0) || + (bman->balls[b].loc.z < -95.0) || + (bman->balls[b].loc.z > 95.0)) { if (bman->balls[b].loc.y < -1000.0) createball(&bman->balls[b]); } else { @@ -513,6 +518,16 @@ void createtrisfromball(triman* tman, vectorf *spherev, GLint *spherei, int ind_ scalevector(&tman->vertices[pos+1],&tman->vertices[pos+1],scale); scalevector(&tman->vertices[pos+2],&tman->vertices[pos+2],scale); + tman->vertices[pos+0].x += avgdir.x; + tman->vertices[pos+0].y += avgdir.y; + tman->vertices[pos+0].z += avgdir.z; + tman->vertices[pos+1].x += avgdir.x; + tman->vertices[pos+1].y += avgdir.y; + tman->vertices[pos+1].z += avgdir.z; + tman->vertices[pos+2].x += avgdir.x; + tman->vertices[pos+2].y += avgdir.y; + tman->vertices[pos+2].z += avgdir.z; + /* bereken nieuwe richting */ scalevector(&tman->tris[i].dir,&avgdir,explosion); dvect.x = (0.1f - 0.2f*rnd()); @@ -540,10 +555,10 @@ void updatetris(triman *t) /* boundary check */ if (t->tris[b].far) continue; if (t->tris[b].loc.y < 0) { /* onder bodem ? */ - if ((t->tris[b].loc.x > -100.0f) & - (t->tris[b].loc.x < 100.0f) & - (t->tris[b].loc.z > -100.0f) & - (t->tris[b].loc.z < 100.0f)) { /* in veld */ + if ((t->tris[b].loc.x > -95.0f) & + (t->tris[b].loc.x < 95.0f) & + (t->tris[b].loc.z > -95.0f) & + (t->tris[b].loc.z < 95.0f)) { /* in veld */ t->tris[b].dir.y = -(t->tris[b].dir.y); t->tris[b].loc.y = -t->tris[b].loc.y; scalevector(&t->tris[b].dir,&t->tris[b].dir,0.80f); /* dampening */ @@ -619,11 +634,14 @@ void freetris(triman *t) */ void setdefaultconfig(boxed_config *config) { - config->numballs = NUMBALLS; + cfg_balls = MAX(3,MIN(40,cfg_balls)); + cfg_ballsize = MAX(1.0f,MIN(5.0f,cfg_ballsize)); + cfg_explosion = MAX(0.0f,MIN(50.0f,cfg_explosion)); + config->numballs = cfg_balls; config->textures = TRUE; config->transparent = FALSE; - config->explosion = 25.0f; - config->ballsize = BALLSIZE; + config->explosion = cfg_explosion; + config->ballsize = cfg_ballsize; config->camspeed = 35.0f; } @@ -902,12 +920,13 @@ static void draw(ModeInfo * mi) glLoadIdentity(); gp->tic += 0.01f; - + gp->camtic += 0.01f + 0.01f * sin(gp->tic * speed); + /* rotate camera around (0,0,0), looking at (0,0,0), up is (0,1,0) */ - dcam = CAMDISTANCE_MIN + (CAMDISTANCE_MAX - CAMDISTANCE_MIN) + (CAMDISTANCE_MAX - CAMDISTANCE_MIN)*cos((gp->tic/CAMDISTANCE_SPEED) * speed); - v1.x = dcam * sin((gp->tic/gp->cam_x_speed) * speed); - v1.z = dcam * cos((gp->tic/gp->cam_z_speed) * speed); - v1.y = CAM_HEIGHT * sin((gp->tic/gp->cam_y_speed) * speed) + 1.02 * CAM_HEIGHT; + dcam = CAMDISTANCE_MIN + (CAMDISTANCE_MAX - CAMDISTANCE_MIN) + (CAMDISTANCE_MAX - CAMDISTANCE_MIN)*cos((gp->camtic/CAMDISTANCE_SPEED) * speed); + v1.x = dcam * sin((gp->camtic/gp->cam_x_speed) * speed); + v1.z = dcam * cos((gp->camtic/gp->cam_z_speed) * speed); + v1.y = CAM_HEIGHT * sin((gp->camtic/gp->cam_y_speed) * speed) + 1.02 * CAM_HEIGHT; gluLookAt(v1.x,v1.y,v1.z,0.0,0.0,0.0,0.0,1.0,0.0); if (!wire) { @@ -1087,8 +1106,11 @@ pinit(ModeInfo * mi) gp->cam_y_speed = 1.0f/((float)gp->config.camspeed/250.0 + rnd()*((float)gp->config.camspeed/250.0)); if (rnd() < 0.5f) gp->cam_x_speed = -gp->cam_x_speed; if (rnd() < 0.5f) gp->cam_z_speed = -gp->cam_z_speed; + + /* define initial cam position */ + gp->tic = gp->camtic = rnd() * 100.0f; - + /* define tex1 (bottom plate) */ gp->tex1 = (char *)malloc(3*width*height*sizeof(GLuint)); texpixels = 256*256; /*width*height;*/ texpixeldata = header_data; diff --git a/hacks/glx/crackberg.c b/hacks/glx/crackberg.c index 1e86dee5..d12f0b30 100644 --- a/hacks/glx/crackberg.c +++ b/hacks/glx/crackberg.c @@ -719,7 +719,7 @@ static void triles_set_visible(cberg_state *cberg, Trile **root, int x, int y) { Trile *parent = NULL, *iter = *root; - int goleft; + int goleft=0; while (iter != NULL) { parent = iter; @@ -999,7 +999,7 @@ static void find_bounds(double y, double *left, double *right, LS *ls, static void mark_visible(cberg_state *cberg) { - double trough, peak, yval, left, right; + double trough, peak, yval, left=0, right=0; double x1,y1, x2,y2, x3,y3, x4,y4; int start, stop, x, y; LS ls[4]; diff --git a/hacks/glx/cube21-tex.h b/hacks/glx/cube21-tex.h new file mode 100644 index 00000000..2d117d2f --- /dev/null +++ b/hacks/glx/cube21-tex.h @@ -0,0 +1,4106 @@ +static const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; + unsigned char pixel_data[128 * 256 * 3]; +} cubetex = { + 128,256,3, + { +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,3,3,3,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7, +6,6,6,5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6, +5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5, +3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,3,3,3, +5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,3,3,3,5,5,5, +5,5,5,6,6,6,7,7,7,6,6,6,4,4,4,2,2,2,2,2,2,0,0,0, +0,0,0,2,2,2,5,5,5,4,4,4,3,3,3,5,5,5,5,5,5,6,6,6, +7,7,7,6,6,6,5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7, +6,6,6,5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6, +5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5, +3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,3,3,3, +5,5,5,5,5,5,6,6,6,6,6,6,5,5,5,3,3,3,1,1,1,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,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,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,0,0,0, +0,0,0,8,8,8,36,36,36,54,54,54,66,66,66,67,67,67,71,71,71,75,75,75, +73,73,73,65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73, +65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65, +60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,60,60,60, +67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,60,60,60,67,67,67, +67,67,67,71,71,71,75,75,75,73,73,73,61,61,61,45,45,45,19,19,19,1,1,1, +1,1,1,20,20,20,54,54,54,61,61,61,60,60,60,67,67,67,67,67,67,71,71,71, +75,75,75,73,73,73,65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75, +73,73,73,65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73, +65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65, +60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,60,60,60, +67,67,67,67,67,67,71,71,71,72,72,72,57,57,57,22,22,22,2,2,2,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,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,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,0,0,0, +0,0,0,24,24,24,112,112,112,169,169,169,186,186,186,190,190,190,191,191,191,194,194,194, +193,193,193,187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193, +187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187, +184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,184,184,184, +187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,184,184,184,187,187,187, +190,190,190,191,191,191,194,194,194,193,193,193,178,178,178,137,137,137,51,51,51,4,4,4, +4,4,4,53,53,53,143,143,143,178,178,178,184,184,184,187,187,187,190,190,190,191,191,191, +194,194,194,193,193,193,187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194, +193,193,193,187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193, +187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187, +184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,184,184,184, +187,187,187,190,190,190,191,191,191,186,186,186,145,145,145,54,54,54,5,5,5,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,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,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,0,0,0, +4,4,4,53,53,53,166,166,166,227,227,227,242,242,242,244,244,244,244,244,244,245,245,245, +245,245,245,242,242,242,243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245, +242,242,242,243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,242,242,242, +243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,242,242,242,243,243,243, +242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,242,242,242,243,243,243,242,242,242, +244,244,244,244,244,244,245,245,245,245,245,245,233,233,233,181,181,181,62,62,62,4,4,4, +4,4,4,63,63,63,183,183,183,233,233,233,243,243,243,242,242,242,244,244,244,244,244,244, +245,245,245,245,245,245,242,242,242,243,243,243,242,242,242,244,244,244,244,244,244,245,245,245, +245,245,245,242,242,242,243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245, +242,242,242,243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,242,242,242, +243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,242,242,242,243,243,243, +242,242,242,244,244,244,244,244,244,236,236,236,187,187,187,71,71,71,6,6,6,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,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,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,1,1,1, +6,6,6,77,77,77,196,196,196,247,247,247,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6, +6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,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,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,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,0,0,0, +20,20,20,120,120,120,216,216,216,250,250,250,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5, +5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,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,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,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,1,1,1, +35,35,35,153,153,153,231,231,231,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,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,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,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,4,4,4, +58,58,58,180,180,180,242,242,242,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,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,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,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,12,12,12, +96,96,96,203,203,203,248,248,248,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,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,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,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,23,23,23, +136,136,136,225,225,225,253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6, +6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,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,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,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,1,1,1,45,45,45, +169,169,169,237,237,237,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4, +4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,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,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,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,6,6,6,73,73,73, +190,190,190,246,246,246,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6, +6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,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,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,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,13,13,13,106,106,106, +212,212,212,248,248,248,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5, +5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,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,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,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,31,31,31,144,144,144, +224,224,224,252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,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,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,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,3,3,3,56,56,56,175,175,175, +240,240,240,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,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,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,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,6,6,6,80,80,80,199,199,199, +247,247,247,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,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,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,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,18,18,18,120,120,120,219,219,219, +252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6, +6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,37,37,37,153,153,153,233,233,233, +253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4, +4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,49,49,49,168,168,168,237,237,237, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6, +6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,1,1,1,4,4,4,64,64,64,184,184,184,243,243,243, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5, +5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,20,20,20,112,112,112,208,208,208,249,249,249, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,1,1,1,38,38,38,155,155,155,231,231,231,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,5,5,5,60,60,60,181,181,181,241,241,241,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,10,10,10,90,90,90,198,198,198,248,248,248,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6, +6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,18,18,18,126,126,126,220,220,220,251,251,251,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4, +4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,1,42,42,42,162,162,162,232,232,232,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6, +6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,5,5,5,72,72,72,191,191,191,247,247,247,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5, +5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,16,16,16,112,112,112,216,216,216,250,250,250,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,31,31,31,151,151,151,231,231,231,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,3,55,55,55,177,177,177,242,242,242,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,6,6,6,77,77,77,196,196,196,246,246,246,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6, +6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,13,13,13,106,106,106,214,214,214,250,250,250,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4, +4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,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,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,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,32,32,32,144,144,144,227,227,227,252,252,252,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6, +6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,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,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,0,0,0,0,0,0,0,0,0,0,0, +4,4,4,56,56,56,173,173,173,239,239,239,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5, +5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,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,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,0,0,0,0,0,0,0,0,0,0,0, +7,7,7,84,84,84,201,201,201,247,247,247,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,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,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,0,0,0,0,0,0,0,0,0,0,0, +23,23,23,129,129,129,219,219,219,252,252,252,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,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,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,0,0,0,0,0,0,0,0,0,0,0, +34,34,34,155,155,155,234,234,234,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,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,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,0,0,0,0,0,0,0,0,4,4,4, +55,55,55,177,177,177,239,239,239,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6, +6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,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,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,0,0,0,0,0,0,0,0,13,13,13, +94,94,94,201,201,201,248,248,248,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4, +4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,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,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,0,0,0,0,0,0,0,0,27,27,27, +132,132,132,223,223,223,251,251,251,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6, +6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,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,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,0,0,0,0,0,1,1,1,35,35,35, +157,157,157,232,232,232,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5, +5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,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,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,0,0,0,0,0,3,3,3,54,54,54, +177,177,177,242,242,242,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,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,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,0,0,0,0,0,12,12,12,97,97,97, +204,204,204,249,249,249,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,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,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,0,0,0,0,0,31,31,31,148,148,148, +230,230,230,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,66,66,66,4,4,4, +5,5,5,65,65,65,181,181,181,233,233,233,243,243,243,245,245,245,245,245,245,244,244,244, +244,244,244,243,243,243,243,243,243,243,243,243,245,245,245,245,245,245,244,244,244,244,244,244, +243,243,243,243,243,243,243,243,243,245,245,245,245,245,245,244,244,244,244,244,244,243,243,243, +243,243,243,243,243,243,245,245,245,245,245,245,244,244,244,244,244,244,243,243,243,243,243,243, +243,243,243,245,245,245,245,245,245,244,244,244,244,244,244,243,243,243,243,243,243,243,243,243, +245,245,245,245,245,245,244,244,244,234,234,234,182,182,182,65,65,65,5,5,5,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,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,0,0,4,4,4,61,61,61,181,181,181, +243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,253,253,253,248,248,248,231,231,231,169,169,169,57,57,57,4,4,4, +4,4,4,51,51,51,138,138,138,177,177,177,187,187,187,193,193,193,194,194,194,191,191,191, +190,190,190,187,187,187,184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190, +187,187,187,184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187, +184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187,184,184,184, +187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187,184,184,184,187,187,187, +193,193,193,194,194,194,191,191,191,181,181,181,140,140,140,50,50,50,4,4,4,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,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,0,0,6,6,6,76,76,76,194,194,194, +246,246,246,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,252,252,252,248,248,248, +246,246,246,237,237,237,225,225,225,202,202,202,173,173,173,111,111,111,27,27,27,1,1,1, +1,1,1,17,17,17,50,50,50,58,58,58,65,65,65,73,73,73,75,75,75,71,71,71, +67,67,67,67,67,67,60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67, +67,67,67,60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67, +60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67,60,60,60, +65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67,60,60,60,65,65,65, +73,73,73,75,75,75,71,71,71,65,65,65,50,50,50,17,17,17,2,2,2,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,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,0,0,11,11,11,102,102,102,210,210,210, +248,248,248,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,253,253,253,252,252,252,245,245,245,236,236,236,221,221,221,210,210,210, +190,190,190,170,170,170,134,134,134,86,86,86,55,55,55,24,24,24,4,4,4,0,0,0, +0,0,0,1,1,1,4,4,4,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6, +5,5,5,5,5,5,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5, +5,5,5,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5, +3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5,3,3,3, +5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5,3,3,3,5,5,5, +6,6,6,7,7,7,6,6,6,5,5,5,4,4,4,1,1,1,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,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,0,0,1,1,1,36,36,36,146,146,146,224,224,224, +252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,249,249,249, +245,245,245,238,238,238,232,232,232,214,214,214,193,193,193,163,163,163,135,135,135,101,101,101, +72,72,72,45,45,45,21,21,21,8,8,8,4,4,4,1,1,1,0,0,0,0,0,0, +0,0,0,2,2,2,4,4,4,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6, +5,5,5,5,5,5,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5, +5,5,5,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5, +3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5,3,3,3, +5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5,3,3,3,5,5,5, +6,6,6,7,7,7,6,6,6,5,5,5,4,4,4,1,1,1,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,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,0,0,4,4,4,65,65,65,182,182,182,242,242,242, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,251,251,251,248,248,248,243,243,243,229,229,229,210,210,210, +189,189,189,172,172,172,149,149,149,115,115,115,72,72,72,40,40,40,25,25,25,12,12,12, +5,5,5,1,1,1,0,0,0,3,3,3,5,5,5,11,11,11,9,9,9,1,1,1, +2,2,2,21,21,21,53,53,53,58,58,58,65,65,65,73,73,73,75,75,75,71,71,71, +67,67,67,67,67,67,60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67, +67,67,67,60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67, +60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67,60,60,60, +65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67,60,60,60,65,65,65, +73,73,73,75,75,75,71,71,71,64,64,64,49,49,49,14,14,14,1,1,1,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,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,8,8,8,88,88,88,205,205,205,248,248,248, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,253,253,253,252,252,252, +248,248,248,246,246,246,232,232,232,220,220,220,200,200,200,185,185,185,151,151,151,105,105,105, +66,66,66,53,53,53,31,31,31,16,16,16,6,6,6,1,1,1,0,0,0,1,1,1, +4,4,4,11,11,11,21,21,21,44,44,44,64,64,64,79,79,79,39,39,39,3,3,3, +3,3,3,50,50,50,139,139,139,176,176,176,187,187,187,193,193,193,194,194,194,191,191,191, +190,190,190,187,187,187,184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190, +187,187,187,184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187, +184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187,184,184,184, +187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187,184,184,184,187,187,187, +193,193,193,194,194,194,191,191,191,184,184,184,140,140,140,51,51,51,4,4,4,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,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,20,20,20,127,127,127,219,219,219,252,252,252, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,252,252,252,250,250,250,244,244,244,236,236,236,221,221,221, +207,207,207,187,187,187,162,162,162,125,125,125,82,82,82,64,64,64,35,35,35,13,13,13, +4,4,4,4,4,4,0,0,0,1,1,1,4,4,4,11,11,11,23,23,23,36,36,36, +60,60,60,91,91,91,128,128,128,159,159,159,178,178,178,154,154,154,54,54,54,3,3,3, +3,3,3,58,58,58,176,176,176,232,232,232,242,242,242,245,245,245,245,245,245,244,244,244, +244,244,244,242,242,242,243,243,243,242,242,242,245,245,245,245,245,245,244,244,244,244,244,244, +242,242,242,243,243,243,242,242,242,245,245,245,245,245,245,244,244,244,244,244,244,242,242,242, +243,243,243,242,242,242,245,245,245,245,245,245,244,244,244,244,244,244,242,242,242,243,243,243, +242,242,242,245,245,245,245,245,245,244,244,244,244,244,244,242,242,242,243,243,243,242,242,242, +245,245,245,245,245,245,244,244,244,234,234,234,181,181,181,67,67,67,5,5,5,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,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,1,1,1,33,33,33,150,150,150,232,232,232,253,253,253, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,253,253,253, +248,248,248,243,243,243,237,237,237,227,227,227,213,213,213,193,193,193,168,168,168,135,135,135, +100,100,100,68,68,68,41,41,41,17,17,17,7,7,7,5,5,5,1,1,1,1,1,1, +3,3,3,8,8,8,18,18,18,35,35,35,57,57,57,91,91,91,128,128,128,156,156,156, +181,181,181,198,198,198,220,220,220,231,231,231,234,234,234,183,183,183,67,67,67,5,5,5, +5,5,5,67,67,67,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,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,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,4,4,4,52,52,52,170,170,170,237,237,237,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,251,251,251,248,248,248,239,239,239,227,227,227, +206,206,206,186,186,186,165,165,165,142,142,142,106,106,106,75,75,75,47,47,47,26,26,26, +13,13,13,5,5,5,1,1,1,0,0,0,3,3,3,7,7,7,19,19,19,33,33,33, +53,53,53,82,82,82,121,121,121,150,150,150,174,174,174,199,199,199,219,219,219,234,234,234, +241,241,241,248,248,248,251,251,251,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5, +5,5,5,67,67,67,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,66,66,66,5,5,5,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,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,8,8,8,81,81,81,192,192,192,245,245,245,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,253,253,253, +252,252,252,247,247,247,244,244,244,232,232,232,222,222,222,199,199,199,178,178,178,144,144,144, +101,101,101,65,65,65,48,48,48,28,28,28,13,13,13,6,6,6,1,1,1,0,0,0, +1,1,1,4,4,4,13,13,13,21,21,21,47,47,47,80,80,80,122,122,122,155,155,155, +176,176,176,197,197,197,217,217,217,229,229,229,239,239,239,247,247,247,252,252,252,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5, +5,5,5,70,70,70,191,191,191,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,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,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,24,24,24,126,126,126,215,215,215,250,250,250,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,252,252,252,248,248,248,244,244,244,237,237,237, +220,220,220,200,200,200,180,180,180,160,160,160,128,128,128,82,82,82,58,58,58,33,33,33, +14,14,14,4,4,4,3,3,3,0,0,0,1,1,1,4,4,4,8,8,8,24,24,24, +42,42,42,65,65,65,99,99,99,134,134,134,166,166,166,195,195,195,222,222,222,230,230,230, +241,241,241,246,246,246,251,251,251,252,252,252,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7, +7,7,7,75,75,75,194,194,194,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,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,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,1,1,1,42,42,42,159,159,159,232,232,232,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +251,251,251,248,248,248,241,241,241,236,236,236,222,222,222,208,208,208,191,191,191,171,171,171, +135,135,135,93,93,93,59,59,59,39,39,39,20,20,20,7,7,7,4,4,4,1,1,1, +1,1,1,4,4,4,8,8,8,20,20,20,33,33,33,52,52,52,81,81,81,126,126,126, +159,159,159,186,186,186,204,204,204,224,224,224,235,235,235,248,248,248,251,251,251,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6, +6,6,6,73,73,73,193,193,193,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,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,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,4,4,4,65,65,65,186,186,186,243,243,243,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,250,250,250,247,247,247,234,234,234, +223,223,223,200,200,200,184,184,184,161,161,161,135,135,135,100,100,100,74,74,74,52,52,52, +28,28,28,11,11,11,3,3,3,1,1,1,0,0,0,4,4,4,6,6,6,13,13,13, +33,33,33,59,59,59,85,85,85,126,126,126,150,150,150,170,170,170,192,192,192,215,215,215, +232,232,232,243,243,243,248,248,248,253,253,253,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5, +5,5,5,65,65,65,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,6,6,6,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,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,13,13,13,99,99,99,204,204,204,248,248,248,254,254,254,254,254,254, +254,254,254,253,253,253,248,248,248,242,242,242,230,230,230,216,216,216,194,194,194,169,169,169, +132,132,132,93,93,93,63,63,63,45,45,45,26,26,26,10,10,10,5,5,5,2,2,2, +0,0,0,1,1,1,3,3,3,14,14,14,27,27,27,53,53,53,74,74,74,104,104,104, +144,144,144,176,176,176,202,202,202,219,219,219,232,232,232,237,237,237,245,245,245,250,250,250, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3, +3,3,3,60,60,60,184,184,184,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,71,71,71,6,6,6,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,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,21,21,21,134,134,134,224,224,224,251,251,251,248,248,248,246,246,246, +237,237,237,225,225,225,202,202,202,181,181,181,153,153,153,120,120,120,77,77,77,54,54,54, +27,27,27,11,11,11,5,5,5,2,2,2,0,0,0,0,0,0,4,4,4,14,14,14, +31,31,31,43,43,43,60,60,60,102,102,102,145,145,145,174,174,174,191,191,191,211,211,211, +224,224,224,240,240,240,248,248,248,252,252,252,253,253,253,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5, +5,5,5,67,67,67,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,2,45,45,45,160,160,160,218,218,218,221,221,221,212,212,212,190,190,190, +170,170,170,136,136,136,96,96,96,59,59,59,35,35,35,20,20,20,6,6,6,4,4,4, +0,0,0,1,1,1,5,5,5,8,8,8,23,23,23,34,34,34,55,55,55,96,96,96, +139,139,139,164,164,164,183,183,183,205,205,205,229,229,229,239,239,239,246,246,246,248,248,248, +252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5, +5,5,5,67,67,67,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,66,66,66,5,5,5,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,6,6,6,64,64,64,142,142,142,156,156,156,137,137,137,103,103,103,73,73,73, +45,45,45,23,23,23,12,12,12,4,4,4,1,1,1,0,0,0,3,3,3,7,7,7, +12,12,12,34,34,34,67,67,67,91,91,91,133,133,133,154,154,154,176,176,176,201,201,201, +224,224,224,233,233,233,243,243,243,248,248,248,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5, +5,5,5,70,70,70,191,191,191,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,8,8,8,47,47,47,56,56,56,40,40,40,26,26,26,13,13,13,5,5,5, +1,1,1,0,0,0,1,1,1,4,4,4,15,15,15,31,31,31,57,57,57,80,80,80, +109,109,109,149,149,149,182,182,182,210,210,210,222,222,222,234,234,234,239,239,239,248,248,248, +251,251,251,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7, +7,7,7,75,75,75,194,194,194,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,3,7,7,7,3,3,3,1,1,1,0,0,0,1,1,1,5,5,5, +11,11,11,21,21,21,39,39,39,66,66,66,108,108,108,150,150,150,179,179,179,196,196,196, +214,214,214,227,227,227,242,242,242,248,248,248,252,252,252,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6, +6,6,6,73,73,73,193,193,193,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,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,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,1,1,1,2,2,2,11,11,11,25,25,25,43,43,43, +74,74,74,112,112,112,148,148,148,180,180,180,209,209,209,228,228,228,241,241,241,246,246,246, +250,250,250,252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5, +5,5,5,65,65,65,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,6,6,6,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,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,1,1,1,2,2,2,10,10,10,24,24,24,45,45,45, +76,76,76,117,117,117,152,152,152,185,185,185,210,210,210,227,227,227,237,237,237,243,243,243, +248,248,248,253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3, +3,3,3,60,60,60,184,184,184,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,71,71,71,6,6,6,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,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,1,1,1,0,0,0,1,1,1,4,4,4, +13,13,13,25,25,25,47,47,47,75,75,75,106,106,106,142,142,142,165,165,165,187,187,187, +206,206,206,227,227,227,237,237,237,248,248,248,251,251,251,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5, +5,5,5,67,67,67,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,1,6,6,6,13,13,13,28,28,28,49,49,49,67,67,67, +104,104,104,143,143,143,173,173,173,199,199,199,223,223,223,232,232,232,242,242,242,249,249,249, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5, +5,5,5,67,67,67,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,66,66,66,5,5,5,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,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,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,3,3,3,5,5,5, +15,15,15,30,30,30,54,54,54,84,84,84,130,130,130,157,157,157,179,179,179,204,204,204, +229,229,229,239,239,239,246,246,246,248,248,248,252,252,252,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5, +5,5,5,70,70,70,191,191,191,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,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,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,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,0,0,0, +1,1,1,0,0,0,4,4,4,8,8,8,24,24,24,35,35,35,57,57,57,100,100,100, +144,144,144,174,174,174,191,191,191,210,210,210,221,221,221,236,236,236,245,245,245,252,252,252, +253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7, +7,7,7,75,75,75,194,194,194,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,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,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,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,0,0,0, +0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,3,3,3,14,14,14, +26,26,26,47,47,47,73,73,73,101,101,101,135,135,135,163,163,163,193,193,193,214,214,214, +231,231,231,237,237,237,245,245,245,250,250,250,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6, +6,6,6,73,73,73,193,193,193,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,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,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,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,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,1,1,1,5,5,5,12,12,12,25,25,25,45,45,45,74,74,74,114,114,114, +146,146,146,171,171,171,191,191,191,213,213,213,230,230,230,242,242,242,248,248,248,253,253,253, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5, +5,5,5,65,65,65,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,6,6,6,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,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,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,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,0,0,0,0,0,0,0,0,0,0,2,2,2,6,6,6,16,16,16, +32,32,32,51,51,51,71,71,71,117,117,117,152,152,152,182,182,182,203,203,203,224,224,224, +235,235,235,247,247,247,249,249,249,252,252,252,253,253,253,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3, +3,3,3,60,60,60,184,184,184,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,71,71,71,6,6,6,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,4,4,4,5,5,5,19,19,19,36,36,36,60,60,60,98,98,98,133,133,133, +165,165,165,191,191,191,214,214,214,223,223,223,236,236,236,245,245,245,251,251,251,252,252,252, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5, +5,5,5,67,67,67,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,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,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,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,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,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,1,1,1,4,4,4,13,13,13,20,20,20, +41,41,41,75,75,75,110,110,110,138,138,138,167,167,167,194,194,194,217,217,217,229,229,229, +236,236,236,243,243,243,249,249,249,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5, +5,5,5,67,67,67,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,66,66,66,5,5,5,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,6,6,6,16,16,16,26,26,26,51,51,51,80,80,80,113,113,113,144,144,144, +162,162,162,184,184,184,208,208,208,230,230,230,241,241,241,248,248,248,251,251,251,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5, +5,5,5,70,70,70,191,191,191,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,7,7,7,14,14,14,31,31,31, +47,47,47,63,63,63,113,113,113,155,155,155,182,182,182,200,200,200,221,221,221,231,231,231, +245,245,245,250,250,250,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7, +7,7,7,75,75,75,194,194,194,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,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,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,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,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,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,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,1,1,1, +3,3,3,4,4,4,20,20,20,39,39,39,62,62,62,92,92,92,128,128,128,159,159,159, +186,186,186,212,212,212,230,230,230,242,242,242,237,237,237,190,190,190,73,73,73,6,6,6, +6,6,6,73,73,73,193,193,193,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,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,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,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,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,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,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,0,0,0, +0,0,0,0,0,0,0,0,0,1,1,1,5,5,5,11,11,11,21,21,21,39,39,39, +67,67,67,108,108,108,150,150,150,179,179,179,188,188,188,157,157,157,57,57,57,4,4,4, +5,5,5,62,62,62,181,181,181,232,232,232,243,243,243,243,243,243,244,244,244,244,244,244, +245,245,245,245,245,245,243,243,243,243,243,243,243,243,243,244,244,244,244,244,244,245,245,245, +245,245,245,243,243,243,243,243,243,243,243,243,244,244,244,244,244,244,245,245,245,245,245,245, +243,243,243,243,243,243,243,243,243,244,244,244,244,244,244,245,245,245,245,245,245,243,243,243, +243,243,243,243,243,243,244,244,244,244,244,244,245,245,245,245,245,245,243,243,243,243,243,243, +243,243,243,244,244,244,244,244,244,236,236,236,187,187,187,71,71,71,6,6,6,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,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,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,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,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,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,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, +4,4,4,15,15,15,31,31,31,58,58,58,76,76,76,76,76,76,33,33,33,2,2,2, +3,3,3,47,47,47,139,139,139,178,178,178,184,184,184,187,187,187,190,190,190,191,191,191, +194,194,194,193,193,193,187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194, +193,193,193,187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193, +187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187, +184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,184,184,184, +187,187,187,190,190,190,191,191,191,186,186,186,145,145,145,54,54,54,5,5,5,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,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,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,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,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,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,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,0,0,0,0,2,2,2,6,6,6,8,8,8,8,8,8,1,1,1, +2,2,2,22,22,22,55,55,55,61,61,61,60,60,60,67,67,67,67,67,67,71,71,71, +75,75,75,73,73,73,65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75, +73,73,73,65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73, +65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65, +60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,60,60,60, +67,67,67,67,67,67,71,71,71,72,72,72,57,57,57,21,21,21,2,2,2,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,2,5,5,5,4,4,4,3,3,3,5,5,5,5,5,5,6,6,6, +7,7,7,6,6,6,5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7, +6,6,6,5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6, +5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5, +3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,3,3,3, +5,5,5,5,5,5,6,6,6,6,6,6,5,5,5,2,2,2,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,5,5,5,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6, +4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4, +6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6, +5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5, +5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5, +5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5, +5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6, +4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4, +6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6, +5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5, +5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5, +5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5, +5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6, +4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,1,1,1, +3,3,3,23,23,23,54,54,54,65,65,65,68,68,68,68,68,68,68,68,68,69,69,69, +65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65, +69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69, +68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68, +68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68, +68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68, +68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68, +69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69, +65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65, +69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69, +68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68, +68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68, +68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68, +68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68, +69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69, +65,65,65,69,69,69,68,68,68,68,68,68,65,65,65,53,53,53,23,23,23,2,2,2, +5,5,5,54,54,54,141,141,141,181,181,181,189,189,189,189,189,189,189,189,189,189,189,189, +189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189, +188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188, +190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190, +189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189, +189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189, +189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189, +189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189, +189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189, +188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188, +190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190, +189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189, +189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189, +189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189, +189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189, +189,189,189,188,188,188,190,190,190,189,189,189,182,182,182,140,140,140,51,51,51,4,4,4, +5,5,5,66,66,66,182,182,182,234,234,234,244,244,244,244,244,244,244,244,244,242,242,242, +245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245, +242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242, +244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244, +244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244, +244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244, +244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244, +242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242, +245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245, +242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242, +244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244, +244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244, +244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244, +244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244, +242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242, +245,245,245,242,242,242,244,244,244,244,244,244,234,234,234,181,181,181,65,65,65,5,5,5, +6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6, +6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6, +6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6, +6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6, +6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5, +5,5,5,65,65,65,181,181,181,234,234,234,244,244,244,244,244,244,244,244,244,243,243,243, +245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245, +243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243, +244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244, +244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244, +244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244, +244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244, +243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243, +245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245, +243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,242,242,242, +242,242,242,242,242,242,243,243,243,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244, +244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244, +244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244, +244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244, +243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243, +245,245,245,243,243,243,244,244,244,244,244,244,234,234,234,182,182,182,65,65,65,5,5,5, +3,3,3,50,50,50,139,139,139,183,183,183,189,189,189,189,189,189,190,190,190,188,188,188, +189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189, +189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189, +189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189, +189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189, +189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189, +190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190, +188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188, +189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189, +189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,188,188,188,181,181,181, +173,173,173,173,173,173,181,181,181,189,189,189,188,188,188,189,189,189,189,189,189,189,189,189, +189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189, +189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189, +190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190, +188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188, +189,189,189,189,189,189,189,189,189,189,189,189,181,181,181,141,141,141,51,51,51,4,4,4, +2,2,2,17,17,17,50,50,50,64,64,64,68,68,68,68,68,68,68,68,68,69,69,69, +65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65, +69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69, +68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68, +68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68, +68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68, +68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68, +69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69, +65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65, +69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,61,61,61,56,56,56, +46,46,46,46,46,46,54,54,54,64,64,64,69,69,69,65,65,65,69,69,69,68,68,68, +68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68, +68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68, +68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68, +69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69, +65,65,65,69,69,69,68,68,68,68,68,68,65,65,65,52,52,52,21,21,21,2,2,2, +0,0,0,1,1,1,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6, +4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4, +6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6, +5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5, +5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5, +5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5, +5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6, +4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4, +6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3, +1,1,1,1,1,1,3,3,3,4,4,4,5,5,5,4,4,4,6,6,6,5,5,5, +5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5, +5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5, +5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6, +4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,4,4,4,2,2,2,0,0,0, +0,0,0,1,1,1,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6, +4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4, +6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6, +5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5, +5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5, +5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5, +5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6, +4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4, +6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,2,2,2, +0,0,0,0,0,0,2,2,2,4,4,4,5,5,5,4,4,4,6,6,6,5,5,5, +5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5, +5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5, +5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6, +4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,3,3,3,2,2,2,0,0,0, +1,1,1,16,16,16,50,50,50,65,65,65,68,68,68,68,68,68,68,68,68,69,69,69, +65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65, +69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69, +68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68, +68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68, +68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68, +68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68, +69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69, +65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65, +69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,67,67,67,49,49,49,19,19,19, +1,1,1,1,1,1,19,19,19,50,50,50,67,67,67,65,65,65,69,69,69,68,68,68, +68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68, +68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68, +68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68, +69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69, +65,65,65,69,69,69,68,68,68,68,68,68,65,65,65,51,51,51,21,21,21,2,2,2, +4,4,4,50,50,50,138,138,138,183,183,183,189,189,189,189,189,189,190,190,190,188,188,188, +189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189, +189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189, +189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189, +189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189, +189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189, +190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190, +188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188, +189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189, +189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,181,181,181,140,140,140,51,51,51, +4,4,4,4,4,4,51,51,51,141,141,141,181,181,181,189,189,189,189,189,189,189,189,189, +189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189, +189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189, +190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190, +188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188, +189,189,189,189,189,189,189,189,189,189,189,189,182,182,182,142,142,142,50,50,50,4,4,4, +5,5,5,65,65,65,181,181,181,234,234,234,244,244,244,244,244,244,244,244,244,242,242,242, +245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245, +242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242, +244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244, +244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244, +244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244, +244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244, +242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242, +245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245, +242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,232,232,232,183,183,183,65,65,65, +4,4,4,4,4,4,65,65,65,183,183,183,232,232,232,245,245,245,242,242,242,244,244,244, +244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244, +244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244, +244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244, +242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242, +245,245,245,242,242,242,244,244,244,244,244,244,233,233,233,180,180,180,66,66,66,5,5,5, +5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69, +6,6,6,6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4, +6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65, +4,4,4,4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6, +4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69, +6,6,6,6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68, +5,5,5,5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68, +5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68, +5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68, +5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6, +5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69, +6,6,6,6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4, +6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65, +4,4,4,4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6, +4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69, +6,6,6,6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68, +5,5,5,5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68, +5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68, +5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68, +5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6, +5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69, +6,6,6,6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4, +6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65, +4,4,4,4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6, +4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69, +6,6,6,6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68, +5,5,5,5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68, +5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68, +5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68, +5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6, +5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69, +6,6,6,6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4, +6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65, +4,4,4,4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6, +4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69, +6,6,6,6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68, +5,5,5,5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68, +5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5, +5,5,5,65,65,65,181,181,181,234,234,234,244,244,244,244,244,244,243,243,243,245,245,245, +243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243, +244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244, +244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244, +244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244, +244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244, +243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243, +245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245, +243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243, +244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,235,235,235,181,181,181,65,65,65, +5,5,5,5,5,5,65,65,65,182,182,182,234,234,234,244,244,244,243,243,243,245,245,245, +243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243, +244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244, +244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244, +244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244, +244,244,244,243,243,243,245,245,245,243,243,243,234,234,234,181,181,181,65,65,65,4,4,4, +4,4,4,51,51,51,140,140,140,182,182,182,189,189,189,190,190,190,188,188,188,189,189,189, +189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189, +189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189, +189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189, +189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189, +190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190, +188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188, +189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189, +189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189, +189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,182,182,182,141,141,141,50,50,50, +3,3,3,3,3,3,49,49,49,138,138,138,181,181,181,189,189,189,189,189,189,189,189,189, +188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188, +190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190, +189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189, +189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189, +189,189,189,189,189,189,189,189,189,188,188,188,182,182,182,141,141,141,54,54,54,5,5,5, +2,2,2,22,22,22,53,53,53,65,65,65,68,68,68,68,68,68,69,69,69,65,65,65, +69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69, +68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68, +68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68, +68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68, +68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68, +69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69, +65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65, +69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69, +68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,62,62,62,52,52,52,19,19,19, +2,2,2,2,2,2,17,17,17,48,48,48,64,64,64,68,68,68,69,69,69,65,65,65, +69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69, +68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68, +68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68, +68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68, +68,68,68,69,69,69,65,65,65,69,69,69,66,66,66,54,54,54,22,22,22,2,2,2, +1,1,1,3,3,3,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4, +6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6, +5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5, +5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5, +5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5, +5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6, +4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4, +6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6, +5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,5,5,5,1,1,1, +0,0,0,0,0,0,1,1,1,4,4,4,5,5,5,5,5,5,6,6,6,4,4,4, +6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6, +5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5, +5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5, +5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5, +5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,3,3,3,1,1,1, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +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,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,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, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, +100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100 +} +}; diff --git a/hacks/glx/cube21.c b/hacks/glx/cube21.c new file mode 100644 index 00000000..79423e61 --- /dev/null +++ b/hacks/glx/cube21.c @@ -0,0 +1,788 @@ +/*- + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation. + * + * This file is provided AS IS with no warranties of any kind. The author + * shall have no liability with respect to the infringement of copyrights, + * trade secrets or any patents by this file or any part thereof. In no + * event will the author be liable for any lost revenue or profits or + * other special, indirect and consequential damages. + * + * Cube 21 - a Rubik-like puzzle. It changes its shape and has more than + * 200 configurations. It is known better as Square-1, but it is called + * Cube 21 in the Czech republic, where it was invented in 1992. + * + * This file is derived from cage.c, + * "cage --- the Impossible Cage, an Escher like scene", + * by Marcelo F. Vienna, + * parts from gltext.c by Jamie Zawinski + * + * Vaclav (Vasek) Potocek + * vasek.potocek@post.cz + */ + +/* TODO: + * Future: some simple "solve mode" + * Future: new light model, less ambient light + * Maybe: use rotator and trackball + * Maybe: display lists - seem impossible with colors + */ + +/*- + * Texture mapping is only available on RGBA contexts, Mono and color index + * visuals DO NOT support texture mapping in OpenGL. + * + * BUT Mesa do implements RGBA contexts in pseudo color visuals, so texture + * mapping should work on PseudoColor, DirectColor, TrueColor using Mesa. Mono + * is not officially supported for both OpenGL and Mesa, but seems to not crash + * Mesa. + * + * In real OpenGL, PseudoColor DO NOT support texture map (as far as I know). + */ + +#define PROGCLASS "Cube21" +#define HACK_INIT init_cube21 +#define HACK_DRAW draw_cube21 +#define HACK_RESHAPE reshape_cube21 +#define cube21_opts xlockmore_opts + +#define DEF_XYSPEED "1.0" +#define DEF_TSPEED "3.0" +#define DEF_WSPEED "1.0" +#define DEF_TWAIT "40.0" +#define DEF_SIZE "0.7" +#define DEF_COLMODE "(none)" + +#define DEFAULTS "*delay: 20000 \n" \ + "*showFPS: False \n" \ + "*wireframe: False \n" + +#include "xlockmore.h" + +#ifdef USE_GL + +#include +#include "cube21-tex.h" + +#ifdef Pi +#undef Pi +#endif +#define Pi M_PI + +#define SHUFFLE 100 + +#define COS15 0.9659258263 +#define SIN15 0.2588190451 +#define COS30 0.8660254038 +#define SIN30 0.5000000000 + +#undef countof +#define countof(x) (sizeof((x))/sizeof((*x))) + +#define rnd01() (random()%2) +#define rndcolor() (frand(0.5)+0.3) + +/*************************************************************************/ + +static Bool wander, spin, wire, tex, rndstart, cmat; +static float spinspeed, tspeed, wspeed, twait, size; +static char *colmode_s; +static int colmode; + +static argtype vars[] = { + { &spin, "spin", "Spin", "True", t_Bool}, + { &wander, "wander", "Wander", "True", t_Bool}, + { &rndstart, "randomize", "Randomize", "True", t_Bool}, + { &tex, "texture", "Texture", "True", t_Bool}, + { &spinspeed, "spinspeed", "SpinSpeed", DEF_XYSPEED, t_Float}, + { &tspeed, "rotspeed", "RotSpeed", DEF_TSPEED, t_Float}, + { &wspeed, "wanderspeed", "WanderSpeed", DEF_WSPEED, t_Float}, + { &twait, "wait", "Wait", DEF_TWAIT, t_Float}, + { &size, "cubesize", "CubeSize", DEF_SIZE, t_Float}, + { &colmode_s, "colormode", "ColorMode", DEF_COLMODE, t_String} +}; + +static XrmOptionDescRec opts[] = { + { "-spin", ".spin", XrmoptionNoArg, "True" }, + { "+spin", ".spin", XrmoptionNoArg, "False" }, + { "-wander", ".wander", XrmoptionNoArg, "True" }, + { "+wander", ".wander", XrmoptionNoArg, "False" }, + { "-randomize", ".randomize", XrmoptionNoArg, "True" }, + { "+randomize", ".randomize", XrmoptionNoArg, "False" }, + { "-texture", ".texture", XrmoptionNoArg, "True" }, + { "+texture", ".texture", XrmoptionNoArg, "False" }, + { "-spinspeed", ".spinspeed", XrmoptionSepArg, 0 }, + { "-wanderspeed", ".wanderspeed", XrmoptionSepArg, 0 }, + { "-rotspeed", ".rotspeed", XrmoptionSepArg, 0 }, + { "-wait", ".wait", XrmoptionSepArg, 0 }, + { "-cubesize", ".cubesize", XrmoptionSepArg, 0 }, + { "-colormode", ".colormode", XrmoptionSepArg, DEF_COLMODE } +}; + +ModeSpecOpt cube21_opts = {countof(opts), opts, countof(vars), vars, NULL}; + +#ifdef USE_MODULES +ModStruct cube21_description = +{ "cube21", "init_cube21", "draw_cube21", "release_cube21", + "draw_cube21", "change_cube21", NULL, &cube21_opts, + 25000, 1, 1, 1, 1.0, 4, "", + "Shows randomly shuffling Cube 21", 0, NULL +}; +#endif + +typedef enum { + CUBE21_STATE_BASIC, + CUBE21_PAUSE1 = CUBE21_STATE_BASIC, + CUBE21_ROT_BASE, + CUBE21_ROT_TOP = CUBE21_ROT_BASE, + CUBE21_ROT_BOTTOM, + CUBE21_PAUSE2, + CUBE21_HALF_BASE, + CUBE21_HALF1 = CUBE21_HALF_BASE, + CUBE21_HALF2 +} cube21_state; + +typedef enum { + CUBE21_COLOR_WHITE, + CUBE21_COLOR_RANDOM, + CUBE21_COLOR_SILVER, + CUBE21_COLOR_TWORND, + CUBE21_COLOR_CLASSIC, + CUBE21_COLOR_SIXRND +} cube21_cmode; + +typedef int pieces_t[2][13]; +typedef int cind_t[5][12]; +typedef GLfloat col_t[6][3]; + +typedef struct { + GLXContext *glx_context; + GLfloat ratio; + cube21_state state; /* type of "rotation" - shuffling */ + GLfloat xrot, yrot; /* "spin" - object rotation around axis */ + GLfloat posarg; /* position argument (for sine function) */ + GLfloat t, tmax; /* rotation clock */ + int hf[2], fr[2]; /* half flipped / face rotated flags */ + int rface, ramount; /* selected face and amount of rotation in multiplies of 30deg */ + int pieces[2][13]; /* locations of "narrow" and "wide" pieces */ + int cind[5][12]; /* color indices */ + GLfloat colors[6][3]; /* color map */ +} cube21_conf; + +static cube21_conf *cube21 = NULL; + +static GLfloat shininess = 20.0; +static GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0}; +static GLfloat diffuse[] = {1.0, 1.0, 1.0, 1.0}; +static GLfloat position0[] = {1.0, 1.0, 1.0, 0.0}; +static GLfloat position1[] = {-1.0, -1.0, 1.0, 0.0}; +static GLfloat lmodel_ambient[] = {0.1, 0.1, 0.1, 1.0}; +static GLfloat material_ambient[] = {0.7, 0.7, 0.7, 1.0}; +static GLfloat material_diffuse[] = {0.7, 0.7, 0.7, 1.0}; +static GLfloat material_specular[] = {0.2, 0.2, 0.2, 1.0}; +static GLfloat color_inner[] = {1.0, 1.0, 1.0}; +static GLfloat texc[8] = {0.0}, posc[6]; +static GLfloat zpos = -18.0; + +/*************************************************************************/ + +static void find_matches(pieces_t pieces, int matches[12], int s) { + int i, j = 1; + for(i = 1; i<6; i++) { + if(pieces[s][i] && pieces[s][i+6]) { + matches[j++] = i; + } + } + matches[0] = j; + for(i = 1; ipieces, matches, s); + j = matches[0]-1; + j = random()%j; + j = matches[j+1]; + rot_face(cp->pieces, cp->cind, s, j); + s = rnd01(); + rot_halves(cp->pieces, cp->cind, cp->hf, s); + } +} + +static void finish(cube21_conf *cp) { + int j, s; + int matches[12]; + switch(cp->state) { + case CUBE21_PAUSE1: + s = rnd01(); + find_matches(cp->pieces, matches, s); + j = matches[0]-1; + j = random()%j; + j = matches[j+1]; + if(j==6 && rnd01()) j = -6; + cp->state = CUBE21_ROT_BASE+s; + cp->tmax = 30.0*abs(j); + cp->fr[0] = cp->fr[1] = 0; + cp->rface = s; + cp->ramount = j; + break; + case CUBE21_ROT_TOP: + case CUBE21_ROT_BOTTOM: + rot_face(cp->pieces, cp->cind, s = cp->rface, cp->ramount); + cp->fr[s] = 1; + s ^= 1; + if(!cp->fr[s] && rnd01()) { + find_matches(cp->pieces, matches, s); + j = matches[0]-1; + j = random()%j; + j = matches[j+1]; + if(j==6 && rnd01()) j = -6; + cp->state = CUBE21_ROT_BASE+s; + cp->tmax = 30.0*abs(j); + cp->rface = s; + cp->ramount = j; + break; + } else { + cp->state = CUBE21_PAUSE2; + cp->tmax = twait; + break; + } + case CUBE21_PAUSE2: + s = rnd01(); + cp->ramount = -rnd01(); /* 0 or -1, only sign is significant in this case */ + cp->state = CUBE21_HALF_BASE+s; + cp->tmax = 180.0; + cp->rface = s; + break; + case CUBE21_HALF1: + case CUBE21_HALF2: + rot_halves(cp->pieces, cp->cind, cp->hf, cp->rface); + cp->state = CUBE21_PAUSE1; + cp->tmax = twait; + break; + } + cp->t = 0; +} + +static void draw_narrow_piece(GLfloat s, int c1, int c2, col_t colors) { + GLfloat s1 = posc[0]*s; + glBegin(GL_TRIANGLES); + glNormal3f(0.0, 0.0, s); + if(cmat) glColor3fv(colors[c1]); + glTexCoord2f(0.0, 0.25); glVertex3f(0.0, 0.0, s); + glTexCoord2f(0.5, texc[1]); glVertex3f(posc[1], 0.0, s); + glTexCoord2f(0.5, texc[2]); glVertex3f(posc[2], posc[3], s); + glNormal3f(0.0, 0.0, -s); + if(cmat) glColor3fv(color_inner); + glTexCoord2f(1.0, 1.0); + glVertex3f(0.0, 0.0, s1); + glVertex3f(posc[1], 0.0, s1); + glVertex3f(posc[2], posc[3], s1); + glEnd(); + glBegin(GL_QUADS); + glNormal3f(0.0, -1.0, 0.0); + if(cmat) glColor3fv(color_inner); + glTexCoord2f(1.0, 1.0); + glVertex3f(0.0, 0.0, s); + glVertex3f(posc[1], 0.0, s); + glVertex3f(posc[1], 0.0, s1); + glVertex3f(0.0, 0.0, s1); + glNormal3f(COS15, SIN15, 0.0); + if(cmat) glColor3fv(colors[c2]); + glTexCoord2f(0.5, texc[1]); glVertex3f(posc[1], 0.0, s); + glTexCoord2f(0.5, texc[2]); glVertex3f(posc[2], posc[3], s); + glTexCoord2f(texc[4], texc[2]); glVertex3f(posc[2], posc[3], s1); + glTexCoord2f(texc[4], texc[1]); glVertex3f(posc[1], 0.0, s1); + glNormal3f(-SIN30, COS30, 0.0); + if(cmat) glColor3fv(color_inner); + glTexCoord2f(1.0, 1.0); + glVertex3f(0.0, 0.0, s); + glVertex3f(posc[2], posc[3], s); + glVertex3f(posc[2], posc[3], s1); + glVertex3f(0.0, 0.0, s1); + glEnd(); + glRotatef(30.0, 0.0, 0.0, 1.0); +} + +static void draw_wide_piece(GLfloat s, int c1, int c2, int c3, col_t colors) { + GLfloat s1 = posc[0]*s; + glBegin(GL_TRIANGLES); + glNormal3f(0.0, 0.0, s); + if(cmat) glColor3fv(colors[c1]); + glTexCoord2f(0.0, 0.25); glVertex3f(0.0, 0.0, s); + glTexCoord2f(0.5, texc[1]); glVertex3f(posc[1], 0.0, s); + glTexCoord2f(0.5, 0.0); glVertex3f(posc[4], posc[5], s); + glTexCoord2f(0.5, 0.0); glVertex3f(posc[4], posc[5], s); + glTexCoord2f(texc[3], 0.0); glVertex3f(posc[3], posc[2], s); + glTexCoord2f(0.0, 0.25); glVertex3f(0.0, 0.0, s); + glNormal3f(0.0, 0.0, -s); + if(cmat) glColor3fv(color_inner); + glTexCoord2f(1.0, 1.0); + glVertex3f(0.0, 0.0, s1); + glVertex3f(posc[1], 0.0, s1); + glVertex3f(posc[4], posc[5], s1); + glVertex3f(posc[4], posc[5], s1); + glVertex3f(posc[3], posc[2], s1); + glVertex3f(0.0, 0.0, s1); + glEnd(); + glBegin(GL_QUADS); + glNormal3f(0.0, -1.0, 0); + if(cmat) glColor3fv(color_inner); + glTexCoord2f(1.0, 1.0); + glVertex3f(0.0, 0.0, s); + glVertex3f(posc[1], 0.0, s); + glVertex3f(posc[1], 0.0, s1); + glVertex3f(0.0, 0.0, s1); + glNormal3f(COS15, -SIN15, 0.0); + if(cmat) glColor3fv(colors[c2]); + glTexCoord2f(0.5, texc[1]); glVertex3f(posc[1], 0.0, s); + glTexCoord2f(0.5, 0.0); glVertex3f(posc[4], posc[5], s); + glTexCoord2f(texc[4], 0.0); glVertex3f(posc[4], posc[5], s1); + glTexCoord2f(texc[4], texc[1]); glVertex3f(posc[1], 0.0, s1); + glNormal3f(SIN15, COS15, 0.0); + if(cmat) glColor3fv(colors[c3]); + glTexCoord2f(0.5, texc[1]); glVertex3f(posc[4], posc[5], s); + glTexCoord2f(0.5, 0.0); glVertex3f(posc[3], posc[2], s); + glTexCoord2f(texc[4], 0.0); glVertex3f(posc[3], posc[2], s1); + glTexCoord2f(texc[4], texc[1]); glVertex3f(posc[4], posc[5], s1); + glNormal3f(-COS30, SIN30, 0.0); + if(cmat) glColor3fv(color_inner); + glTexCoord2f(1.0, 1.0); + glVertex3f(0.0, 0.0, s); + glVertex3f(posc[3], posc[2], s); + glVertex3f(posc[3], posc[2], s1); + glVertex3f(0.0, 0.0, s1); + glEnd(); + glRotatef(60.0, 0.0, 0.0, 1.0); +} + +static void draw_middle_piece(int s, cind_t cind, col_t colors) { + s *= 6; + glBegin(GL_QUADS); + if(cmat) glColor3fv(color_inner); + glNormal3f(0.0, 0.0, 1.0); + glTexCoord2f(1.0, 1.0); + glVertex3f(posc[1], 0.0, posc[0]); + glVertex3f(posc[4], posc[5], posc[0]); + glVertex3f(-posc[5], posc[4], posc[0]); + glVertex3f(-posc[1], 0.0, posc[0]); + glNormal3f(0.0, 0.0, -1.0); + glTexCoord2f(1.0, 1.0); + glVertex3f(posc[1], 0.0, -posc[0]); + glVertex3f(posc[4], posc[5], -posc[0]); + glVertex3f(-posc[5], posc[4], -posc[0]); + glVertex3f(-posc[1], 0.0, -posc[0]); + glNormal3f(0.0, -1.0, 0.0); + glTexCoord2f(1.0, 1.0); + glVertex3f(-posc[1], 0.0, posc[0]); + glVertex3f(posc[1], 0.0, posc[0]); + glVertex3f(posc[1], 0.0, -posc[0]); + glVertex3f(-posc[1], 0.0, -posc[0]); + glNormal3f(COS15, -SIN15, 0.0); + if(cmat) glColor3fv(colors[cind[4][s]]); + glTexCoord2f(texc[5], 0.5); glVertex3f(posc[1], 0.0, posc[0]); + glTexCoord2f(1.0, 0.5); glVertex3f(posc[4], posc[5], posc[0]); + glTexCoord2f(1.0, texc[7]); glVertex3f(posc[4], posc[5], -posc[0]); + glTexCoord2f(texc[5], texc[7]); glVertex3f(posc[1], 0.0, -posc[0]); + glNormal3f(SIN15, COS15, 0.0); + if(cmat) glColor3fv(colors[cind[4][s+1]]); + glTexCoord2f(0.0, 0.5); glVertex3f(posc[4], posc[5], posc[0]); + glTexCoord2f(1.0, 0.5); glVertex3f(-posc[5], posc[4], posc[0]); + glTexCoord2f(1.0, texc[6]); glVertex3f(-posc[5], posc[4], -posc[0]); + glTexCoord2f(0.0, texc[6]); glVertex3f(posc[4], posc[5], -posc[0]); + glNormal3f(-COS15, SIN15, 0.0); + if(cmat) glColor3fv(colors[cind[4][s+4]]); + glTexCoord2f(0.0, 0.5); glVertex3f(-posc[5], posc[4], posc[0]); + glTexCoord2f(texc[5], 0.5); glVertex3f(-posc[1], 0.0, posc[0]); + glTexCoord2f(texc[5], texc[7]); glVertex3f(-posc[1], 0.0, -posc[0]); + glTexCoord2f(0.0, texc[7]); glVertex3f(-posc[5], posc[4], -posc[0]); + glEnd(); +} + +static void draw_middle(cube21_conf *cp) { + if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0); + draw_middle_piece(0, cp->cind, cp->colors); + if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0); + glRotatef(180.0, 0.0, 0.0, 1.0); + if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0); + draw_middle_piece(1, cp->cind, cp->colors); + if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0); +} + +static void draw_half_face(cube21_conf *cp, int s, int o) { + int i, s1 = 1-s*2, s2 = s*2; + for(i = o; ipieces[s][i+1]) + draw_narrow_piece(s1, cp->cind[s2][i], cp->cind[s2+1][i], cp->colors); + else { + draw_wide_piece(s1, cp->cind[s2][i], cp->cind[s2+1][i], cp->cind[s2+1][i+1], cp->colors); + i++; + } + } +} + +static void draw_top_face(cube21_conf *cp) { + draw_half_face(cp, 0, 0); + draw_half_face(cp, 0, 6); +} + +static void draw_bottom_face(cube21_conf *cp) { + draw_half_face(cp, 1, 0); + draw_half_face(cp, 1, 6); +} + +static Bool draw_main(cube21_conf *cp) { + GLfloat theta = cp->ramount<0?cp->t:-cp->t; + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glLoadIdentity(); + if(wander) + glTranslatef(3.0*cp->ratio*sin(13.0*cp->posarg), 3.0*sin(17.0*cp->posarg), zpos); + else + glTranslatef(0, 0, zpos); + glScalef(size, size, size); + glRotatef(cp->xrot, 1.0, 0.0, 0.0); + glRotatef(cp->yrot, 0.0, 1.0, 0.0); + if(wire) glColor3f(0.7, 0.7, 0.7); + switch(cp->state) { + case CUBE21_PAUSE1: + case CUBE21_PAUSE2: + draw_top_face(cp); + draw_bottom_face(cp); + draw_middle(cp); + break; + case CUBE21_ROT_TOP: + glRotatef(theta, 0.0, 0.0, 1.0); + draw_top_face(cp); + glRotatef(-theta, 0.0, 0.0, 1.0); + draw_bottom_face(cp); + draw_middle(cp); + break; + case CUBE21_ROT_BOTTOM: + draw_top_face(cp); + glRotatef(theta, 0.0, 0.0, 1.0); + draw_bottom_face(cp); + glRotatef(-theta, 0.0, 0.0, 1.0); + draw_middle(cp); + break; + case CUBE21_HALF1: + glRotatef(theta, 0.0, 1.0, 0.0); + case CUBE21_HALF2: + draw_half_face(cp, 0, 0); + glRotatef(-180.0, 0.0, 0.0, 1.0); + draw_half_face(cp, 1, 0); + glRotatef(-180.0, 0.0, 0.0, 1.0); + if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0); + draw_middle_piece(0, cp->cind, cp->colors); + if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0); + if(cp->state==CUBE21_HALF1) + glRotatef(-theta, 0.0, 1.0, 0.0); + else + glRotatef(theta, 0.0, 1.0, 0.0); + glRotatef(180.0, 0.0, 0.0, 1.0); + draw_half_face(cp, 0, 6); + glRotatef(-180.0, 0.0, 0.0, 1.0); + draw_half_face(cp, 1, 6); + glRotatef(-180.0, 0.0, 0.0, 1.0); + if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0); + draw_middle_piece(1, cp->cind, cp->colors); + break; + } + if(spin) { + if((cp->xrot += spinspeed)>360.0) cp->xrot -= 360.0; + if((cp->yrot += spinspeed)>360.0) cp->yrot -= 360.0; + } + if(wander) + if((cp->posarg += wspeed/1000.0)>360.0) cp->posarg -= 360.0; + if((cp->t += tspeed)>cp->tmax) finish(cp); + return True; +} + +void parse_colmode(void) { + if(!colmode_s) { + colmode = CUBE21_COLOR_WHITE; + return; + } + if(strstr(colmode_s, "se") || strstr(colmode_s, "sil")) colmode = CUBE21_COLOR_SILVER; + else if(strstr(colmode_s, "ce") || strstr(colmode_s, "cla")) colmode = CUBE21_COLOR_CLASSIC; + else if(strstr(colmode_s, "2") || strstr(colmode_s, "two")) colmode = CUBE21_COLOR_TWORND; + else if(strstr(colmode_s, "6") || strstr(colmode_s, "six")) colmode = CUBE21_COLOR_SIXRND; + else if(strstr(colmode_s, "1") || strstr(colmode_s, "ran") || strstr(colmode_s, "rnd")) colmode = CUBE21_COLOR_RANDOM; + else colmode = CUBE21_COLOR_WHITE; +} + +static void init_texc(void) { + GLfloat p = tan(Pi/12); + if(texc[0]) return; + /* Some significant non-trivial coordinates of the texture... */ + texc[0] = p; /* 0.268 */ + texc[1] = (1.0-p)/4; /* 0.183 */ + texc[2] = (1.0+p)/4; /* 0.317 */ + texc[3] = p/2; /* 0.134 */ + texc[4] = 1.0-p/2; /* 0.866 = sqrt(3)/2 */ + texc[5] = (1.0+p)/2; /* 0.634 */ + texc[6] = (1.0-p)/2; /* 0.366 */ + texc[7] = (1.0+p)/2; /* = texc[5], but has different purpose */ + /* ...and of the object. We need them exactly at GLfloat precision + * for the edges to line up perfectly. */ + posc[0] = p; /* 0.268 */ + posc[1] = 1.0/cos(Pi/12); /* 1.035 */ + posc[2] = cos(Pi/6)/cos(Pi/12); /* 0.897 */ + posc[3] = sin(Pi/6)/cos(Pi/12); /* 0.518 */ + posc[4] = sqrt(2)*cos(Pi/6); /* 1.225 */ + posc[5] = sqrt(2)*sin(Pi/6); /* 0.707 = 1/sqrt(2) */ +} + +/* It doesn't look good */ +/*#define MIPMAP*/ + +static void init_gl(ModeInfo *mi) { +#ifdef MIPMAP + int status; +#endif + parse_colmode(); + wire = MI_IS_WIREFRAME(mi); + cmat = !wire && (colmode != CUBE21_COLOR_WHITE); + if(MI_IS_MONO(mi)) { + tex = False; + cmat = False; + } + if(wire) { + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + return; + } + if(!tex) color_inner[0] = color_inner[1] = color_inner[2] = 0.4; + glClearDepth(1.0); + glClearColor(0.0, 0.0, 0.0, 1.0); + glDrawBuffer(GL_BACK); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glShadeModel(GL_FLAT); + glDepthFunc(GL_LESS); + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); + glLightfv(GL_LIGHT0, GL_POSITION, position0); + glLightfv(GL_LIGHT1, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse); + glLightfv(GL_LIGHT1, GL_POSITION, position1); + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); + glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); + glEnable(GL_DEPTH_TEST); + glEnable(GL_LIGHT0); + glEnable(GL_LIGHT1); + glEnable(GL_LIGHTING); + glEnable(GL_NORMALIZE); + glEnable(GL_COLOR_MATERIAL); + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material_ambient); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_diffuse); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular); + glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess); + if(!tex) return; + glEnable(GL_TEXTURE_2D); +#ifdef MIPMAP + clear_gl_error(); + status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3, cubetex.width, cubetex.height, + GL_RGB, GL_UNSIGNED_BYTE, cubetex.pixel_data); + if (status) { + const char *s = gluErrorString(status); + fprintf (stderr, "%s: error mipmapping texture: %s\n", progname, (s?s:"(unknown)")); + exit (1); + } + check_gl_error("mipmapping"); +#else + glTexImage2D(GL_TEXTURE_2D, 0, cubetex.bytes_per_pixel, cubetex.width, cubetex.height, + 0, GL_RGB, GL_UNSIGNED_BYTE, cubetex.pixel_data); +#endif + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); +#ifdef MIPMAP + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); +#else + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); +#endif +} + +static void init_cp(cube21_conf *cp) { + int i, j; + GLfloat ce_colors[6][3] = { + {1.0, 1.0, 1.0}, + {1.0, 0.5, 0.0}, + {0.0, 0.9, 0.0}, + {0.8, 0.0, 0.0}, + {0.1, 0.1, 1.0}, + {0.9, 0.9, 0.0} + }; + cp->state = CUBE21_STATE_BASIC; + cp->xrot = -65.0; cp->yrot = 185.0; + cp->posarg = (wspeed?random()%360:0.0); + cp->t = 0.0; cp->tmax = twait; + cp->hf[0] = cp->hf[1] = 0; + cp->fr[0] = cp->fr[1] = 0; + for(i=0;i<13;i++) + cp->pieces[0][i] = cp->pieces[1][i] = (i%3==1?0:1); + switch(colmode) { + case CUBE21_COLOR_RANDOM: + case CUBE21_COLOR_TWORND: + case CUBE21_COLOR_SIXRND: + for(i=0; i<6; i++) + for(j=0; j<3; j++) + cp->colors[i][j] = rndcolor(); + break; + case CUBE21_COLOR_SILVER: + cp->colors[0][0] = 1.0; + cp->colors[0][1] = 1.0; + cp->colors[0][2] = 1.0; + cp->colors[1][0] = rndcolor(); + cp->colors[1][1] = rndcolor(); + cp->colors[1][2] = rndcolor(); + break; + case CUBE21_COLOR_CLASSIC: + for(i=0; i<6; i++) + for(j=0; j<3; j++) + cp->colors[i][j] = 0.2+0.7*ce_colors[i][j]; + break; + } + switch(colmode) { + case CUBE21_COLOR_SILVER: + case CUBE21_COLOR_TWORND: + for(i=0; i<5; i++) + for(j=0; j<12; j++) + if(i==0) cp->cind[i][j] = 0; + else if(i==2) cp->cind[i][j] = 1; + else cp->cind[i][j] = ((j+5)%12)>=6?1:0; + break; + case CUBE21_COLOR_CLASSIC: + case CUBE21_COLOR_SIXRND: + for(i=0; i<5; i++) + for(j=0; j<12; j++) + if(i==0) cp->cind[i][j] = 4; + else if(i==2) cp->cind[i][j] = 5; + else cp->cind[i][j] = ((j+5)%12)/3; + break; + case CUBE21_COLOR_RANDOM: + for(i=0; i<5; i++) + for(j=0; j<12; j++) + cp->cind[i][j] = 0; + break; + } + if(rndstart) randomize(cp); +} + +/*************************************************************************/ + +void reshape_cube21(ModeInfo *mi, int width, int height) { + cube21_conf *cp = &cube21[MI_SCREEN(mi)]; + if(!height) height = 1; + cp->ratio = (GLfloat)width/(GLfloat)height; + glViewport(0, 0, (GLint) width, (GLint) height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(30.0, cp->ratio, 1.0, 100.0); + glMatrixMode(GL_MODELVIEW); + glClear(GL_COLOR_BUFFER_BIT); +} + +void release_cube21(ModeInfo *mi) { + if (cube21 != NULL) { + int screen; + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { + cube21_conf *cp = &cube21[screen]; + if (cp->glx_context) { + cp->glx_context = NULL; + } + } + free((void *)cube21); + cube21 = NULL; + } + FreeAllGL(mi); +} + +void init_cube21(ModeInfo *mi) { + cube21_conf *cp; + if(!cube21) { + cube21 = (cube21_conf *)calloc(MI_NUM_SCREENS(mi), sizeof(cube21_conf)); + if(!cube21) return; + } + init_texc(); + cp = &cube21[MI_SCREEN(mi)]; + if ((cp->glx_context = init_GL(mi)) != NULL) { + init_gl(mi); + init_cp(cp); + reshape_cube21(mi, MI_WIDTH(mi), MI_HEIGHT(mi)); + } else { + MI_CLEARWINDOW(mi); + } +} + +void draw_cube21(ModeInfo * mi) { + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + cube21_conf *cp; + if (!cube21) return; + cp = &cube21[MI_SCREEN(mi)]; + MI_IS_DRAWN(mi) = True; + if (!cp->glx_context) return; + glXMakeCurrent(display, window, *(cp->glx_context)); + if (!draw_main(cp)) { + release_cube21(mi); + return; + } + if (MI_IS_FPS(mi)) do_fps (mi); + glFlush(); + glXSwapBuffers(display, window); +} + +void change_cube21(ModeInfo * mi) { + cube21_conf *cp = &cube21[MI_SCREEN(mi)]; + if (!cp->glx_context) return; + glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cp->glx_context)); + init_gl(mi); +} + +#endif diff --git a/hacks/glx/cube21.man b/hacks/glx/cube21.man new file mode 100644 index 00000000..4f93582a --- /dev/null +++ b/hacks/glx/cube21.man @@ -0,0 +1,149 @@ +.TH XScreenSaver 1 "30-Aug-05" "X Version 11" +.SH NAME +cube21 - animates the Cube 21 puzzle +.SH SYNOPSIS +.B cube21 +[\-display \fIhost:display.screen\fP] +[\-visual \fIvisual\fP] +[\-window] +[\-root] +[\-install] +[\-delay \fImicroseconds\fP] +[\-texture] [\-no\-texture] +[\-mono] +[\-wireframe] +[\-spin] [\-no\-spin] +[\-wander] [\-no\-wander] +[\-randomize] [\-no\-randomize] +[\-spinspeed \fInumber\fP] +[\-rotspeed \fInumber\fP] +[\-wanderspeed \fInumber\fP] +[\-wait \fInumber\fP] +[\-cubesize \fInumber\fP] +[\-colormode \fIarg\fP] +[\-fps] +.SH DESCRIPTION +This program animates a puzzle known as Cube 21 or Square-1. +Its moves are chosen randomly. +.P +Cube 21 is a Rubik-like puzzle invented in 1992. Its specialities are that +it can change its shape and even the number of possible moves. It can have +more than 200 different shapes and the total number of configurations +(assuming colors) is several tens of billions. +.SH OPTIONS +.I cube21 +accepts the following options: +.TP 8 +.B \-window +Draw on a newly-created window. This is the default. +.TP 8 +.B \-root +Draw on the root window. +.TP 8 +.B \-install +Install a private colormap for the window. +.TP 8 +.B \-visual \fIvisual\fP\fP +Specify which visual to use. Legal values are the name of a visual class, +or the id number (decimal or hex) of a specific visual. +.TP 8 +.B \-delay \fImicroseconds\fP +How long to pause between frames. Default is 20000, or 0.02 second. +.TP 8 +.B \-texture +Use texture maps. This is the default. +.TP 8 +.B \-no\-texture +Use solid colors. +.TP 8 +.B \-mono +Disable both texture maps and colors. +.TP 8 +.B \-wireframe +Only draw outlines. Outlines of all pieces, not only the whole object, are drawn. +.TP 8 +.B \-spin +Spin the whole object around X, Y and Z axes. This is the default. +.TP 8 +.B \-no\-spin +Do not spin, showing the same three faces all the time. +.TP 8 +.B \-wander +Move the object around the screen. This is the default. +.TP 8 +.B \-no\-wander +Keep the object centered on the screen. +.TP 8 +.B \-randomize +Shuffle the puzzle randomly at startup. This is the default. +.TP 8 +.B \-no\-randomize +Do not shuffle at startup, begin at the shape of cube. +.TP 8 +.B \-spinspeed \fInumber\fP +The relative speed of spinning. Default is 1.0. +.TP 8 +.B \-rotspeed \fInumber\fP +The relative speed of the moves. Default is 3.0. Setting to \(<= 0.0 +makes the object stay at one configuration. +.TP 8 +.B \-wanderspeed \fInumber\fP +The relative speed of wandering around the screen. Default is 1.0. +.TP 8 +.B \-wait \fInumber\fP +How long to stay at ending position after each move. The meaning of +the argument is again relative. Default is 40.0. +.TP 8 +.B \-cubesize \fInumber\fP +Size of the object. Value of 3.0 fills roughly all the screen (its height). Default is 0.7. +.TP 8 +.B \-colormode \fIargument\fP +How many and which colors should the object have. The colors are put on the piece +faces so that the puzzle is solvable. The inner faces are not influenced. +.RS +.TP 8 +.BR se " or " silver +Simulate the "Silver Edition" \- white and one random color. +.TP 8 +.BR 2 " or " two +Two random colors. +.TP 8 +.BR ce " or " classic +Simulate the "Classic Edition" \- white, yellow, orange, red, green and blue. +.TP 8 +.BR 6 " or " six +Six random colors. +.TP 8 +.BR 1 " or " random " or " rnd +One random color. +.TP 8 +Anything else +All faces white. +.RE +.TP 8 +.B \-fps +Display a running tally of how many frames per second are being rendered. +In conjunction with \fB\-delay 0\fP, this can be a useful benchmark of +your GL performance. +.SH ENVIRONMENT +.PP +.TP 8 +.B DISPLAY +to get the default host and display number. +.TP 8 +.B XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 2005 by Vaclav Potocek. 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. No representations are made about the +suitability of this software for any purpose. It is provided "as is" without +express or implied warranty. +.SH AUTHOR +Vaclav (Vasek) Potocek , 30-Aug-05. diff --git a/hacks/glx/gears.c b/hacks/glx/gears.c index 2f27ba0c..bd055982 100644 --- a/hacks/glx/gears.c +++ b/hacks/glx/gears.c @@ -61,16 +61,21 @@ static const char sccsid[] = "@(#)gears.c 4.07 97/11/24 xlockmore"; #define countof(x) (sizeof((x))/sizeof((*x))) #define DEF_PLANETARY "False" +#define DEF_SPIN "True" static int planetary; +static int spin; static XrmOptionDescRec opts[] = { {"-planetary", ".gears.planetary", XrmoptionNoArg, "true" }, {"+planetary", ".gears.planetary", XrmoptionNoArg, "false" }, + {"-spin", ".gears.spin", XrmoptionNoArg, "true" }, + {"+spin", ".gears.spin", XrmoptionNoArg, "false" }, }; static argtype vars[] = { {&planetary, "planetary", "Planetary", DEF_PLANETARY, t_Bool}, + {&spin, "spin", "Spin", DEF_SPIN, t_Bool}, }; ModeSpecOpt gears_opts = {countof(opts), opts, countof(vars), vars, NULL}; @@ -535,13 +540,14 @@ draw(ModeInfo * mi) gltrackball_rotate (gp->trackball); - { - double x, y, z; - get_rotation (gp->rot, &x, &y, &z, !gp->button_down_p); - glRotatef (x * 360, 1.0, 0.0, 0.0); - glRotatef (y * 360, 0.0, 1.0, 0.0); - glRotatef (z * 360, 0.0, 0.0, 1.0); - } + if (spin) + { + double x, y, z; + get_rotation (gp->rot, &x, &y, &z, !gp->button_down_p); + glRotatef (x * 360, 1.0, 0.0, 0.0); + glRotatef (y * 360, 0.0, 1.0, 0.0); + glRotatef (z * 360, 0.0, 0.0, 1.0); + } if (!planetary) { glPushMatrix(); diff --git a/hacks/glx/glhanoi.c b/hacks/glx/glhanoi.c new file mode 100644 index 00000000..b0f91caf --- /dev/null +++ b/hacks/glx/glhanoi.c @@ -0,0 +1,1484 @@ +/* glhanoi, Copyright (c) 2005 Dave Atkinson + * except noise function code Copyright (c) 2002 Ken Perlin + * + * 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. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#include +#include + +#include + +#define PROGCLASS "glhanoi" +#define HACK_INIT init_glhanoi +#define HACK_DRAW draw_glhanoi +#define HACK_RESHAPE reshape_glhanoi +#define HACK_HANDLE_EVENT glhanoi_handle_event +#define EVENT_MASK PointerMotionMask +#define glh_opts xlockmore_opts + +#define DEF_DELAY "15000" +#define DEF_DISKS "7" +#define DEF_WIRE "False" +#define DEF_LIGHT "True" +#define DEF_FPS "False" +#define DEF_FOG "False" +#define DEF_TEXTURE "True" + +#define DEFAULTS "*delay: " DEF_DELAY "\n" \ + "*count: " DEF_DISKS "\n" \ + "*showFPS: " DEF_FPS "\n" \ + "*wireframe: " DEF_WIRE "\n" + +#define NSLICE 32 +#define NLOOPS 1 +#define START_DURATION 1.0 +#define FINISH_DURATION 1.0 +#define BASE_LENGTH 30.0 +#define BOARD_SQUARES 8 + +#define MAX_CAMERA_RADIUS 250.0 +#define MIN_CAMERA_RADIUS 75.0 + +#define MARBLE_SCALE 1.01 + +enum { + MARBLE_TEXURE, + N_TEXTURES +}; + +#define MARBLE_TEXTURE_SIZE 256 + +#undef countof +#define countof(x) (sizeof((x))/sizeof((*x))) + +#include +#include "xlockmore.h" + +#ifdef USE_GL /* whole file */ + +#include + +#ifdef HAVE_GETTIMEOFDAY +#ifdef GETTIMEOFDAY_TWO_ARGS +# include +# include +typedef struct timeval glhtime; +#else /* GETTIMEOFDAY_TWO_ARGS */ +# include +# include +typedef struct timeval glhtime; +#endif +#else /* HAVE_GETTIMEOFDAY */ +#ifdef HAVE_FTIME +# include +typedef struct timeb glhtime; +#endif /* HAVE_FTIME */ +#endif /* HAVE_GETTIMEOFDAY */ + +double getTime(void) +{ +#ifdef HAVE_GETTIMEOFDAY + struct timeval t; +#ifdef GETTIMEOFDAY_TWO_ARGS + gettimeofday(&t, NULL); +#else /* !GETTIMEOFDAY_TWO_ARGS */ + gettimeofday(&t); +#endif /* !GETTIMEOFDAY_TWO_ARGS */ +#else /* !HAVE_GETTIMEOFDAY */ +#ifdef HAVE_FTIME + ftime(&t); +#endif /* HAVE_FTIME */ +#endif /* !HAVE_GETTIMEOFDAY */ + return t.tv_sec + t.tv_usec / 1000000.0; +} + +typedef enum { + START, + MOVE_DISK, + MOVE_FINISHED, + FINISHED, + MONEY_SHOT, + INVALID = -1 +} State; + +typedef struct { + int id; + GLuint displayList; + GLfloat position[3]; + GLfloat rotation[3]; + GLfloat color[4]; + GLfloat base0; + GLfloat base1; + GLfloat height; + GLfloat xmin, xmax, ymin; + GLfloat u1, u2; + GLfloat t1, t2; + GLfloat ucostheta, usintheta; + GLdouble rotAngle; +} Disk; + +typedef struct { + Disk **data; + int count; + int size; +} Stack; + +typedef struct { + GLXContext *glx_context; + State state; + Bool wire; + Bool fog; + Bool light; + double startTime; + double lastTime; + double duration; + int numberOfDisks; + int numberOfMoves; + int maxDiskIdx; + int magicNumber; + Disk *currentDisk; + int move; + int src; + int tmp; + int dst; + int oldsrc; + int oldtmp; + int olddst; + Stack pole[3]; + float boardSize; + float baseLength; + float baseWidth; + float baseHeight; + float poleRadius; + float poleHeight; + float poleOffset; + float diskHeight; + float *diskPos; /* pre-computed disk positions on rods */ + Disk *disk; + float speed; + GLint floorList; + GLint baseList; + GLint poleList; + GLfloat camera[3]; + GLfloat centre[3]; + rotator *the_rotator; + Bool button_down_p; + Bool texture; + GLuint textureNames[N_TEXTURES]; + int drag_x; + int drag_y; +} glhcfg; + +static glhcfg *glhanoi_cfg = NULL; +static glhcfg *glhanoi = NULL; +static Bool fog; +static Bool light; +static Bool texture; + +static XrmOptionDescRec opts[] = { + {"-light", ".glhanoi.light", XrmoptionNoArg, (caddr_t) "true"}, + {"+light", ".glhanoi.light", XrmoptionNoArg, (caddr_t) "false"}, + {"-fog", ".glhanoi.fog", XrmoptionNoArg, (caddr_t) "true"}, + {"+fog", ".glhanoi.fog", XrmoptionNoArg, (caddr_t) "false"}, + {"-texture", ".glhanoi.texture", XrmoptionNoArg, (caddr_t) "true"}, + {"+texture", ".glhanoi.texture", XrmoptionNoArg, (caddr_t) "false"} +}; + +static argtype vars[] = { + {(caddr_t *) (void *)&light, "light", "Light", DEF_LIGHT, t_Bool}, + {(caddr_t *) (void *)&fog, "fog", "Fog", DEF_FOG, t_Bool}, + {(caddr_t *) (void *)&texture, "texture", "Texture", DEF_TEXTURE, + t_Bool} +}; + +static OptionStruct desc[] = { + {"+/-light", "whether to light the scene"}, + {"+/-fog", "whether to apply fog to the scene"}, + {"+/-texture", "whether to apply texture to the scene"} +}; + +ModeSpecOpt glh_opts = { countof(opts), opts, countof(vars), vars, desc }; + +#ifdef USE_MODULES + +ModStruct glhanoi_description = { + "glhanoi", "init_glhanoi", "draw_glhanoi", "release_glhanoi", + "draw_glhanoi", "init_glhanoi", NULL, &glhanoi_opts, + 1000, 1, 2, 1, 4, 1.0, "", + "Towers of Hanoi", 0, NULL +}; + +#endif + +static GLfloat cBlack[] = { 0.0, 0.0, 0.0, 1.0 }; +static GLfloat cWhite[] = { 1.0, 1.0, 1.0, 1.0 }; +static GLfloat poleColor[] = { 0.545, 0.137, 0.137 }; +static GLfloat baseColor[] = { 0.34, 0.34, 0.48 }; +static GLfloat fogcolor[] = { 0.5, 0.5, 0.5 }; + +static float left[] = { 1.0, 0.0, 0.0 }; +static float up[] = { 0.0, 1.0, 0.0 }; +static float front[] = { 0.0, 0.0, 1.0 }; +static float right[] = { -1.0, 0.0, 0.0 }; +static float down[] = { 0.0, -1.0, 0.0 }; +static float back[] = { 0.0, 0.0, -1.0 }; + +GLfloat pos0[4] = { 50.0, 50.0, 50.0, 0.0 }; +GLfloat amb0[4] = { 0.0, 0.0, 0.0, 1.0 }; +GLfloat dif0[4] = { 1.0, 1.0, 1.0, 1.0 }; +GLfloat spc0[4] = { 0.0, 1.0, 1.0, 1.0 }; + +GLfloat pos1[4] = { -50.0, 50.0, -50.0, 0.0 }; +GLfloat amb1[4] = { 0.0, 0.0, 0.0, 1.0 }; +GLfloat dif1[4] = { 1.0, 1.0, 1.0, 1.0 }; +GLfloat spc1[4] = { 1.0, 1.0, 1.0, 1.0 }; + +float g = 3.0 * 9.80665; /* hmm, looks like we need more gravity, Scotty... */ + +#define DOPUSH(X, Y) (((X)->count) >= ((X)->size)) ? NULL : ((X)->data[(X)->count++] = (Y)) +#define DOPOP(X) (X)->count <= 0 ? NULL : ((X)->data[--((X)->count)]) + +Disk *push(int idx, Disk * d) +{ + return DOPUSH(&glhanoi->pole[idx], d); +} + +Disk *pop(int idx) +{ + return DOPOP(&glhanoi->pole[idx]); +} + +inline void swap(int *x, int *y) +{ + *x = *x ^ *y; + *y = *x ^ *y; + *x = *x ^ *y; +} + +/* + * magic - it's magic... + */ +int magic(int i) +{ + int count = 0; + if(i <= 1) + return 0; + while((i & 0x01) == 0) { + i >>= 1; + count++; + } + return count % 2 == 0; +} + +float distance(float *p0, float *p1) +{ + float x, y, z; + x = p1[0] - p0[0]; + y = p1[1] - p0[1]; + z = p1[2] - p0[2]; + return (float)sqrt(x * x + y * y + z * z); +} + +GLfloat A(GLfloat a, GLfloat b, GLfloat c) +{ + GLfloat sum = a + b; + return c / (a * b - 0.25 * sum * sum); +} + +void moveSetup(Disk * disk) +{ + float h, ymax; + float u; + int src = glhanoi->src; + int dst = glhanoi->dst; + GLfloat theta; + GLfloat sintheta, costheta; + + if(glhanoi->state != FINISHED && random() % 6 == 0) { + disk->rotAngle = + -180.0 * (2 - 2 * random() % 2) * (random() % 3 + 1); + } else { + disk->rotAngle = -180.0; + } + + disk->base0 = glhanoi->diskPos[glhanoi->pole[src].count]; + disk->base1 = + glhanoi->state == + FINISHED ? disk->base0 : glhanoi->diskPos[glhanoi->pole[dst]. + count]; + + disk->xmin = glhanoi->poleOffset * (src - 1); + disk->xmax = glhanoi->poleOffset * (dst - 1); + disk->ymin = glhanoi->poleHeight; + ymax = + glhanoi->poleHeight + fabs(disk->xmax - + disk->xmin) * (glhanoi->state == + FINISHED ? 1.0 + + (double)(glhanoi-> + numberOfDisks - + disk->id) / + (double)glhanoi-> + numberOfDisks : 1.0); + + h = ymax - disk->ymin; + theta = atan((disk->xmin - disk->xmax) * A(disk->xmin, disk->xmax, h)); + if(theta < 0.0) + theta += M_PI; + costheta = cos(theta); + sintheta = sin(theta); + u = (float) + sqrt(fabs + (-g / + (2.0 * A(disk->xmin, disk->xmax, h) * costheta * costheta))); + disk->usintheta = u * sintheta; + disk->ucostheta = u * costheta; + disk->t1 = + (-u + sqrt(u * u + 2.0 * g * fabs(disk->ymin - disk->base0))) / g; + disk->u1 = u + g * disk->t1; + disk->t2 = 2.0 * disk->usintheta / g; + disk->u2 = disk->usintheta - g * disk->t2; +} + +void makeMove(void) +{ + int fudge = glhanoi->move + 2; + int magicNumber = magic(fudge); + + glhanoi->currentDisk = pop(glhanoi->src); + moveSetup(glhanoi->currentDisk); + push(glhanoi->dst, glhanoi->currentDisk); + fudge = fudge % 2; + + if(fudge == 1 || magicNumber) { + swap(&glhanoi->src, &glhanoi->tmp); + } + if(fudge == 0 || glhanoi->magicNumber) { + swap(&glhanoi->dst, &glhanoi->tmp); + } + glhanoi->magicNumber = magicNumber; +} + +double lerp(double alpha, double start, double end) +{ + return start + alpha * (end - start); +} + +void upfunc(GLdouble t, Disk * d) +{ + d->position[0] = d->xmin; + d->position[1] = d->base0 + (d->u1 - 0.5 * g * t) * t; + + d->rotation[1] = 0.0; +} + +void parafunc(GLdouble t, Disk * d) +{ + d->position[0] = d->xmin + d->ucostheta * t; + d->position[1] = d->ymin + (d->usintheta - 0.5 * g * t) * t; + + d->rotation[1] = + d->rotAngle * (d->position[0] - d->xmin) / (d->xmax - d->xmin); +} + +void downfunc(GLdouble t, Disk * d) +{ + d->position[0] = d->xmax; + d->position[1] = d->ymin + (d->u2 - 0.5 * g * t) * t; + + d->rotation[1] = 0.0; +} + +Bool computePosition(GLfloat t, Disk * d) +{ + Bool finished = FALSE; + + if(t < d->t1) { + upfunc(t, d); + } else if(t < d->t1 + d->t2) { + parafunc(t - d->t1, d); + } else { + downfunc(t - d->t1 - d->t2, d); + if(d->position[1] <= d->base1) { + d->position[1] = d->base1; + finished = TRUE; + } + } + return finished; +} + +void updateView(void) +{ + double longitude, latitude, radius; + double a, b, c, A, B; + + get_position(glhanoi->the_rotator, NULL, NULL, &radius, + !glhanoi->button_down_p); + get_rotation(glhanoi->the_rotator, &longitude, &latitude, NULL, + !glhanoi->button_down_p); + longitude += glhanoi->camera[0]; + latitude += glhanoi->camera[1]; + radius += glhanoi->camera[2]; + longitude = longitude - floor(longitude); + latitude = latitude - floor(latitude); + radius = radius - floor(radius); + if(latitude > 0.5) { + latitude = 1.0 - latitude; + } + if(radius > 0.5) { + radius = 1.0 - radius; + } + + b = glhanoi->centre[1]; + c = (MIN_CAMERA_RADIUS + + radius * (MAX_CAMERA_RADIUS - MIN_CAMERA_RADIUS)); + A = M_PI / 4.0 * (1.0 - latitude); + a = sqrt(b * b + c * c - 2.0 * b * c * cos(A)); + B = asin(sin(A) * b / a); + glRotatef(-B * 180 / M_PI, 1.0, 0.0, 0.0); + + glTranslatef(0.0f, 0.0f, + -(MIN_CAMERA_RADIUS + + radius * (MAX_CAMERA_RADIUS - MIN_CAMERA_RADIUS))); + glRotatef(longitude * 360.0, 0.0f, 1.0f, 0.0f); + glRotatef(latitude * 180.0, cos(longitude * 2.0 * M_PI), 0.0, + sin(longitude * 2.0 * M_PI)); +} + +void changeState(State state) +{ + glhanoi->state = state; + glhanoi->startTime = getTime(); +} + +void update_glhanoi(void) +{ + double t = getTime() - glhanoi->startTime; + int i; + Bool done; + + switch (glhanoi->state) { + case START: + if(t < glhanoi->duration) { + break; + } + glhanoi->move = 0; + if(glhanoi->numberOfDisks % 2 == 0) { + swap(&glhanoi->tmp, &glhanoi->dst); + } + glhanoi->magicNumber = 1; + makeMove(); + changeState(MOVE_DISK); + break; + + case MOVE_DISK: + if(computePosition(t, glhanoi->currentDisk)) { + changeState(MOVE_FINISHED); + } + break; + + case MOVE_FINISHED: + if(++glhanoi->move < glhanoi->numberOfMoves) { + makeMove(); + changeState(MOVE_DISK); + } else { + glhanoi->duration = FINISH_DURATION; + changeState(FINISHED); + } + break; + + case FINISHED: + while(t < glhanoi->duration) { + break; + } + glhanoi->src = glhanoi->olddst; + glhanoi->dst = glhanoi->oldsrc; + for(i = 0; i < glhanoi->numberOfDisks; ++i) { + Disk *disk = pop(glhanoi->src); + assert(disk != NULL); + moveSetup(disk); + } + for(i = glhanoi->maxDiskIdx; i >= 0; --i) { + push(glhanoi->dst, &glhanoi->disk[i]); + } + changeState(MONEY_SHOT); + break; + + case MONEY_SHOT: + done = True; + for(i = glhanoi->maxDiskIdx; i >= 0; --i) { + double delay = 0.25 * i; + int finished; + + if(t - delay < 0) { + done = False; + continue; + } + + finished = computePosition(t - delay, &glhanoi->disk[i]); + glhanoi->disk[i].rotation[1] = 0.0; + + if(!finished) { + done = False; + } + } + if(done) { + glhanoi->src = glhanoi->oldsrc; + glhanoi->tmp = glhanoi->oldtmp; + glhanoi->dst = glhanoi->olddst; + changeState(START); + } + break; + + case INVALID: + default: + fprintf(stderr, "Invalid state\n"); + break; + } +} + +void HSVtoRGBf(GLfloat h, GLfloat s, GLfloat v, + GLfloat * r, GLfloat * g, GLfloat * b) +{ + if(s == 0.0) { + *r = v; + *g = v; + *b = v; + } else { + GLfloat i, f, p, q, t; + if(h >= 360.0) { + h = 0.0; + } + h /= 60.0; /* h now in [0,6). */ + i = floor((double)h); /* i now largest integer <= h */ + f = h - i; /* f is no fractional part of h */ + p = v * (1.0 - s); + q = v * (1.0 - (s * f)); + t = v * (1.0 - (s * (1.0 - f))); + switch ((int)i) { + case 0: + *r = v; + *g = t; + *b = p; + break; + case 1: + *r = q; + *g = v; + *b = p; + break; + case 2: + *r = p; + *g = v; + *b = t; + break; + case 3: + *r = p; + *g = q; + *b = v; + break; + case 4: + *r = t; + *g = p; + *b = v; + break; + case 5: + *r = v; + *g = p; + *b = q; + break; + } + } +} + +void HSVtoRGBv(GLfloat * hsv, GLfloat * rgb) +{ + HSVtoRGBf(hsv[0], hsv[1], hsv[2], &rgb[0], &rgb[1], &rgb[2]); +} + +void setMaterial(GLfloat color[3], GLfloat hlite[3], int shininess) +{ + glColor3fv(color); + glMaterialfv(GL_FRONT, GL_SPECULAR, hlite); + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color); + glMateriali(GL_FRONT, GL_SHININESS, shininess); /* [0,128] */ +} + +/* + * drawTube: I know all this stuff is available in gluQuadrics + * but I'd originally intended to texture the poles with a 3D wood + * texture, but I was having difficulty getting wood... what? Why + * are all you Amercians laughing..? Anyway, I don't know if enough + * people's hardware supports 3D textures, so I didn't bother (xorg + * ATI server doesn't :-( ) + */ +void drawTube(GLdouble bottomRadius, GLdouble topRadius, + GLdouble bottomThickness, GLdouble topThickness, + GLdouble height, GLuint nSlice, GLuint nLoop) +{ + GLfloat y; + GLfloat *cosCache = malloc(sizeof(GLfloat) * nSlice); + GLfloat *sinCache = malloc(sizeof(GLfloat) * nSlice); + GLint slice; + GLuint loop; + GLint lastSlice = nSlice - 1; + GLfloat radius; + GLfloat innerRadius; + GLfloat maxRadius; + + if(bottomThickness > bottomRadius) { + bottomThickness = bottomRadius; + } + if(topThickness > topRadius) { + topThickness = topRadius; + } + if(bottomThickness < 0.0) { + bottomThickness = 0.0; + } + if(topThickness < 0.0) { + topThickness = 0.0; + } + if(topRadius >= bottomRadius) { + maxRadius = topRadius; + } else { + maxRadius = bottomRadius; + } + + /* bottom */ + y = 0.0; + radius = bottomRadius; + innerRadius = bottomRadius - bottomThickness; + /* innerTexCoordSize = texCoordSize * innerRadius / maxRadius; */ + /* outerTexCoordSize = texCoordSize * radius / maxRadius; */ + /* yTexCoord = minTexCoord; */ + + glBegin(GL_QUAD_STRIP); + + glNormal3f(0.0, -1.0, 0.0); + + /* glTexCoord3f(midTexCoord, yTexCoord, midTexCoord + innerTexCoordSize); */ + glVertex3f(0.0, y, innerRadius); + + /* glTexCoord3f(midTexCoord, yTexCoord, midTexCoord + outerTexCoordSize); */ + glVertex3f(0.0, y, radius); + + for(slice = lastSlice; slice >= 0; --slice) { + GLfloat theta = 2.0 * M_PI * (double)slice / nSlice; + + cosCache[slice] = cos(theta); + sinCache[slice] = sin(theta); + + /* glTexCoord3f(midTexCoord + sinCache[slice] * innerTexCoordSize, */ + /* yTexCoord, */ + /* midTexCoord + cosCache[slice] * innerTexCoordSize); */ + glVertex3f(innerRadius * sinCache[slice], y, + innerRadius * cosCache[slice]); + /* glTexCoord3f(midTexCoord + sinCache[slice] * outerTexCoordSize, */ + /* yTexCoord, */ + /* midTexCoord + cosCache[slice] * outerTexCoordSize); */ + glVertex3f(radius * sinCache[slice], y, radius * cosCache[slice]); + } + glEnd(); + + /* middle */ + for(loop = 0; loop < nLoop; ++loop) { + GLfloat lowerRadius = + bottomRadius + (topRadius - + bottomRadius) * (float)loop / (nLoop); + GLfloat upperRadius = + bottomRadius + (topRadius - bottomRadius) * (float)(loop + + 1) / + (nLoop); + GLfloat lowerY = height * (float)loop / (nLoop); + GLfloat upperY = height * (float)(loop + 1) / (nLoop); + GLfloat factor = (topRadius - topThickness) - + (bottomRadius - bottomThickness); + + /* outside */ + glBegin(GL_QUAD_STRIP); + for(slice = 0; slice < nSlice; ++slice) { + glNormal3f(sinCache[slice], 0.0, cosCache[slice]); + glVertex3f(upperRadius * sinCache[slice], upperY, + upperRadius * cosCache[slice]); + glVertex3f(lowerRadius * sinCache[slice], lowerY, + lowerRadius * cosCache[slice]); + } + glNormal3f(0.0, 0.0, 1.0); + glVertex3f(0.0, upperY, upperRadius); + glVertex3f(0.0, lowerY, lowerRadius); + glEnd(); + + /* inside */ + lowerRadius = bottomRadius - bottomThickness + + factor * (float)loop / (nLoop); + upperRadius = bottomRadius - bottomThickness + + factor * (float)(loop + 1) / (nLoop); + + glBegin(GL_QUAD_STRIP); + glNormal3f(0.0, 0.0, -1.0); + glVertex3f(0.0, upperY, upperRadius); + glVertex3f(0.0, lowerY, lowerRadius); + for(slice = lastSlice; slice >= 0; --slice) { + glNormal3f(-sinCache[slice], 0.0, -cosCache[slice]); + glVertex3f(upperRadius * sinCache[slice], upperY, + upperRadius * cosCache[slice]); + glVertex3f(lowerRadius * sinCache[slice], lowerY, + lowerRadius * cosCache[slice]); + } + glEnd(); + } + + /* top */ + y = height; + radius = topRadius; + innerRadius = topRadius - topThickness; + + glBegin(GL_QUAD_STRIP); + glNormal3f(0.0, 1.0, 0.0); + for(slice = 0; slice < nSlice; ++slice) { + glVertex3f(innerRadius * sinCache[slice], y, + innerRadius * cosCache[slice]); + + glVertex3f(radius * sinCache[slice], y, radius * cosCache[slice]); + } + glVertex3f(0.0, y, innerRadius); + glVertex3f(0.0, y, radius); + glEnd(); +} + +void drawPole(GLfloat radius, GLfloat length) +{ + drawTube(radius, radius, radius, radius, length, NSLICE, NLOOPS); +} + +void drawDisk3D(GLdouble inner_radius, GLdouble outer_radius, + GLdouble height) +{ + drawTube(outer_radius, outer_radius, outer_radius - inner_radius, + outer_radius - inner_radius, height, NSLICE, NLOOPS); +} + +void drawCuboid(GLfloat length, GLfloat width, GLfloat height) +{ + GLfloat xmin = -length / 2.0f; + GLfloat xmax = length / 2.0f; + GLfloat zmin = -width / 2.0f; + GLfloat zmax = width / 2.0f; + GLfloat ymin = 0.0f; + GLfloat ymax = height; + + glBegin(GL_QUADS); + /* front */ + glNormal3fv(front); + glVertex3f(xmin, ymin, zmax); /* 0 */ + glVertex3f(xmax, ymin, zmax); /* 1 */ + glVertex3f(xmax, ymax, zmax); /* 2 */ + glVertex3f(xmin, ymax, zmax); /* 3 */ + /* right */ + glNormal3fv(right); + glVertex3f(xmax, ymin, zmax); /* 1 */ + glVertex3f(xmax, ymin, zmin); /* 5 */ + glVertex3f(xmax, ymax, zmin); /* 6 */ + glVertex3f(xmax, ymax, zmax); /* 2 */ + /* back */ + glNormal3fv(back); + glVertex3f(xmax, ymin, zmin); /* 5 */ + glVertex3f(xmin, ymin, zmin); /* 4 */ + glVertex3f(xmin, ymax, zmin); /* 7 */ + glVertex3f(xmax, ymax, zmin); /* 6 */ + /* left */ + glNormal3fv(left); + glVertex3f(xmin, ymin, zmin); /* 4 */ + glVertex3f(xmin, ymin, zmax); /* 0 */ + glVertex3f(xmin, ymax, zmax); /* 3 */ + glVertex3f(xmin, ymax, zmin); /* 7 */ + /* top */ + glNormal3fv(up); + glVertex3f(xmin, ymax, zmax); /* 3 */ + glVertex3f(xmax, ymax, zmax); /* 2 */ + glVertex3f(xmax, ymax, zmin); /* 6 */ + glVertex3f(xmin, ymax, zmin); /* 7 */ + /* bottom */ + glNormal3fv(down); + glVertex3f(xmin, ymin, zmin); /* 4 */ + glVertex3f(xmax, ymin, zmin); /* 5 */ + glVertex3f(xmax, ymin, zmax); /* 1 */ + glVertex3f(xmin, ymin, zmax); /* 0 */ + glEnd(); +} + +void drawDisks(void) +{ + int i; + + glPushMatrix(); + glTranslatef(0.0f, glhanoi->baseHeight, 0.0f); + for(i = glhanoi->maxDiskIdx; i >= 0; i--) { + Disk *disk = &glhanoi->disk[i]; + GLfloat *pos = disk->position; + GLfloat *rot = disk->rotation; + + glPushMatrix(); + glTranslatef(pos[0], pos[1], pos[2]); + if(rot[1] != 0.0) { + glTranslatef(0.0, glhanoi->diskHeight / 2.0, 0.0); + glRotatef(rot[1], 0.0, 0.0, 1.0); + glTranslatef(0.0, -glhanoi->diskHeight / 2.0, 0.0); + } + glCallList(disk->displayList); + glPopMatrix(); + } + glPopMatrix(); +} + +GLfloat getDiskRadius(int i) +{ + return ((GLfloat) i + 3.0) * glhanoi->poleRadius; +} + +void initData(void) +{ + GLfloat maxDiskRadius; + int i; + + glhanoi->baseLength = BASE_LENGTH; + glhanoi->poleRadius = glhanoi->baseLength / + (2.0 * (3 * glhanoi->numberOfDisks + 7.0)); + maxDiskRadius = getDiskRadius(glhanoi->numberOfDisks); + glhanoi->baseWidth = 2.0 * maxDiskRadius; + glhanoi->poleOffset = 2.0 * getDiskRadius(glhanoi->maxDiskIdx); + glhanoi->diskHeight = 2.0 * glhanoi->poleRadius; + glhanoi->baseHeight = 2.0 * glhanoi->poleRadius; + glhanoi->poleHeight = glhanoi->numberOfDisks * + glhanoi->diskHeight + glhanoi->poleRadius; + glhanoi->numberOfMoves = (1 << glhanoi->numberOfDisks) - 1; + glhanoi->boardSize = glhanoi->baseLength * 0.5 * (1.0 + sqrt(5.0)); + + for(i = 0; i < 3; i++) { + if((glhanoi->pole[i].data = + calloc(glhanoi->numberOfDisks, sizeof(Disk *))) == NULL) { + fprintf(stderr, "%s: out of memory creating stack %d\n", + progname, i); + exit(1); + } + glhanoi->pole[i].size = glhanoi->numberOfDisks; + } + if((glhanoi->diskPos = + calloc(glhanoi->numberOfDisks, sizeof(double))) == NULL) { + fprintf(stderr, "%s: out of memory creating diskPos\n", progname); + exit(1); + } + + glhanoi->the_rotator = make_rotator(0.1, 0.025, 0, 1, 0.005, False); + glhanoi->button_down_p = False; + + glhanoi->src = glhanoi->oldsrc = 0; + glhanoi->tmp = glhanoi->oldtmp = 1; + glhanoi->dst = glhanoi->olddst = 2; +} + +void initView(void) +{ + glhanoi->camera[0] = 0.0; + glhanoi->camera[1] = 0.0; + glhanoi->camera[2] = 0.0; + glhanoi->centre[0] = 0.0; + glhanoi->centre[1] = glhanoi->poleHeight * 3.0; + glhanoi->centre[2] = 0.0; +} + +/* + * noise_improved.c - based on ImprovedNoise.java + * JAVA REFERENCE IMPLEMENTATION OF IMPROVED NOISE - COPYRIGHT 2002 KEN PERLIN. + */ +static double fade(double t) +{ + return t * t * t * (t * (t * 6 - 15) + 10); +} + +static double grad(int hash, double x, double y, double z) +{ + int h = hash & 15; /* CONVERT LO 4 BITS OF HASH CODE */ + double u = h < 8 ? x : y, /* INTO 12 GRADIENT DIRECTIONS. */ + v = h < 4 ? y : h == 12 || h == 14 ? x : z; + return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v); +} + +static int p[512], permutation[] = { 151, 160, 137, 91, 90, 15, + 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, + 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, + 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, + 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, + 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, + 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, + 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, + 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, + 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, + 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, + 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, + 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, + 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, + 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, + 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, + 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, + 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, + 156, 180 +}; + +static void initNoise(void) +{ + int i; + for(i = 0; i < 256; i++) + p[256 + i] = p[i] = permutation[i]; +} + +double improved_noise(double x, double y, double z) +{ + double u, v, w; + int A, AA, AB, B, BA, BB; + int X = (int)floor(x) & 255, /* FIND UNIT CUBE THAT */ + Y = (int)floor(y) & 255, /* CONTAINS POINT. */ + Z = (int)floor(z) & 255; + static int start = 0; + if(start == 0) { + initNoise(); + start = 1; + } + x -= floor(x); /* FIND RELATIVE X,Y,Z */ + y -= floor(y); /* OF POINT IN CUBE. */ + z -= floor(z); + u = fade(x), /* COMPUTE FADE CURVES */ + v = fade(y), /* FOR EACH OF X,Y,Z. */ + w = fade(z); + A = p[X] + Y, AA = p[A] + Z, AB = p[A + 1] + Z, /* HASH COORDINATES OF */ + B = p[X + 1] + Y, BA = p[B] + Z, BB = p[B + 1] + Z; /* THE 8 CUBE CORNERS, */ + return lerp(w, lerp(v, lerp(u, grad(p[AA], x, y, z), /* AND ADD */ + grad(p[BA], x - 1, y, z)), /* BLENDED */ + lerp(u, grad(p[AB], x, y - 1, z), /* RESULTS */ + grad(p[BB], x - 1, y - 1, z))), /* FROM 8 CORNERS */ + lerp(v, lerp(u, grad(p[AA + 1], x, y, z - 1), grad(p[BA + 1], x - 1, y, z - 1)), /* OF CUBE */ + lerp(u, grad(p[AB + 1], x, y - 1, z - 1), + grad(p[BB + 1], x - 1, y - 1, z - 1)))); +} + +/* + * end noise_improved.c - based on ImprovedNoise.java + */ + +struct tex_col_t { + GLuint *colours; + /* GLfloat *points; */ + unsigned int ncols; +}; +typedef struct tex_col_t tex_col_t; + +GLubyte *makeTexture(int x_size, int y_size, int z_size, + GLuint(*texFunc) (double, double, double, + tex_col_t *), tex_col_t * colours) +{ + int i, j, k; + GLubyte *textureData; + GLuint *texturePtr; + double x, y, z; + double xi, yi, zi; + + if((textureData = + calloc(x_size * y_size * z_size, sizeof(GLuint))) == NULL) { + return NULL; + } + + xi = 1.0 / x_size; + yi = 1.0 / y_size; + zi = 1.0 / z_size; + + z = 0.0; + texturePtr = (void *)textureData; + for(k = 0; k < z_size; k++, z += zi) { + y = 0.0; + for(j = 0; j < y_size; j++, y += yi) { + x = 0.0; + for(i = 0; i < x_size; i++, x += xi) { + *texturePtr = texFunc(x, y, z, colours); + ++texturePtr; + } + } + } + return textureData; +} + +tex_col_t makeMarbleColours(void) +{ + tex_col_t marbleColours; + int ncols = 2; + + marbleColours.colours = calloc(sizeof(GLuint), ncols); + marbleColours.ncols = ncols; + + marbleColours.colours[0] = 0x3f3f3f3f; + marbleColours.colours[1] = 0xffffffff; + + return marbleColours; +} + +double turb(double x, double y, double z, int octaves) +{ + int oct, freq = 1; + double r = 0.0; + + for(oct = 0; oct < octaves; ++oct) { + r += fabs(improved_noise(freq * x, freq * y, freq * z)) / freq; + freq <<= 1; + } + return r / 2.0; +} + +void perturb(double *x, double *y, double *z, double scale) +{ + double t = scale * turb(*x, *y, *z, 4); + *x += t; + *y += t; + *z += t; +} + +double f_m(double x, double y, double z) +{ + return sin(3.0 * M_PI * x); +} + +GLuint C_m(double x, const tex_col_t * tex_cols) +{ + int r = tex_cols->colours[0] & 0xff; + int g = tex_cols->colours[0] >> 8 & 0xff; + int b = tex_cols->colours[0] >> 16 & 0xff; + double factor; + int r1, g1, b1; + x = x - floor(x); + + factor = (1.0 + sin(2.0 * M_PI * x)) / 2.0; + + r1 = (tex_cols->colours[1] & 0xff); + g1 = (tex_cols->colours[1] >> 8 & 0xff); + b1 = (tex_cols->colours[1] >> 16 & 0xff); + + r += (int)(factor * (r1 - r)); + g += (int)(factor * (g1 - g)); + b += (int)(factor * (b1 - b)); + + return 0xff000000 | (b << 16) | (g << 8) | r; +} + + +GLuint makeMarbleTexture(double x, double y, double z, tex_col_t * colours) +{ + perturb(&x, &y, &z, MARBLE_SCALE); + return C_m(f_m(x, y, z), colours); +} + +void setTexture(int n) +{ + glBindTexture(GL_TEXTURE_2D, glhanoi->textureNames[n]); +} + +int makeTextures(void) +{ + GLubyte *marbleTexture; + tex_col_t marbleColours; + + glGenTextures(N_TEXTURES, glhanoi->textureNames); + + marbleColours = makeMarbleColours(); + if((marbleTexture = + makeTexture(MARBLE_TEXTURE_SIZE, MARBLE_TEXTURE_SIZE, 1, + makeMarbleTexture, &marbleColours)) == NULL) { + return 1; + } + + glBindTexture(GL_TEXTURE_2D, glhanoi->textureNames[0]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, + MARBLE_TEXTURE_SIZE, MARBLE_TEXTURE_SIZE, 0, + GL_RGBA, GL_UNSIGNED_BYTE, marbleTexture); + free(marbleTexture); + + return 0; +} + +void initFloor(void) +{ + int i, j; + float tileSize = glhanoi->boardSize / BOARD_SQUARES; + float x0, x1, z0, z1; + float tx0, tx1, tz0, tz1; + float *col = cWhite; + float texIncr = 1.0 / BOARD_SQUARES; + + if((glhanoi->floorList = glGenLists(1)) == 0) { + fprintf(stderr, "can't allocate memory for floor display list\n"); + exit(EXIT_FAILURE); + } + glNewList(glhanoi->floorList, GL_COMPILE); + x0 = -glhanoi->boardSize / 2.0; + tx0 = 0.0f; + setMaterial(col, cWhite, 128); + setTexture(0); + glNormal3fv(up); + for(i = 0; i < BOARD_SQUARES; i++, x0 += tileSize, tx0 += texIncr) { + x1 = x0 + tileSize; + tx1 = tx0 + texIncr; + z0 = -glhanoi->boardSize / 2.0; + tz0 = 0.0f; + for(j = 0; j < BOARD_SQUARES; j++, z0 += tileSize, tz0 += texIncr) { + int colIndex = (i + j) & 0x1; + + z1 = z0 + tileSize; + tz1 = tz0 + texIncr; + + if(colIndex) + col = cWhite; + else + col = cBlack; + + setMaterial(col, cWhite, 100); + + glBegin(GL_QUADS); + + glTexCoord2d(tx0, tz0); + glVertex3f(x0, 0.0, z0); + + glTexCoord2d(tx0, tz1); + glVertex3f(x0, 0.0, z1); + + glTexCoord2d(tx1, tz1); + glVertex3f(x1, 0.0, z1); + + glTexCoord2d(tx1, tz0); + glVertex3f(x1, 0.0, z0); + glEnd(); + } + } + glEndList(); +} + +void initTowers(void) +{ + if((glhanoi->baseList = glGenLists(1)) == 0) { + fprintf(stderr, "can't allocate memory for towers display list\n"); + exit(EXIT_FAILURE); + } + glNewList(glhanoi->baseList, GL_COMPILE); + setMaterial(baseColor, cWhite, 50); + drawCuboid(glhanoi->baseLength, glhanoi->baseWidth, + glhanoi->baseHeight); + glEndList(); + + + if((glhanoi->poleList = glGenLists(1)) == 0) { + fprintf(stderr, "can't allocate memory for towers display list\n"); + exit(EXIT_FAILURE); + } + glNewList(glhanoi->poleList, GL_COMPILE); + glPushMatrix(); + glTranslatef(0.0f, glhanoi->baseHeight, 0.0f); + setMaterial(poleColor, cWhite, 50); + drawPole(glhanoi->poleRadius, glhanoi->poleHeight); + glPushMatrix(); + glTranslatef(-glhanoi->poleOffset, 0.0, 0.0); + drawPole(glhanoi->poleRadius, glhanoi->poleHeight); + glPopMatrix(); + glTranslatef(glhanoi->poleOffset, 0.0, 0.0); + drawPole(glhanoi->poleRadius, glhanoi->poleHeight); + glPopMatrix(); + glEndList(); +} + +double cfunc(double x) +{ +#define COMP < + if(x < 2.0 / 7.0) { + return (1.0 / 12.0) / (1.0 / 7.0) * x; + } + if(x < 3.0 / 7.0) { + return (1.0 + 1.0 / 6.0) * x - 1.0 / 6.0; + } + if(x < 4.0 / 7.0) { + return (2.0 + 1.0 / 3.0) * x - 2.0 / 3.0; + } + if(x < 5.0 / 7.0) { + return (1.0 / 12.0) / (1.0 / 7.0) * x + 1.0 / 3.0; + } + return (1.0 / 12.0) / (1.0 / 7.0) * x + 1.0 / 3.0; +} + +void initDisks(void) +{ + int i; + if((glhanoi->disk = + (Disk *) calloc(glhanoi->numberOfDisks, sizeof(Disk))) == NULL) { + perror("initDisks"); + exit(EXIT_FAILURE); + } + + for(i = glhanoi->maxDiskIdx; i >= 0; i--) { + GLfloat height = (GLfloat) (glhanoi->maxDiskIdx - i); + double f = cfunc((GLfloat) i / (GLfloat) glhanoi->numberOfDisks); + GLfloat diskColor = f * 360.0; + GLfloat color[3]; + Disk *disk = &glhanoi->disk[i]; + + disk->id = i; + disk->position[0] = -glhanoi->poleOffset; + disk->position[1] = glhanoi->diskHeight * height; + disk->position[2] = 0.0; + disk->rotation[0] = 0.0; + disk->rotation[1] = 0.0; + disk->rotation[2] = 0.0; + + color[0] = diskColor; + color[1] = 1.0f; + color[2] = 1.0f; + HSVtoRGBv(color, color); + + if((disk->displayList = glGenLists(1)) == 0) { + fprintf(stderr, + "can't allocate memory for disk %d display list\n", i); + exit(EXIT_FAILURE); + } + glNewList(disk->displayList, GL_COMPILE); + setMaterial(color, cWhite, 100.0); + drawDisk3D(glhanoi->poleRadius, getDiskRadius(i), + glhanoi->diskHeight); + glEndList(); + } + for(i = glhanoi->maxDiskIdx; i >= 0; --i) { + GLfloat height = (GLfloat) (glhanoi->maxDiskIdx - i); + int h = glhanoi->maxDiskIdx - i; + glhanoi->diskPos[h] = glhanoi->diskHeight * height; + push(glhanoi->src, &glhanoi->disk[i]); + } +} + +void initLights(Bool state) +{ + if(state) { + glLightfv(GL_LIGHT0, GL_POSITION, pos0); + glLightfv(GL_LIGHT0, GL_AMBIENT, amb0); + glLightfv(GL_LIGHT0, GL_DIFFUSE, dif0); + glLightfv(GL_LIGHT0, GL_SPECULAR, spc0); + + glLightfv(GL_LIGHT1, GL_POSITION, pos1); + glLightfv(GL_LIGHT1, GL_AMBIENT, amb1); + glLightfv(GL_LIGHT1, GL_DIFFUSE, dif1); + glLightfv(GL_LIGHT1, GL_SPECULAR, spc1); + + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_LIGHT1); + } else { + glDisable(GL_LIGHTING); + } +} + +void drawFloor(void) +{ + glCallList(glhanoi->floorList); +} + +void drawTowers(void) +{ + glCallList(glhanoi->baseList); + glCallList(glhanoi->poleList); +} + +/* Window management, etc + */ +void reshape_glhanoi(ModeInfo * mi, int width, int height) +{ + glViewport(0, 0, (GLint) width, (GLint) height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(30.0, (GLdouble) width / (GLdouble) height, 1.0, + 2 * MAX_CAMERA_RADIUS); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glClear(GL_COLOR_BUFFER_BIT); +} + +void init_glhanoi(ModeInfo * mi) +{ + if(!glhanoi_cfg) { + glhanoi_cfg = + (glhcfg *) calloc(MI_NUM_SCREENS(mi), sizeof(glhcfg)); + if(!glhanoi_cfg) { + fprintf(stderr, "%s: out of memory creating configs\n", + progname); + exit(1); + } + glhanoi = &glhanoi_cfg[MI_SCREEN(mi)]; + } + + glhanoi = &glhanoi_cfg[MI_SCREEN(mi)]; + glhanoi->glx_context = init_GL(mi); + glhanoi->numberOfDisks = MI_BATCHCOUNT(mi); + glhanoi->maxDiskIdx = glhanoi->numberOfDisks - 1; + glhanoi->wire = MI_IS_WIREFRAME(mi); + glhanoi->light = light; + glhanoi->fog = fog; + glhanoi->texture = texture; + + reshape_glhanoi(mi, MI_WIDTH(mi), MI_HEIGHT(mi)); + + if(glhanoi->wire) { + glhanoi->light = FALSE; + glhanoi->fog = FALSE; + glhanoi->texture = FALSE; + } + + initLights(!glhanoi->wire && glhanoi->light); + if(makeTextures() != 0) { + fprintf(stderr, "can't allocate memory for marble texture\n"); + exit(EXIT_FAILURE); + } + + initData(); + initView(); + initFloor(); + initTowers(); + initDisks(); + + glEnable(GL_DEPTH_TEST); + glEnable(GL_NORMALIZE); + glEnable(GL_CULL_FACE); + glShadeModel(GL_SMOOTH); + if(glhanoi->fog) { + glClearColor(fogcolor[0], fogcolor[1], fogcolor[2], 1.0); + glFogi(GL_FOG_MODE, GL_LINEAR); + glFogfv(GL_FOG_COLOR, fogcolor); + glFogf(GL_FOG_DENSITY, 0.35f); + glHint(GL_FOG_HINT, GL_NICEST); + glFogf(GL_FOG_START, MIN_CAMERA_RADIUS); + glFogf(GL_FOG_END, MAX_CAMERA_RADIUS / 1.9); + glEnable(GL_FOG); + } + + + glhanoi->duration = START_DURATION; + changeState(START); +} + +void draw_glhanoi(ModeInfo * mi) +{ + Display *dpy = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + + glhanoi = &glhanoi_cfg[MI_SCREEN(mi)]; + + if(!glhanoi->glx_context) + return; + glPolygonMode(GL_FRONT, glhanoi->wire ? GL_LINE : GL_FILL); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glLoadIdentity(); + + update_glhanoi(); + updateView(); + + if(!glhanoi->wire && glhanoi->texture) { + glEnable(GL_TEXTURE_2D); + } + drawFloor(); + glDisable(GL_TEXTURE_2D); + + drawTowers(); + drawDisks(); + + if(mi->fps_p) { + do_fps(mi); + } + glFinish(); + + glXSwapBuffers(dpy, window); +} + +Bool glhanoi_handle_event(ModeInfo * mi, XEvent * event) +{ + glhcfg *glhanoi = &glhanoi_cfg[MI_SCREEN(mi)]; + + if(event->xany.type == ButtonPress && event->xbutton.button == Button1) { + glhanoi->button_down_p = True; + glhanoi->drag_x = event->xbutton.x; + glhanoi->drag_y = event->xbutton.y; + return True; + } else if(event->xany.type == ButtonRelease + && event->xbutton.button == Button1) { + glhanoi->button_down_p = False; + return True; + } else if(event->xany.type == ButtonPress && + (event->xbutton.button == Button4 + || event->xbutton.button == Button5)) { + switch (event->xbutton.button) { + case Button4: + glhanoi->camera[2] += 0.01; + break; + case Button5: + glhanoi->camera[2] -= 0.01; + break; + default: + fprintf(stderr, + "glhanoi: unknown button in mousewheel handler\n"); + } + return True; + } else if(event->xany.type == MotionNotify + && glhanoi_cfg->button_down_p) { + int x_diff, y_diff; + + x_diff = event->xbutton.x - glhanoi->drag_x; + y_diff = event->xbutton.y - glhanoi->drag_y; + + glhanoi->camera[0] = (float)x_diff / (float)MI_WIDTH(mi); + glhanoi->camera[1] = (float)y_diff / (float)MI_HEIGHT(mi); + + return True; + } + return False; +} + +void release_glhanoi(ModeInfo * mi) +{ + if(glhanoi_cfg != NULL) { + int screen; + for(screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { + int i; + int j; + glhcfg *glh = &glhanoi_cfg[screen]; + glDeleteLists(glh->floorList, 1); + glDeleteLists(glh->baseList, 1); + glDeleteLists(glh->poleList, 1); + for(j = 0; j < glh->numberOfDisks; ++j) { + glDeleteLists(glh->disk[j].displayList, 1); + } + free(glh->disk); + for(i = 0; i < 3; i++) { + if(glh->pole[i].data != NULL) { + free(glh->pole[i].data); + } + } + } + } + free(glhanoi_cfg); + glhanoi_cfg = NULL; + glDeleteLists(glhanoi->textureNames[0], 2); +} + +#endif /* USE_GL */ diff --git a/hacks/ant.man b/hacks/glx/glhanoi.man similarity index 52% rename from hacks/ant.man rename to hacks/glx/glhanoi.man index ed255763..789b03ae 100644 --- a/hacks/ant.man +++ b/hacks/glx/glhanoi.man @@ -1,35 +1,23 @@ .TH XScreenSaver 1 "" "X Version 11" .SH NAME -ant - cellular automaton. +glhanoi - OpenGL Towers of Hanoi .SH SYNOPSIS -.B ant +.B glhanoi [\-display \fIhost:display.screen\fP] [\-visual \fIvisual\fP] [\-window] -[\-install] -[\-noinstall] [\-root] -[\-eyes] -[\-no-eyes] -[\-truchet] -[\-no-truchet] -[\-sharpturn] -[\-no-sharpturn] [\-delay \fInumber\fP] -[\-cycles \fInumber\fP] [\-count \fInumber\fP] -[\-size \fInumber\fP] -[\-neighbors 3] -[\-neighbors 4] -[\-neighbors 6] -[\-neighbors 9] -[\-neighbors 12] -[\-ncolors \fInumber\fP] +[\-speed \fInumber\fP] +[\-rotspeed \fInumber\fP] +[\-wireframe] +[\-light] +[\-texture] +[\-fog] +[\-fps] .SH DESCRIPTION -A cellular automaton that is really a two-dimensional Turing machine: as -the heads ("ants") walk along the screen, they change pixel values in -their path. Then, as they pass over changed pixels, their behavior is -influenced. +Implementation of Towers of Hanoi in OpenGL .SH OPTIONS .TP 8 .B \-visual \fIvisual\fP @@ -42,32 +30,32 @@ Draw on a newly-created window. This is the default. .B \-root Draw on the root window. .TP 8 -.B \-sharpturns | \-no-sharpturns -Whether to do sharp turns. +.B \-delay \fInumber\fP +Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.). .TP 8 -.B \-truchet | \-no-truchet -Whether to use truchet lines. +.B \-speed \fInumber\fP +Speed of disk animation. Default: 12.0 er, units per second. Let's call them metres. .TP 8 -.B \-eyes | \-no-eyes -Whether to draw eyes on the ants. +.B \-rotspeed \fInumber\fP +Speed of disk animation. Default: 0.1 rads per second. .TP 8 -.B \-delay \fInumber\fP -Per-frame delay, in microseconds. Default: 1000 (0.0001 seconds.). +.B \-count \fInumber\fP +Number of disks. Default: 7. .TP 8 -.B \-cycles \fInumber\fP -How long to wait until resetting. 0 - 800000. Default: 40000. +.B \-wireframe | \-no-wireframe +Render in wireframe instead of solid. .TP 8 -.B \-count \fInumber\fP -Ants Count. -20 - 20. Default: -3. +.B \-fog | \-no-fog +Render in fog. .TP 8 -.B \-size \fInumber\fP -Ant Size. -18 - 18. Default: -12. +.B \-fps | \-no-fps +Whether to show a frames-per-second display at the bottom of the screen. .TP 8 -.B \-neighbors \fIN\fP -How many neighbors each cell has. Legal values are 3, 4, 6, 9, and 12. +.B \-light | -no-light +Whether the scene is lit. .TP 8 -.B \-ncolors \fInumber\fP -Number of colors. Default: 64. +.B \-texture | \-no-texture +Render with textures instead of solid. .SH ENVIRONMENT .PP .TP 8 @@ -81,7 +69,7 @@ stored in the RESOURCE_MANAGER property. .BR X (1), .BR xscreensaver (1) .SH COPYRIGHT -Copyright \(co 2002 by David Bagley. Permission to use, copy, modify, +Copyright \(co 2004 by Dave Atkinson. 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 @@ -89,4 +77,4 @@ appear in supporting documentation. No representations are made about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. .SH AUTHOR -David Bagley. +Dave Atkinson. diff --git a/hacks/glx/gltrackball.c b/hacks/glx/gltrackball.c index 42b4c296..712288fc 100644 --- a/hacks/glx/gltrackball.c +++ b/hacks/glx/gltrackball.c @@ -107,3 +107,11 @@ gltrackball_mousewheel (trackball_state *ts, else gltrackball_track (ts, 50, 50*move, 100, 100); } + +void +gltrackball_get_quaternion (trackball_state *ts, float q[4]) +{ + int i; + for (i=0; i<4; i++) + q[i] = ts->q[i]; +} diff --git a/hacks/glx/gltrackball.h b/hacks/glx/gltrackball.h index 3d8ef667..966db04a 100644 --- a/hacks/glx/gltrackball.h +++ b/hacks/glx/gltrackball.h @@ -45,5 +45,9 @@ extern void gltrackball_rotate (trackball_state *); void gltrackball_mousewheel (trackball_state *ts, int button, int percent, int horizontal_p); +/* Return the quaternion encapsulated by the trackball state. + */ +extern void gltrackball_get_quaternion (trackball_state *ts, float q[4]); + #endif /* __GLTRACKBALL_H__ */ diff --git a/hacks/glx/grab-ximage.c b/hacks/glx/grab-ximage.c index f7e44873..b1c1cf45 100644 --- a/hacks/glx/grab-ximage.c +++ b/hacks/glx/grab-ximage.c @@ -141,6 +141,13 @@ convert_ximage_to_rgba32 (Screen *screen, XImage *image) 0); to->data = (char *) calloc (to->height, to->bytes_per_line); + /* Set the bit order in the XImage structure to whatever the + local host's native bit order is. + */ + to->bitmap_bit_order = + to->byte_order = + (bigendian() ? MSBFirst : LSBFirst); + if (visual_class (screen, visual) == PseudoColor || visual_class (screen, visual) == GrayScale) { diff --git a/hacks/glx/hypertorus.c b/hacks/glx/hypertorus.c index 931d24cc..465b261f 100644 --- a/hacks/glx/hypertorus.c +++ b/hacks/glx/hypertorus.c @@ -1,10 +1,10 @@ /* hypertorus --- Shows a hypertorus that rotates in 4d */ #if 0 -static const char sccsid[] = "@(#)hypertorus.c 1.1 03/05/18 xlockmore"; +static const char sccsid[] = "@(#)hypertorus.c 1.2 05/09/28 xlockmore"; #endif -/* Copyright (c) 2003 Carsten Steger . */ +/* Copyright (c) 2003-2005 Carsten Steger . */ /* * Permission to use, copy, modify, and distribute this software and its @@ -21,6 +21,8 @@ static const char sccsid[] = "@(#)hypertorus.c 1.1 03/05/18 xlockmore"; * * REVISION HISTORY: * C. Steger - 03/05/18: Initial version + * C. Steger - 05/09/28: Added the spirals appearance mode + * and trackball support */ /* @@ -33,83 +35,98 @@ static const char sccsid[] = "@(#)hypertorus.c 1.1 03/05/18 xlockmore"; * projected 3d torus can then be projected to the screen either perspectively * or orthographically. There are three display modes for the torus: mesh * (wireframe), solid, or transparent. Furthermore, the appearance of the - * torus can be as a solid object or as a set of see-through bands. Finally, - * the colors with with the torus is drawn can be set to either two-sided or - * to colorwheel. In the first case, the torus is drawn with red on the - * outside and green on the inside. This mode enables you to see that the - * torus turns inside-out as it rotates in 4d. The second mode draws the - * torus in a fully saturated color wheel. This gives a very nice effect - * when combined with the see-through bands mode. The rotation speed for - * each of the six planes around which the torus rotates can be chosen. - * This program is very much inspired by Thomas Banchoff's book "Beyond the - * Third Dimension: Geometry, Computer Graphics, and Higher Dimensions", - * Scientific American Library, 1990. + * torus can be as a solid object or as a set of see-through bands or + * see-through spirals. Finally, the colors with with the torus is drawn can + * be set to either two-sided or to colorwheel. In the first case, the torus + * is drawn with red on the outside and green on the inside. This mode + * enables you to see that the torus turns inside-out as it rotates in 4d. + * The second mode draws the torus in a fully saturated color wheel. This + * gives a very nice effect when combined with the see-through bands or + * see-through spirals mode. The rotation speed for each of the six planes + * around which the torus rotates can be chosen. This program is very much + * inspired by Thomas Banchoff's book "Beyond the Third Dimension: Geometry, + * Computer Graphics, and Higher Dimensions", Scientific American Library, + * 1990. */ #ifndef M_PI #define M_PI 3.14159265358979323846 #endif -#define DISP_WIREFRAME 0 -#define DISP_WIREFRAME_STR "0" -#define DISP_SURFACE 1 -#define DISP_SURFACE_STR "1" -#define DISP_TRANSPARENT 2 -#define DISP_TRANSPARENT_STR "2" - -#define APPEARANCE_SOLID 0 -#define APPEARANCE_SOLID_STR "0" -#define APPEARANCE_BANDS 1 -#define APPEARANCE_BANDS_STR "1" - -#define COLORS_TWOSIDED 0 -#define COLORS_TWOSIDED_STR "0" -#define COLORS_COLORWHEEL 1 -#define COLORS_COLORWHEEL_STR "1" - -#define DISP_3D_PERSPECTIVE 0 -#define DISP_3D_PERSPECTIVE_STR "0" -#define DISP_3D_ORTHOGRAPHIC 1 -#define DISP_3D_ORTHOGRAPHIC_STR "1" - -#define DISP_4D_PERSPECTIVE 0 -#define DISP_4D_PERSPECTIVE_STR "0" -#define DISP_4D_ORTHOGRAPHIC 1 -#define DISP_4D_ORTHOGRAPHIC_STR "1" - -#define DALPHA 1.1 -#define DALPHA_STR "1.1" -#define DBETA 1.3 -#define DBETA_STR "1.3" -#define DDELTA 1.5 -#define DDELTA_STR "1.5" -#define DZETA 1.7 -#define DZETA_STR "1.7" -#define DETA 1.9 -#define DETA_STR "1.9" -#define DTHETA 2.1 -#define DTHETA_STR "2.1" - -#define DEF_DISPLAY_MODE DISP_SURFACE_STR -#define DEF_APPEARANCE APPEARANCE_BANDS_STR -#define DEF_COLORS COLORS_COLORWHEEL_STR -#define DEF_3D_PROJECTION DISP_3D_PERSPECTIVE_STR -#define DEF_4D_PROJECTION DISP_4D_PERSPECTIVE_STR -#define DEF_DALPHA DALPHA_STR -#define DEF_DBETA DBETA_STR -#define DEF_DDELTA DDELTA_STR -#define DEF_DZETA DZETA_STR -#define DEF_DETA DETA_STR -#define DEF_DTHETA DTHETA_STR +#define DISP_WIREFRAME 0 +#define DISP_WIREFRAME_STR "0" +#define DISP_SURFACE 1 +#define DISP_SURFACE_STR "1" +#define DISP_TRANSPARENT 2 +#define DISP_TRANSPARENT_STR "2" + +#define APPEARANCE_SOLID 0 +#define APPEARANCE_SOLID_STR "0" +#define APPEARANCE_BANDS 1 +#define APPEARANCE_BANDS_STR "1" +#define APPEARANCE_SPIRALS 2 +#define APPEARANCE_SPIRALS_STR "2" +#define APPEARANCE_SPIRALS_1 3 +#define APPEARANCE_SPIRALS_1_STR "3" +#define APPEARANCE_SPIRALS_2 4 +#define APPEARANCE_SPIRALS_2_STR "4" +#define APPEARANCE_SPIRALS_4 5 +#define APPEARANCE_SPIRALS_4_STR "5" +#define APPEARANCE_SPIRALS_8 6 +#define APPEARANCE_SPIRALS_8_STR "6" +#define APPEARANCE_SPIRALS_16 7 +#define APPEARANCE_SPIRALS_16_STR "7" + +#define COLORS_TWOSIDED 0 +#define COLORS_TWOSIDED_STR "0" +#define COLORS_COLORWHEEL 1 +#define COLORS_COLORWHEEL_STR "1" + +#define DISP_3D_PERSPECTIVE 0 +#define DISP_3D_PERSPECTIVE_STR "0" +#define DISP_3D_ORTHOGRAPHIC 1 +#define DISP_3D_ORTHOGRAPHIC_STR "1" + +#define DISP_4D_PERSPECTIVE 0 +#define DISP_4D_PERSPECTIVE_STR "0" +#define DISP_4D_ORTHOGRAPHIC 1 +#define DISP_4D_ORTHOGRAPHIC_STR "1" + +#define DALPHA 1.1 +#define DALPHA_STR "1.1" +#define DBETA 1.3 +#define DBETA_STR "1.3" +#define DDELTA 1.5 +#define DDELTA_STR "1.5" +#define DZETA 1.7 +#define DZETA_STR "1.7" +#define DETA 1.9 +#define DETA_STR "1.9" +#define DTHETA 2.1 +#define DTHETA_STR "2.1" + +#define DEF_DISPLAY_MODE DISP_SURFACE_STR +#define DEF_APPEARANCE APPEARANCE_BANDS_STR +#define DEF_COLORS COLORS_COLORWHEEL_STR +#define DEF_3D_PROJECTION DISP_3D_PERSPECTIVE_STR +#define DEF_4D_PROJECTION DISP_4D_PERSPECTIVE_STR +#define DEF_DALPHA DALPHA_STR +#define DEF_DBETA DBETA_STR +#define DEF_DDELTA DDELTA_STR +#define DEF_DZETA DZETA_STR +#define DEF_DETA DETA_STR +#define DEF_DTHETA DTHETA_STR #ifdef STANDALONE -# define PROGCLASS "Hypertorus" -# define HACK_INIT init_hypertorus -# define HACK_DRAW draw_hypertorus -# define HACK_RESHAPE reshape_hypertorus -# define hypertorus_opts xlockmore_opts -# define DEFAULTS "*delay: 25000 \n" \ - "*showFPS: False \n" \ +# define PROGCLASS "Hypertorus" +# define HACK_INIT init_hypertorus +# define HACK_DRAW draw_hypertorus +# define HACK_RESHAPE reshape_hypertorus +# define HACK_HANDLE_EVENT hypertorus_handle_event +# define EVENT_MASK PointerMotionMask|KeyReleaseMask +# define hypertorus_opts xlockmore_opts +# define DEFAULTS "*delay: 25000 \n" \ + "*showFPS: False \n" \ # include "xlockmore.h" /* from the xscreensaver distribution */ #else /* !STANDALONE */ @@ -118,8 +135,10 @@ static const char sccsid[] = "@(#)hypertorus.c 1.1 03/05/18 xlockmore"; #ifdef USE_GL +#include #include #include +#include "gltrackball.h" #ifdef USE_MODULES @@ -134,6 +153,7 @@ ModStruct hypertorus_description = static int display_mode; static int appearance; +static int num_spirals; static int colors; static int projection_3d; static int projection_4d; @@ -148,13 +168,13 @@ static float speed_yz; static float alpha, beta, delta, zeta, eta, theta; static float aspect; -static const float offset4d[4] = { - 0.0, 0.0, 0.0, 2.0 -}; +/* Trackball states */ +trackball_state *trackballs[2]; +int current_trackball; +Bool button_pressed; -static const float offset3d[4] = { - 0.0, 0.0, -2.0, 0.0 -}; +static const float offset4d[4] = { 0.0, 0.0, 0.0, 2.0 }; +static const float offset3d[4] = { 0.0, 0.0, -2.0, 0.0 }; static XrmOptionDescRec opts[] = @@ -169,6 +189,16 @@ static XrmOptionDescRec opts[] = APPEARANCE_SOLID_STR }, {"-bands", ".hypertorus.appearance", XrmoptionNoArg, APPEARANCE_BANDS_STR }, + {"-spirals-1", ".hypertorus.appearance", XrmoptionNoArg, + APPEARANCE_SPIRALS_1_STR }, + {"-spirals-2", ".hypertorus.appearance", XrmoptionNoArg, + APPEARANCE_SPIRALS_2_STR }, + {"-spirals-4", ".hypertorus.appearance", XrmoptionNoArg, + APPEARANCE_SPIRALS_4_STR }, + {"-spirals-8", ".hypertorus.appearance", XrmoptionNoArg, + APPEARANCE_SPIRALS_8_STR }, + {"-spirals-16", ".hypertorus.appearance", XrmoptionNoArg, + APPEARANCE_SPIRALS_16_STR }, {"-twosided", ".hypertorus.colors", XrmoptionNoArg, COLORS_TWOSIDED_STR }, {"-colorwheel", ".hypertorus.colors", XrmoptionNoArg, @@ -222,6 +252,7 @@ static OptionStruct desc[] = { "-transparent", "display the torus as a transparent surface" }, { "-solid", "display the torus as a solid object" }, { "-bands", "display the torus as see-through bands" }, + { "-spirals-{1,2,4,8,16}", "display the torus as see-through spirals" }, { "-twosided", "display the torus with two colors" }, { "-colorwheel", "display the torus with a smooth color wheel" }, { "-perspective-3d", "project the torus perspectively from 3d to 2d" }, @@ -362,6 +393,71 @@ static void rotateyz(float m[4][4], float phi) } +/* Compute the rotation matrix m from the rotation angles. */ +static void rotateall(float al, float be, float de, float ze, float et, + float th, float m[4][4]) +{ + int i, j; + + for (i=0; i<4; i++) + for (j=0; j<4; j++) + m[i][j] = (i==j); + rotatewx(m,al); + rotatewy(m,be); + rotatewz(m,de); + rotatexy(m,ze); + rotatexz(m,et); + rotateyz(m,th); +} + + +/* Multiply two rotation matrices: o=m*n. */ +static void mult_rotmat(float m[4][4], float n[4][4], float o[4][4]) +{ + int i, j, k; + + for (i=0; i<4; i++) + { + for (j=0; j<4; j++) + { + o[i][j] = 0.0; + for (k=0; k<4; k++) + o[i][j] += m[i][k]*n[k][j]; + } + } +} + + +/* Compute a 4D rotation matrix from two unit quaternions. */ +static void quats_to_rotmat(float p[4], float q[4], float m[4][4]) +{ + double al, be, de, ze, et, th; + double r00, r01, r02, r12, r22; + + r00 = 1.0-2.0*(p[1]*p[1]+p[2]*p[2]); + r01 = 2.0*(p[0]*p[1]+p[2]*p[3]); + r02 = 2.0*(p[2]*p[0]-p[1]*p[3]); + r12 = 2.0*(p[1]*p[2]+p[0]*p[3]); + r22 = 1.0-2.0*(p[1]*p[1]+p[0]*p[0]); + + al = atan2(-r12,r22)*180.0/M_PI; + be = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI; + de = atan2(-r01,r00)*180.0/M_PI; + + r00 = 1.0-2.0*(q[1]*q[1]+q[2]*q[2]); + r01 = 2.0*(q[0]*q[1]+q[2]*q[3]); + r02 = 2.0*(q[2]*q[0]-q[1]*q[3]); + r12 = 2.0*(q[1]*q[2]+q[0]*q[3]); + r22 = 1.0-2.0*(q[1]*q[1]+q[0]*q[0]); + + ze = atan2(-r12,r22)*180.0/M_PI; + et = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI; + th = atan2(-r01,r00)*180.0/M_PI; + + rotateall(al,be,de,ze,et,th,m); +} + + /* Compute a fully saturated and bright color based on an angle. */ static void color(double angle) { @@ -414,7 +510,7 @@ static void color(double angle) break; } if (display_mode == DISP_TRANSPARENT) - color[3] = 0.5; + color[3] = 0.7; else color[3] = 1.0; glColor3fv(color); @@ -422,31 +518,32 @@ static void color(double angle) } -/* Draw a hyperturus projected into 3D. */ +/* Draw a hypertorus projected into 3D. Note that the spirals appearance + will only work correctly if numu and numv are set to 64 or any higher + power of 2. Similarly, the banded appearance will only work correctly + if numu and numv are divisible by 4. */ static void hypertorus(double umin, double umax, double vmin, double vmax, int numu, int numv) { static GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 }; static GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 }; - static GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.5 }; - static GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.5 }; + static GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 }; + static GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 }; float p[3], pu[3], pv[3], n[3], mat[4][4]; - int i, j, k, l, m; + int i, j, k, l, m, b, skew; double u, v, ur, vr; double cu, su, cv, sv; double xx[4], xxu[4], xxv[4], x[4], xu[4], xv[4]; double r, s, t; + float q1[4], q2[4], r1[4][4], r2[4][4]; - /* Compute the rotation that rotates the hypercube in 4D. */ - for (i=0; i<4; i++) - for (j=0; j<4; j++) - mat[i][j] = (i==j); - rotatewx(mat,alpha); - rotatewy(mat,beta); - rotatewz(mat,delta); - rotatexy(mat,zeta); - rotatexz(mat,eta); - rotateyz(mat,theta); + rotateall(alpha,beta,delta,zeta,eta,theta,r1); + + gltrackball_get_quaternion(trackballs[0],q1); + gltrackball_get_quaternion(trackballs[1],q2); + quats_to_rotmat(q1,q2,r2); + + mult_rotmat(r2,r1,mat); if (colors != COLORS_COLORWHEEL) { @@ -463,11 +560,13 @@ static void hypertorus(double umin, double umax, double vmin, double vmax, } } + skew = num_spirals; ur = umax-umin; vr = vmax-vmin; for (i=0; i= 2)) + if ((appearance == APPEARANCE_BANDS || + appearance == APPEARANCE_SPIRALS) && ((i & 3) >= 2)) continue; if (display_mode == DISP_WIREFRAME) glBegin(GL_QUAD_STRIP); @@ -481,7 +580,16 @@ static void hypertorus(double umin, double umax, double vmin, double vmax, m = j; u = ur*l/numu+umin; v = vr*m/numv+vmin; - color(u); + if (appearance == APPEARANCE_SPIRALS) + { + u += 4.0*skew/numv*v; + b = ((i/4)&(skew-1))*(numu/(4*skew)); + color(ur*4*b/numu+umin); + } + else + { + color(u); + } cu = cos(u); su = sin(u); cv = cos(v); @@ -558,6 +666,16 @@ static void init(ModeInfo *mi) static GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; static GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; + if (appearance >= APPEARANCE_SPIRALS_1) + { + num_spirals = 1<<(appearance-APPEARANCE_SPIRALS_1); + appearance = APPEARANCE_SPIRALS; + } + else + { + num_spirals = 0; + } + alpha = 0.0; beta = 0.0; delta = 0.0; @@ -634,24 +752,27 @@ static void init(ModeInfo *mi) /* Redisplay the hypertorus. */ static void display_hypertorus(void) { - alpha += speed_wx; - if (alpha >= 360.0) - alpha -= 360.0; - beta += speed_wy; - if (beta >= 360.0) - beta -= 360.0; - delta += speed_wz; - if (delta >= 360.0) - delta -= 360.0; - zeta += speed_xy; - if (zeta >= 360.0) - zeta -= 360.0; - eta += speed_xz; - if (eta >= 360.0) - eta -= 360.0; - theta += speed_yz; - if (theta >= 360.0) - theta -= 360.0; + if (!button_pressed) + { + alpha += speed_wx; + if (alpha >= 360.0) + alpha -= 360.0; + beta += speed_wy; + if (beta >= 360.0) + beta -= 360.0; + delta += speed_wz; + if (delta >= 360.0) + delta -= 360.0; + zeta += speed_xy; + if (zeta >= 360.0) + zeta -= 360.0; + eta += speed_xz; + if (eta >= 360.0) + eta -= 360.0; + theta += speed_yz; + if (theta >= 360.0) + theta -= 360.0; + } glMatrixMode(GL_PROJECTION); glLoadIdentity(); @@ -669,10 +790,7 @@ static void display_hypertorus(void) glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - if (display_mode == DISP_WIREFRAME) - hypertorus(0.0,2.0*M_PI,0.0,2.0*M_PI,40,40); - else - hypertorus(0.0,2.0*M_PI,0.0,2.0*M_PI,60,60); + hypertorus(0.0,2.0*M_PI,0.0,2.0*M_PI,64,64); } @@ -687,6 +805,64 @@ void reshape_hypertorus(ModeInfo * mi, int width, int height) } +Bool hypertorus_handle_event(ModeInfo *mi, XEvent *event) +{ + Display *display = MI_DISPLAY(mi); + KeySym sym; + + if (event->xany.type == ButtonPress && + event->xbutton.button == Button1) + { + button_pressed = True; + gltrackball_start(trackballs[current_trackball], + event->xbutton.x, event->xbutton.y, + MI_WIDTH(mi), MI_HEIGHT(mi)); + return True; + } + else if (event->xany.type == ButtonRelease && + event->xbutton.button == Button1) + { + button_pressed = False; + return True; + } + else if (event->xany.type == KeyPress) + { + sym = XKeycodeToKeysym(display,event->xkey.keycode,0); + if (sym == XK_Shift_L || sym == XK_Shift_R) + { + current_trackball = 1; + if (button_pressed) + gltrackball_start(trackballs[current_trackball], + event->xbutton.x, event->xbutton.y, + MI_WIDTH(mi), MI_HEIGHT(mi)); + return True; + } + } + else if (event->xany.type == KeyRelease) + { + sym = XKeycodeToKeysym(display,event->xkey.keycode,0); + if (sym == XK_Shift_L || sym == XK_Shift_R) + { + current_trackball = 0; + if (button_pressed) + gltrackball_start(trackballs[current_trackball], + event->xbutton.x, event->xbutton.y, + MI_WIDTH(mi), MI_HEIGHT(mi)); + return True; + } + } + else if (event->xany.type == MotionNotify && button_pressed) + { + gltrackball_track(trackballs[current_trackball], + event->xmotion.x, event->xmotion.y, + MI_WIDTH(mi), MI_HEIGHT(mi)); + return True; + } + + return False; +} + + /* *----------------------------------------------------------------------------- *----------------------------------------------------------------------------- @@ -714,6 +890,11 @@ void init_hypertorus(ModeInfo * mi) } hp = &hyper[MI_SCREEN(mi)]; + trackballs[0] = gltrackball_init(); + trackballs[1] = gltrackball_init(); + current_trackball = 0; + button_pressed = False; + if ((hp->glx_context = init_GL(mi)) != NULL) { reshape_hypertorus(mi,MI_WIDTH(mi),MI_HEIGHT(mi)); diff --git a/hacks/glx/hypertorus.man b/hacks/glx/hypertorus.man index 8342f6dc..2d0b6470 100644 --- a/hacks/glx/hypertorus.man +++ b/hacks/glx/hypertorus.man @@ -15,6 +15,7 @@ hypertorus - Draws a hypertorus that rotates in 4d [\-transparent] [\-solid] [\-bands] +[\-spirals-{1,2,4,8,16}] [\-twosided] [\-colorwheel] [\-perspective-3d] @@ -38,17 +39,18 @@ covered cylinder for some angles. The projected 3d torus can then be projected to the screen either perspectively or orthographically. There are three display modes for the torus: mesh (wireframe), solid, or transparent. Furthermore, the appearance of the torus can be as a -solid object or as a set of see-through bands. Finally, the colors -with with the torus is drawn can be set to either two-sided or to a -color wheel. In the first case, the torus is drawn with red on the -outside and green on the inside. This mode enables you to see that -the torus turns inside-out as it rotates in 4d. The second mode draws -the torus with a fully saturated color wheel. This gives a very nice -effect when combined with the see-through bands mode. The rotation -speed for each of the six planes around which the torus rotates can be -chosen. This program is very much inspired by Thomas Banchoff's book -"Beyond the Third Dimension: Geometry, Computer Graphics, and Higher -Dimensions", Scientific American Library, 1990. +solid object or as a set of see-through bands or see-through spirals. +Finally, the colors with with the torus is drawn can be set to either +two-sided or to a color wheel. In the first case, the torus is drawn +with red on the outside and green on the inside. This mode enables +you to see that the torus turns inside-out as it rotates in 4d. The +second mode draws the torus with a fully saturated color wheel. This +gives a very nice effect when combined with the see-through bands or +see-through spirals mode. The rotation speed for each of the six +planes around which the torus rotates can be chosen. This program is +very much inspired by Thomas Banchoff's book "Beyond the Third +Dimension: Geometry, Computer Graphics, and Higher Dimensions", +Scientific American Library, 1990. .SH OPTIONS .I hypertorus accepts the following options: @@ -82,7 +84,7 @@ Display the torus as a solid surface (default). .B \-transparent Display the torus as a transparent surface. .PP -The following two options are mutually exclusive. They determine the +The following seven options are mutually exclusive. They determine the appearance of the torus. .TP 8 .B \-solid @@ -90,6 +92,10 @@ Display the torus as a solid object. .TP 8 .B \-bands Display the torus as see-through bands (default). +.TP 8 +.B \-spirals-1, \-spirals-2, \-spirals-4, \-spirals-8, \-spirals-16 +Display the torus as see-through spirals with the indicated number of +spirals. .PP The following two options are mutually exclusive. They determine how to color the torus. @@ -99,7 +105,10 @@ Display the torus with two colors: red on the outside and green on the inside. .TP 8 .B \-colorwheel -Display the torus with a fully saturated color wheel (default). +Display the torus with a fully saturated color wheel (default). If +the torus is displayed as see-through bands each band will be +displayed with a different color. Likewise, if the torus is displayed +as see-through spirals each spiral will receive a different color. .PP The following two options are mutually exclusive. They determine how the torus is projected from 3d to 2d (i.e., to the screen). @@ -143,6 +152,15 @@ Rotation speed around the xz plane (default: 1.9). .TP 8 .B \-speed-yz \fIfloat\fP Rotation speed around the yz plane (default: 2.1). +.SH INTERACTION +If you run this program in standalone mode you can rotate the +hypertorus by dragging the mouse while pressing the left mouse button. +This rotates the hypertorus in 3D, i.e., around the wx, wy, and wz +planes. If you press the shift key while dragging the mouse with the +left button pressed the hypertorus is rotated in 4D, i.e., around the +xy, xz, and yz planes. To examine the hypertorus at your leisure, it +is best to set all speeds to 0. Otherwise, the hypertorus will rotate +while the left mouse button is not pressed. .SH ENVIRONMENT .PP .TP 8 @@ -156,7 +174,7 @@ stored in the RESOURCE_MANAGER property. .BR X (1), .BR xscreensaver (1) .SH COPYRIGHT -Copyright \(co 2003 by Carsten Steger. Permission to use, copy, modify, +Copyright \(co 2003-2005 by Carsten Steger. 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 @@ -164,4 +182,4 @@ appear in supporting documentation. No representations are made about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. .SH AUTHOR -Carsten Steger , 27-may-2003. +Carsten Steger , 28-sep-2005. diff --git a/hacks/glx/juggler3d.c b/hacks/glx/juggler3d.c new file mode 100644 index 00000000..56e9707a --- /dev/null +++ b/hacks/glx/juggler3d.c @@ -0,0 +1,2143 @@ +/* Juggler3D, Copyright (c) 2005 Brian Apps + * + * 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. No + * representations are made about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. */ + +#include + +#undef countof +#define countof(x) (sizeof((x))/sizeof((*x))) + +#define PROGCLASS "Juggler3D" +#define HACK_INIT Juggler3D_HackInitEvent +#define HACK_DRAW Juggler3D_HackDrawEvent +#define HACK_RESHAPE Juggler3D_HackReshapeEvent +#define HACK_HANDLE_EVENT Juggler3D_HackHandleEvent +#define EVENT_MASK PointerMotionMask +#define SWITCH_OPTS xlockmore_opts + +#define DEFAULTS \ + "*JuggleSpeed: 0.15\n*delay: 20000\n*showFPS: False\n*wireframe: False\n" + +#include "xlockmore.h" +#include "gltrackball.h" + +#ifdef USE_GL /* whole file */ +#include + +/* A selection of macros to make functions from math.h return single precision + * numbers. Arguably it's better to work at a higher precision and cast it + * back but littering the code with casts makes it less readable -- without + * the casts you can get tons of warnings from the compiler (particularily + * MSVC which enables loss of precision warnings by default) */ + +#define cosf(a) (float)(cos((a))) +#define sinf(a) (float)(sin((a))) +#define tanf(a) (float)(tan((a))) +#define sqrtf(a) (float)(sqrt((a))) +#define powf(a, b) (float)(pow((a), (b))) + +#undef max +#undef min + +#define max(a, b) ((a) > (b) ? (a) : (b)) +#define min(a, b) ((a) < (b) ? (a) : (b)) + + +/****************************************************************************** + * + * The code is broadly split into the following parts: + * + * - Engine. The process of determining the position of the juggler and + * objects being juggled at an arbitrary point in time. This is + * independent from any drawing code. + * - Sites. The process of creating a random site swap pattern or parsing + * a Juggle Saver compatible siteswap for use by the engine. For an + * introduction to juggling site swaps check out + * http://www.jugglingdb.com/ + * - Rendering. OpenGL drawing code that animates the juggler. + * - XScreenSaver. Interface code to get thing working as a GLX hack. + * + *****************************************************************************/ + + +/***************************************************************************** + * + * Data structures + * + *****************************************************************************/ + +/* POS is used to represent the position of a hand when it catches or throws + * an object; as well as the orientation of the object. The rotation and + * elevation are specified in degrees. These angles are not normalised so that + * it is possible to specify how the object spins and rotates as it is thrown + * from the 'From' position to the 'To' position. + * + * Because this is the position of the hand some translation is required with + * rings and clubs to get the centre of rotation position. */ + +typedef struct +{ + float x; + float y; + float z; + float Rot; + float Elev; +} POS; + + +/* An array of THROW_INFOs are configured with each entry corresponding to the + * position in the site swap (In fact we double up odd length patterns to ensure + * there is left/right symmetry). It allows us to quickly determine where an + * object and the hands are at a given time. The information is specified in + * terms of throws, and positions where throws aren't present (0's and 2's) are + * simply ignored. + * + * TotalTime - The count of beats before this object is thrown again. Typically + * this is the same as the weight of the throw but where an object is held it + * is longer. e.g. the first throw of the site 64242.7. will be 10, 6 for + * throw and 4 (two 2's) for the carry. + * TimeInAir - The weight of the throw. + * PrevThrow - zero based index into array of THROW_INFOs of the previous throw. + * e.g. for the throw '8' in the site 345678..... the PrevThrow is 1 + * (i.e. the 4) + * FromPos, FromVelocity, ToPos, ToVelocity - The position and speeds at the + * start and end of the throw. These are used to generate a spline while + * carrying an object and while moving the hand from a throw to a catch. + * NextForHand - Number of beats before the hand that throws this object will + * throw another object. This is always going to be at least 2. When there + * are gaps in the pattern (0's) or holds (2's) NextForHand increases. */ + +typedef struct +{ + int TotalTime; + int TimeInAir; + int PrevThrow; + + POS FromPos; + POS FromVelocity; + POS ToPos; + POS ToVelocity; + + int NextForHand; +} THROW_INFO; + + +/* OBJECT_POSITION works with the array of THROW_INFOs to allow us to determine + * exactly where an object or hand is. + * + * TimeOffset - The total number of beats expired when the object was thrown. + * ThrowIndex - The zero based index into the THROW_INFO array for the current + * throw. + * ObjectType - One of the OBJECT_XX defines. + * TotalTwist - Only relevant for OBJECT_BALL, this is the total amount the ball + * has twisted while in the air. When segmented balls are drawn you see a + * spinning effect similar to what happens when you juggle beanbags. */ + +#define OBJECT_DEFAULT 0 +#define OBJECT_BALL 1 +#define OBJECT_CLUB 2 +#define OBJECT_RING 3 + +typedef struct +{ + int TimeOffset; + int ThrowIndex; + float TotalTwist; + int ObjectType; +} OBJECT_POSITION; + + +/* PATTERN_INFO is the main structure that holds the information about a + * juggling pattern. + * + * pThrowInfo is an array of ThrowLen elements that describes each throw in the + * pattern. + * pObjectInfo gives the current position of all objects at a given instant. + * These values are updated as the pattern is animated. + * LeftHand and RightHand describe the current positions of each of the + * juggler's hands. + * MaxWeight is the maximum weight of the all throws in pThrowInfo. + * Height and Alpha are parameters that describe how objects fall under the + * influence of gravity. See SetHeightAndAlpha() for the gory details. */ + +typedef struct +{ + THROW_INFO* pThrowInfo; + int ThrowLen; + + OBJECT_POSITION* pObjectInfo; + int Objects; + + OBJECT_POSITION LeftHand; + OBJECT_POSITION RightHand; + + int MaxWeight; + + float Height; + float Alpha; +} PATTERN_INFO; + + +/* EXT_SITE_INFO is used to initialise a PATTERN_INFO object using a Juggle + * Saver compatible site swap. These contain additional information about the + * type of object thrown, the positions of throw and catch etc. */ + +#define HAS_FROM_POS 1 +#define HAS_TO_POS 2 +#define HAS_SNATCH 4 +#define HAS_SPINS 8 + +typedef struct +{ + unsigned Flags; + int Weight; + int ObjectType; + POS FromPos; + POS ToPos; + float SnatchX; + float SnatchY; + int Spins; +} EXT_SITE_INFO; + + +/* RENDER_STATE is used to co-ordinate the OpenGL rendering of the juggler and + * objects: + * pPattern - The pattern to be juggled + * CameraElev - The elevation angle (in degrees) that the camera is looking + * along. 0 is horizontal and a +ve angle is looking down. This value + * should be between -90 and +90. + * AspectRatio - Window width to height ratio. + * DLStart - The number for the first display list created, any others directly + * follow this. + * Time - Animation time (in beats) + * TranslateAngle - Cumulative translation (in degrees) for the juggling figure. + * SpinAngle- Cumulative spin (in degrees) for the juggling figure. + */ + +typedef struct +{ + PATTERN_INFO* pPattern; + float CameraElev; + float AspectRatio; + int DLStart; + + float Time; + float TranslateAngle; + float SpinAngle; + + trackball_state *trackball; + Bool button_down_p; + +} RENDER_STATE; + + +/***************************************************************************** + * + * Engine + * + **************************************************************************** + * + * The main purpose of the engine is to work out the exact position of all the + * juggling objects and the juggler's hands at any point in time. The motion + * of the objects can be split into two parts: in the air and and being carried. + * + * While in the air, the motion is governed by a standard parabolic trajectory. + * The only minor complication is that the engine has no fixed concept of + * gravity, instead it using a term called Alpha that varies according to the + * pattern (see SetHeightAndAlpha). + * + * The motion while an object is carried comes from fitting a spline through the + * catch and throw points and maintaining the catch and throw velocities at + * each end. In the simplest case this boils down to cubic Bezier spline. The + * only wrinkle occurs when a ball is being carried for a long time. The simple + * cubic spline maths produces a curve that goes miles away -- here we do a + * bit of reparameterisation so things stay within sensible bounds. + * (On a related note, this scheme is _much_ simpler than the Juggle Saver + * one. Juggle Saver achieves 2nd order continuity and much care is taken + * to avoid spline ringing.) + * + * The motion of the hands is identical to the ball carrying code. It uses two + * splines: one while an object is being carried; and another when it moves from + * the previous throw to the next catch. + */ + +const float CARRY_TIME = 0.56f; +const float PI = 3.14159265358979f; + + +/* While a ball is thrown it twists slighty about an axis, this routine gives + * the total about of twist for a given ball throw. */ + +static float GetBallTwistAmount(const THROW_INFO* pThrow) +{ + if (pThrow->FromPos.x > pThrow->ToPos.x) + return 18.0f * powf(pThrow->TimeInAir, 1.5); + else + return -18.0f * powf(pThrow->TimeInAir, 1.5); +} + + +float NormaliseAngle(float Ang) +{ + if (Ang >= 0.0f) + { + int i = (int) (Ang + 180.0f) / 360; + return Ang - 360.0f * i; + } + else + { + int i = (int)(180.0f - Ang) / 360; + return Ang + i * 360.0f; + } +} + + +/* The interpolate routine for ball carrying and hand motion. We are given the + * start (P0) and end (P1) points and the velocities at these points, the task + * is to form a function P(t) such that: + * P(0) = P0 + * P(TLen) = P1 + * P'(0) = V0 + * P'(TLen) = V1 + */ + +static POS InterpolatePosition( + const POS* pP0, const POS* pV0, const POS* pP1, const POS* pV1, + float TLen, float t) +{ + POS p; + float a, b, c, d, tt, tc; + + /* The interpolation is based on a simple cubic that achieves 1st order + * continuity at the end points. However the spline can become too long if + * the TLen parameter is large. In this case we cap the curve's length (fix + * the shape) and then reparameterise time to achieve the continuity + * conditions. */ + + tc = CARRY_TIME; + + if (TLen > tc) + { + /* The reparameterisation tt(t) gives: + * tt(0) = 0, tt(TLen) = tc, tt'(0) = 1, tt'(TLen) = 1 + * and means we can set t = tt(t), TLen = tc and then fall through + * to use the normal cubic spline fit. + * + * The reparameterisation is based on two piecewise quadratics, one + * that goes from t = 0 to t = TLen / 2 and the other, mirrored in + * tt and t that goes from t = TLen / 2 to t = TLen. + * Because TLen > tc we can arrange for tt to be unique in the range if + * we specify the quadratic in tt. i.e. t = A * tt ^ 2 + B * tt + C. + * + * Considering the first piece and applying initial conditions. + * tt = 0 when t = 0 => C = 0 + * tt' = 1 when t = 0 => B = 1 + * tt = tc / 2 when t = TLen / 2 => A = 2 * (TLen - tc) / tc^2 + * + * writing in terms of t + * tt = (-B + (B ^ 2 + 4At) ^ 0.5) / 2A + * or + * tt = ((1 + 4At) ^ 0.5 - 1) / 2A */ + + float A = 2.0f * (TLen - tc) / (tc * tc); + + if (t > TLen / 2.0f) + t = tc - (sqrtf(1.0f + 4.0f * A * (TLen - t)) - 1.0f) / (2.0f * A); + else + t = (sqrtf(1.0f + 4.0f * A * t) - 1.0f) / (2.0f * A); + + TLen = tc; + } + + /* The cubic spline takes the form: + * P(t) = p0 * a(t) + v0 * b(t) + p1 * c(t) + v1 * d(t) + * where p0 is the start point, v0 the start velocity, p1 the end point and + * v1 the end velocity. a(t), b(t), c(t) and d(t) are cubics in t. + * We can show that: + * + * a(t) = 2 * (t / TLen) ^ 3 - 3 * (t / TLen) ^ 2 + 1 + * b(t) = t ^ 3 / TLen ^ 2 - 2 * t ^ 2 / TLen + t + * c(t) = -2 * (t / TLen) ^ 3 + 3 * (t / TLen) ^ 2 + * d(t) = t ^ 3 / TLen ^ 2 - t ^ 2 / TLen + * + * statisfy the boundary conditions: + * P(0) = p0, P(TLen) = p1, P'(0) = v0 and P'(TLen) = v1 */ + + tt = t / TLen; + + a = tt * tt * (2.0f * tt - 3.0f) + 1.0f; + b = t * tt * (tt - 2.0f) + t; + c = tt * tt * (3.0f - 2.0f * tt); + d = t * tt * (tt - 1.0f); + + p.x = a * pP0->x + b * pV0->x + c * pP1->x + d * pV1->x; + p.y = a * pP0->y + b * pV0->y + c * pP1->y + d * pV1->y; + p.z = a * pP0->z + b * pV0->z + c * pP1->z + d * pV1->z; + + p.Rot = a * NormaliseAngle(pP0->Rot) + b * pV0->Rot + + c * NormaliseAngle(pP1->Rot) + d * pV1->Rot; + p.Elev = a * NormaliseAngle(pP0->Elev) + b * pV0->Elev + + c * NormaliseAngle(pP1->Elev) + d * pV1->Elev; + + return p; +} + + +static POS InterpolateCarry( + const THROW_INFO* pThrow, const THROW_INFO* pNext, float t) +{ + float CT = CARRY_TIME + pThrow->TotalTime - pThrow->TimeInAir; + return InterpolatePosition(&pThrow->ToPos, &pThrow->ToVelocity, + &pNext->FromPos, &pNext->FromVelocity, CT, t); +} + + +/* Determine the position of the hand at a point in time. */ + +void GetHandPosition( + PATTERN_INFO* pPattern, int RightHand, float Time, POS* pPos) +{ + OBJECT_POSITION* pObj = + RightHand == 0 ? &pPattern->LeftHand : &pPattern->RightHand; + THROW_INFO* pLastThrow; + + /* Upon entry, the throw information for the relevant hand may be out of + * sync. Therefore we advance through the pattern if required. */ + + while (pPattern->pThrowInfo[pObj->ThrowIndex].NextForHand + pObj->TimeOffset + <= (int) Time) + { + int w = pPattern->pThrowInfo[pObj->ThrowIndex].NextForHand; + pObj->TimeOffset += w; + pObj->ThrowIndex = (pObj->ThrowIndex + w) % pPattern->ThrowLen; + } + + pLastThrow = &pPattern->pThrowInfo[pObj->ThrowIndex]; + + /* The TimeInAir will only ever be 2 or 0 if no object is ever thrown by + * this hand. In normal circumstances, 2's in the site swap are coalesced + * and added to TotalTime of the previous throw. 0 is a hole and means that + * an object isn't there. In this case we just hold the hand still. */ + if (pLastThrow->TimeInAir == 2 || pLastThrow->TimeInAir == 0) + { + pPos->x = pLastThrow->FromPos.x; + pPos->y = pLastThrow->FromPos.y; + } + else + { + /* The hand is either moving to catch the next object or carrying the + * next object to its next throw position. The way THROW_INFO is + * structured means the relevant information for the object we're going + * to catch is held at the point at which it was thrown + * (pNextThrownFrom). We can't go straight for it and instead have to + * look at the object we've about to throw next and work out where it + * came from. */ + + THROW_INFO* pNextThrow = &pPattern->pThrowInfo[ + (pObj->ThrowIndex + pLastThrow->NextForHand) % pPattern->ThrowLen]; + + THROW_INFO* pNextThrownFrom = + &pPattern->pThrowInfo[pNextThrow->PrevThrow]; + + /* tc is a measure of how long the object we're due to catch is being + * carried for. We use this to work out if we've actually caught it at + * this moment in time. */ + + float tc = CARRY_TIME + + pNextThrownFrom->TotalTime - pNextThrownFrom->TimeInAir; + + Time -= pObj->TimeOffset; + + if (Time > pLastThrow->NextForHand - tc) + { + /* carrying this ball to it's new location */ + *pPos = InterpolateCarry(pNextThrownFrom, + pNextThrow, (Time - (pLastThrow->NextForHand - tc))); + } + else + { + /* going for next catch */ + *pPos = InterpolatePosition( + &pLastThrow->FromPos, &pLastThrow->FromVelocity, + &pNextThrownFrom->ToPos, &pNextThrownFrom->ToVelocity, + pLastThrow->NextForHand - tc, Time); + } + } +} + + +static float SinDeg(float AngInDegrees) +{ + return sinf(AngInDegrees * PI / 180.0f); +} + + +static float CosDeg(float AngInDegrees) +{ + return cosf(AngInDegrees * PI / 180.0f); +} + + +/* Offset the specified position to get the centre of the object based on the + * the handle length and the current orientation */ + +static void OffsetHandlePosition(const POS* pPos, float HandleLen, POS* pResult) +{ + pResult->x = pPos->x + HandleLen * SinDeg(pPos->Rot) * CosDeg(pPos->Elev); + pResult->y = pPos->y + HandleLen * SinDeg(pPos->Elev); + pResult->z = pPos->z + HandleLen * CosDeg(pPos->Rot) * CosDeg(pPos->Elev); + pResult->Elev = pPos->Elev; + pResult->Rot = pPos->Rot; +} + + +static void GetObjectPosition( + PATTERN_INFO* pPattern, int Obj, float Time, float HandleLen, POS* pPos) +{ + OBJECT_POSITION* pObj = &pPattern->pObjectInfo[Obj]; + THROW_INFO* pThrow; + + /* Move through the pattern, if required, such that pThrow corresponds to + * the current throw for this object. */ + + while (pPattern->pThrowInfo[pObj->ThrowIndex].TotalTime + pObj->TimeOffset + <= (int) Time) + { + int w = pPattern->pThrowInfo[pObj->ThrowIndex].TotalTime; + pObj->TimeOffset += w; + pObj->TotalTwist = NormaliseAngle(pObj->TotalTwist + + GetBallTwistAmount(&pPattern->pThrowInfo[pObj->ThrowIndex])); + + pObj->ThrowIndex = (pObj->ThrowIndex + w) % pPattern->ThrowLen; + } + + pThrow = &pPattern->pThrowInfo[pObj->ThrowIndex]; + + if (pThrow->TimeInAir == 2 || pThrow->TimeInAir == 0) + { + *pPos = pThrow->FromPos; + OffsetHandlePosition(pPos, HandleLen, pPos); + } + else + { + float tc = pThrow->TimeInAir - CARRY_TIME; + float BallTwist = GetBallTwistAmount(pThrow); + Time -= pObj->TimeOffset; + if (Time < tc) + { + /* object in air */ + POS From, To; + float t, b; + + t = Time / tc; + + OffsetHandlePosition(&pThrow->FromPos, HandleLen, &From); + OffsetHandlePosition(&pThrow->ToPos, HandleLen, &To); + + b = (To.y - From.y) / tc + pPattern->Alpha * tc; + + pPos->x = (1.0f - t) * From.x + t * To.x; + pPos->z = (1.0f - t) * From.z + t * To.z; + pPos->y = -pPattern->Alpha * Time * Time + b * Time + From.y; + + if (pObj->ObjectType == OBJECT_BALL) + pPos->Rot = pObj->TotalTwist + t * BallTwist; + else + { + /* We describe the rotation of a club (or ring) with an + * elevation and rotation but don't include a twist. + * If we ignore twist for the moment, the orientation at a + * rotation of r and an elevation of e can be also be expressed + * by rotating the object a further 180 degrees and sort of + * mirroring the rotation, e.g.: + * rot = r + 180 and elev = 180 - e + * We can easily show that the maths holds, consider the + * x, y ,z position of the end of a unit length club. + * y = sin(180 - e) = sin(e) + * x = cos(180 - e) * sin(r + 180) = -cos(e) * - sin(r) + * z = cos(180 - e) * cos(r + 180) = -cos(e) * - cos(r) + * When a club is thrown these two potential interpretations + * can produce unexpected results. + * The approach we adopt is that we try and minimise the amount + * of rotation we give a club -- normally this is what happens + * when juggling since it's much easier to spin the club. + * + * When we come to drawing the object the two interpretations + * aren't identical, one causes the object to twist a further + * 180 about its axis. We avoid the issue by ensuring our + * objects have rotational symmetry of order 2 (e.g. we make + * sure clubs have an even number of stripes) this makes the two + * interpretations appear identical. */ + + float RotAmt = NormaliseAngle(To.Rot - From.Rot); + + if (RotAmt < -90.0f) + { + To.Elev += 180 - 2 * NormaliseAngle(To.Elev); + RotAmt += 180.0f; + } + else if (RotAmt > 90.0f) + { + To.Elev += 180 - 2 * NormaliseAngle(To.Elev); + RotAmt -= 180.0f; + } + + pPos->Rot = From.Rot + t * RotAmt; + } + + pPos->Elev = (1.0f - t) * From.Elev + t * To.Elev; + + } + else + { + THROW_INFO* pNextThrow = &pPattern->pThrowInfo[ + (pObj->ThrowIndex + pThrow->TotalTime) % pPattern->ThrowLen]; + + *pPos = InterpolateCarry(pThrow, pNextThrow, Time - tc); + + if (pObj->ObjectType == OBJECT_BALL) + pPos->Rot = pObj->TotalTwist + BallTwist; + + OffsetHandlePosition(pPos, HandleLen, pPos); + } + } +} + + +/* Alpha is used to represent the acceleration due to gravity (in fact + * 2 * Alpha is the acceleration). Alpha is adjusted according to the pattern + * being juggled. My preference is to slow down patterns with lots of objects + * -- they move too fast in realtime. Also I prefer to see a balance between + * the size of the figure and the height of objects thrown -- juggling patterns + * with large numbers of objects under real gravity can mean balls are lobbed + * severe heights. Adjusting Alpha achieves both these goals. + * + * Basically we pick a height we'd like to see the biggest throw reach and then + * adjust Alpha to meet this. */ + +static void SetHeightAndAlpha(PATTERN_INFO* pPattern, + const int* Site, const EXT_SITE_INFO* pExtInfo, int Len) +{ + float H; + int MaxW = 5; + int i; + + if (Site != NULL) + { + for (i = 0; i < Len; i++) + MaxW = max(MaxW, Site[i]); + } + else + { + for (i = 0; i < Len; i++) + MaxW = max(MaxW, pExtInfo[i].Weight); + } + + /* H is the ideal max height we'd like our objects to reach. The formula + * was developed by trial and error and was simply stolen from Juggle Saver. + * Alpha is then calculated from the classic displacement formula: + * s = 0.5at^2 + ut (where a = 2 * Alpha) + * We know u (the velocity) is zero at the peak, and the object should fall + * H units in half the time of biggest throw weight. + * Finally we determine the proper height the max throw reaches since this + * may not be H because capping may be applied (e.g. for max weights less + * than 5). */ + + H = 8.0f * powf(MaxW / 2.0f, 0.8f) + 5.0f; + pPattern->Alpha = (2.0f * H) / powf(max(5, MaxW) - CARRY_TIME, 2.0f); + pPattern->Height = pPattern->Alpha * powf((MaxW - CARRY_TIME) * 0.5f, 2); +} + + +/* Where positions and spin info is not specified, generate suitable default + * values. */ + +static int GetDefaultSpins(int Weight) +{ + if (Weight < 3) + return 0; + else if (Weight < 4) + return 1; + else if (Weight < 7) + return 2; + else + return 3; +} + + +static void GetDefaultFromPosition(unsigned char Side, int Weight, POS* pPos) +{ + if (Weight > 4 && Weight % 2 != 0) + pPos->x = Side ? -0.06f : 0.06f; + else if (Weight == 0 || Weight == 2) + pPos->x = Side ? 1.6f : -1.6f; + else + pPos->x = Side? 0.24f : -0.24f; + + pPos->y = (Weight == 2 || Weight == 0) ? -0.25f : 0.0f; + + pPos->Rot = (Weight % 2 == 0 ? -23.5f : 27.0f) * (Side ? -1.0f : 1.0f); + + pPos->Elev = Weight == 1 ? -30.0f : 0.0f; + pPos->z = 0.0f; +} + + +static void GetDefaultToPosition(unsigned char Side, int Weight, POS* pPos) +{ + if (Weight == 1) + pPos->x = Side ? -1.0f : 1.0f; + else if (Weight % 2 == 0) + pPos->x = Side ? 2.8f : -2.8f; + else + pPos->x = Side? -3.1f : 3.1f; + + pPos->y = -0.5f; + + pPos->Rot = (Side ? -35.0f : 35.0f) * (Weight % 2 == 0 ? -1.0f : 1.0f); + + if (Weight < 2) + pPos->Elev = -30.0f; + + else if (Weight < 4) + pPos->Elev = 360.0f - 50.0f; + else if (Weight < 7) + pPos->Elev = 720.0f - 50.0f; + else + pPos->Elev = 360.0f * GetDefaultSpins(Weight) - 50.0f; + pPos->z = 0.0f; +} + + +/* Update the members of PATTERN_INFO for a given juggling pattern. The pattern + * can come from an ordinary siteswap (Site != NULL) or from a Juggle Saver + * compatible pattern that contains, position and object info etc. + * We assume that patterns are valid and have at least one object (a site of + * zeros is invalid). The ones we generate randomly are safe. */ + +static void InitPatternInfo(PATTERN_INFO* pPattern, + const int* Site, const EXT_SITE_INFO* pExtInfo, int Len) +{ + /* Double up on the length of the site if it's of an odd length. + * This way we can store position information: even indices are on one + * side and odds are on the other. */ + int InfoLen = Len % 2 == 1 ? Len * 2 : Len; + int i; + THROW_INFO* pInfo = (THROW_INFO*) calloc(InfoLen, sizeof(THROW_INFO)); + int Objects = 0; + unsigned char* pUsed; + + pPattern->MaxWeight = 0; + pPattern->ThrowLen = InfoLen; + pPattern->pThrowInfo = pInfo; + + SetHeightAndAlpha(pPattern, Site, pExtInfo, Len); + + /* First pass through we assign the things we know about for sure just by + * looking at the throw weight at this position. This includes TimeInAir; + * the throw and catch positions; and throw and catch velocities. + * Other information, like the total time for the throw (i.e. when the + * object is thrown again) relies on how the rest of the pattern is + * structured and we defer this task for successive passes and just make + * guesses at this stage. */ + + for (i = 0; i < InfoLen; i++) + { + float t1; + int w = pExtInfo != NULL ? pExtInfo[i % Len].Weight : Site[i % Len]; + + pInfo[i].TotalTime = pInfo[i].TimeInAir = w; + pInfo[(w + i) % Len].PrevThrow = i; + + /* work out where we are throwing this object from and where it's going + * to land. */ + + if (pExtInfo == NULL || (pExtInfo[i % Len].Flags & HAS_FROM_POS) == 0) + GetDefaultFromPosition(i % 2, w, &pInfo[i].FromPos); + else + pInfo[i].FromPos = pExtInfo[i % Len].FromPos; + + if (pExtInfo == NULL || (pExtInfo[i % Len].Flags & HAS_TO_POS) == 0) + GetDefaultToPosition(i % 2, w, &pInfo[i].ToPos); + else + pInfo[i].ToPos = pExtInfo[i % Len].ToPos; + + /* calculate the velocity the object is moving at the start and end + * points -- this information is used to interpolate the hand position + * and to determine how the object is moved while it's carried to the + * next throw position. + * + * The throw motion is governed by a parabola of the form: + * y(t) = a * t ^ 2 + b * t + c + * Assuming at the start of the throw y(0) = y0; when it's caught + * y(t1) = y1; and the accelation is -2.0 * alpha the equation can be + * rewritten as: + * y(t) = -alpha * t ^ 2 + (alpha * t1 + (y1 - y0) / t1) * t + y0 + * making the velocity: + * y'(t) = -2.0 * alpha * t + (alpha * t1 + (y1 - y0) / t1) + * To get the y component of velocity first we determine t1, which is + * the throw weight minus the time spent carrying the object. Then + * perform the relevant substitutions into the above. + * (note: y'(t) = y'(0) - 2.0 * alpha * t) + * + * The velocity in the x direction is constant and can be simply + * obtained from: + * x' = (x1 - x0) / t1 + * where x0 and x1 are the start and end x-positions respectively. + */ + + t1 = w - CARRY_TIME; + + pInfo[i].FromVelocity.y = pPattern->Alpha * t1 + + (pInfo[i].ToPos.y - pInfo[i].FromPos.y) / t1; + pInfo[i].ToVelocity.y = + pInfo[i].FromVelocity.y - 2.0f * pPattern->Alpha * t1; + pInfo[i].FromVelocity.x = pInfo[i].ToVelocity.x = + (pInfo[i].ToPos.x - pInfo[i].FromPos.x) / t1; + pInfo[i].FromVelocity.z = pInfo[i].ToVelocity.z = + (pInfo[i].ToPos.z - pInfo[i].FromPos.z) / t1; + pInfo[i].FromVelocity.Rot = pInfo[i].ToVelocity.Rot = + (pInfo[i].ToPos.Rot - pInfo[i].FromPos.Rot) / t1; + pInfo[i].FromVelocity.Elev = pInfo[i].ToVelocity.Elev = + (pInfo[i].ToPos.Elev - pInfo[i].FromPos.Elev) / t1; + + + if (pExtInfo != NULL && (pExtInfo[i % Len].Flags & HAS_SNATCH) != 0) + { + pInfo[i].ToVelocity.x = pExtInfo[i % Len].SnatchX; + pInfo[i].ToVelocity.y = pExtInfo[i % Len].SnatchY; + } + + if (pExtInfo != NULL && (pExtInfo[i % Len].Flags & HAS_SPINS) != 0) + { + pInfo[i].ToPos.Elev = 360.0f * pExtInfo[i % Len].Spins + + NormaliseAngle(pInfo[i].ToPos.Elev); + } + + Objects += w; + if (w > pPattern->MaxWeight) + pPattern->MaxWeight = w; + } + + Objects /= InfoLen; + + /* Now we go through again and work out exactly how long it is before the + * object is thrown again (ie. the TotalTime) typically this is the same + * as the time in air, however when we have a throw weight of '2' it's + * treated as a hold and we increase the total time accordingly. */ + + for (i = 0; i < InfoLen; i++) + { + if (pInfo[i].TimeInAir != 2) + { + int Next = pInfo[i].TimeInAir + i; + while (pInfo[Next % InfoLen].TimeInAir == 2) + { + Next += 2; + pInfo[i].TotalTime += 2; + } + + /* patch up the Prev index. We don't bother to see if this + * is different from before since it's always safe to reassign it */ + pInfo[Next % InfoLen].PrevThrow = i; + } + } + + /* then we work our way through again figuring out where the hand goes to + * catch something as soon as it has thrown the current object. */ + + for (i = 0; i < InfoLen; i++) + { + if (pInfo[i].TimeInAir != 0 && pInfo[i].TimeInAir != 2) + { + /* what we're trying to calculate is how long the hand that threw + * the current object has to wait before it throws another. + * Typically this is two beats later. However '0' in the site swap + * represents a gap in a catch, and '2' represents a hold. We skip + * over these until we reach the point where a ball is actually + * thrown. */ + int Wait = 2; + while (pInfo[(i + Wait) % InfoLen].TimeInAir == 2 || + pInfo[(i + Wait) % InfoLen].TimeInAir == 0) + { + Wait += 2; + } + pInfo[i].NextForHand = Wait; + } + else + { + /* Be careful to ensure the current weight isn't one we're trying + * to step over; otherwise we could potentially end up in an + * infinite loop. The value we assign may end up being used + * in patterns with infinite gaps (e.g. 60) or infinite holds + * (e.g. 62) in both cases, setting a wait of 2 ensures things + * are well behaved. */ + pInfo[i].NextForHand = 2; + } + } + + /* Now work out the starting positions for the objects. To do this we + * unweave the initial throws so we can pick out the individual threads. */ + + pUsed = (unsigned char*) + malloc(sizeof(unsigned char) * pPattern->MaxWeight); + pPattern->Objects = Objects; + pPattern->pObjectInfo = (OBJECT_POSITION*) calloc( + Objects, sizeof(OBJECT_POSITION)); + + for (i = 0; i < pPattern->MaxWeight; i++) + pUsed[i] = 0; + + for (i = 0; i < pPattern->MaxWeight; i++) + { + int w = pInfo[i % InfoLen].TimeInAir; + if (pUsed[i] == 0 && w != 0) + { + Objects--; + pPattern->pObjectInfo[Objects].TimeOffset = i; + pPattern->pObjectInfo[Objects].ThrowIndex = i % InfoLen; + pPattern->pObjectInfo[Objects].TotalTwist = 0.0f; + + if (pExtInfo != NULL && + pExtInfo[i % Len].ObjectType != OBJECT_DEFAULT) + { + pPattern->pObjectInfo[Objects].ObjectType = + pExtInfo[i % Len].ObjectType; + } + else + { + pPattern->pObjectInfo[Objects].ObjectType = (1 + random() % 3); + } + } + + if (w + i < pPattern->MaxWeight) + pUsed[w + i] = 1; + + } + + pPattern->LeftHand.TimeOffset = pPattern->LeftHand.ThrowIndex = 0; + pPattern->RightHand.TimeOffset = pPattern->RightHand.ThrowIndex = 1; + + free(pUsed); +} + + +static void ReleasePatternInfo(PATTERN_INFO* pPattern) +{ + free(pPattern->pObjectInfo); + free(pPattern->pThrowInfo); +} + + +/***************************************************************************** + * + * Sites + * + ****************************************************************************/ + +/* Generate a random site swap. We assume that MaxWeight >= ObjCount and + * Len >= MaxWeight. */ + +static int* Generate(int Len, int MaxWeight, int ObjCount) +{ + int* Weight = (int*) calloc(Len, sizeof(int)); + int* Used = (int*) calloc(Len, sizeof(int)); + int* Options = (int*) calloc(MaxWeight + 1, sizeof(int)); + int nOpts; + int i, j; + + for (i = 0; i < Len; i++) + Weight[i] = Used[i] = -1; + + /* Pick out a unique the starting position for each object. -2 is put in + * the Used array to signify this is a starting position. */ + + while (ObjCount > 0) + { + nOpts = 0; + for (j = 0; j < MaxWeight; j++) + { + if (Used[j] == -1) + Options[nOpts++] = j; + } + + Used[Options[random() % nOpts]] = -2; + ObjCount--; + } + + /* Now work our way through the pattern moving throws into an available + * landing positions. */ + for (i = 0; i < Len; i++) + { + if (Used[i] == -1) + { + /* patch up holes in the pattern to zeros */ + Used[i] = 1; + Weight[i] = 0; + } + else + { + /* Work out the possible places where a throw can land and pick a + * weight at random. */ + int w; + nOpts = 0; + + for (j = 0 ; j <= MaxWeight; j++) + { + if (Used[(i + j) % Len] == -1) + Options[nOpts++] = j; + } + + w = Options[random() % nOpts]; + Weight[i] = w; + + /* For starting throws make position available for a throw to land. + * Because Len >= MaxWeight these positions will only be filled when + * a throw wraps around the end of the site swap and therefore we + * can guarantee the all the object threads will be tied up. */ + if (Used[i] == -2) + Used[i] = -1; + + Used[(i + w) % Len] = 1; + } + } + + free(Options); + free(Used); + return Weight; +} + + +/* Routines to parse the Juggle Saver patterns. These routines are a bit yucky + * and make the big assumption that the patterns are well formed. This is fine + * as it stands because only 'good' ones are used but if the code is ever + * extended to read arbitrary patterns (say from a file) then these routines + * need to be beefed up. */ + +/* The position text looks something like (x,y,z[,rot[,elev]]) + * where the stuff in square brackets is optional */ + +static unsigned char ParsePositionText(const char** ppch, POS* pPos) +{ + const char* pch = *ppch; + unsigned char OK; + char szTemp[32]; + char* pOut; + float* Nums[4]; + int i; + + Nums[0] = &pPos->x; + Nums[1] = &pPos->y; + Nums[2] = &pPos->Rot; + Nums[3] = &pPos->Elev; + + + while (*pch == ' ') + pch++; + + OK = *pch == '('; + + if (OK) + pch++; + + for (i = 0; OK && i < 4; i++) + { + pOut = szTemp; + while (*pch == ' ') + pch++; + while (*pch != ',' && *pch != '\0' && *pch != ')' && *pch != ' ') + *pOut++ = *pch++; + *pOut = '\0'; + + if (szTemp[0] != '\0') + *Nums[i] = (float) atof(szTemp); + + while (*pch == ' ') + pch++; + + if (i < 3) + { + if (*pch == ',') + pch++; + else if (*pch == ')') + break; + else + OK = 0; + } + } + + if (OK) + { + while (*pch == ' ') + pch++; + if (*pch == ')') + pch++; + else + OK = 0; + } + + *ppch = pch; + + return OK; +} + + +static EXT_SITE_INFO* ParsePattern(const char* Site, int* pLen) +{ + const char* pch = Site; + int Len = 0; + EXT_SITE_INFO* pInfo = NULL; + unsigned char OK = 1; + + while (OK && *pch != 0) + { + EXT_SITE_INFO Info; + Info.Flags = 0; + + while (*pch == ' ') pch++; + + OK = *pch != '\0'; + + if (OK) + Info.Weight = *pch >= 'A' ? *pch + 10 - 'A' : *pch - '0'; + + /* parse object type */ + if (OK) + { + pch++; + while (*pch == ' ') pch++; + + if (*pch == 'b' || *pch == 'B') + { + Info.ObjectType = OBJECT_BALL; + pch++; + } + else if (*pch == 'c' || *pch == 'C') + { + Info.ObjectType = OBJECT_CLUB; + pch++; + } + else if (*pch == 'r' || *pch == 'R') + { + Info.ObjectType = OBJECT_RING; + pch++; + } + else if (*pch == 'd' || *pch == 'D') + { + Info.ObjectType = OBJECT_DEFAULT; + pch++; + } + else + { + Info.ObjectType = OBJECT_DEFAULT; + } + } + + /* Parse from position */ + if (OK) + { + while (*pch == ' ') pch++; + if (*pch == '@') + { + pch++; + GetDefaultFromPosition(Len % 2, Info.Weight, &Info.FromPos); + Info.Flags |= HAS_FROM_POS; + OK = ParsePositionText(&pch, &Info.FromPos); + } + } + + /* Parse to position */ + if (OK) + { + while (*pch == ' ') pch++; + if (*pch == '>') + { + pch++; + GetDefaultToPosition(Len % 2, Info.Weight, &Info.ToPos); + Info.Flags |= HAS_TO_POS; + OK = ParsePositionText(&pch, &Info.ToPos); + } + } + + /* Parse snatch */ + if (OK) + { + while (*pch == ' ') pch++; + if (*pch == '/') + { + POS Snatch; + pch++; + Info.Flags |= HAS_SNATCH; + OK = ParsePositionText(&pch, &Snatch); + Info.SnatchX = Snatch.x; + Info.SnatchY = Snatch.y; + } + } + + /* Parse Spins */ + if (OK) + { + while (*pch == ' ') pch++; + if (*pch == '*') + { + pch++; + OK = 0; + Info.Spins = 0; + while (*pch >= '0' && *pch <= '9') + { + OK = 1; + Info.Spins = Info.Spins * 10 + *pch - '0'; + pch++; + } + } + else + Info.Spins = GetDefaultSpins(Info.Weight); + + Info.Flags |= HAS_SPINS; + } + + if (OK) + { + if (pInfo == NULL) + pInfo = (EXT_SITE_INFO*) malloc(sizeof(EXT_SITE_INFO)); + else + pInfo = (EXT_SITE_INFO*) realloc(pInfo, (Len + 1) * sizeof(EXT_SITE_INFO)); + + pInfo[Len] = Info; + Len++; + } + } + + if (!OK && pInfo != NULL) + { + free(pInfo); + pInfo = NULL; + } + + *pLen = Len; + + return pInfo; +} + + +/***************************************************************************** + * + * Juggle Saver Patterns + * + ***************************************************************************** + * + * This is a selection of some of the more interesting patterns from taken + * from the Juggle Saver sites.txt file. I've only used patterns that I + * originally created. + */ + +const char* PatternText[] = +{ + "9b@(-2.5,0,-70,40)>(2.5,0,70)*2 1b@(1,0,10)>(-1,0,-10)", + + "3B@(1,-0.4)>(2,4.2)/(-2,1)3B@(-1.8,4.4)>(-2.1,0)", + + "7c@(-2,0,-20)>(1.2,0,-5)7c@(2,0,20)>(-1.2,0,5)", + + "3b@(-0.5,0)>(1.5,0) 3b@(0.5,0)>(-1.5,0) 3r@(-2.5,3,-90,80)>(2,1,90,30)" + "3b@(0.5,0)>(-1.5,0) 3b@(-0.5,0)>(1.5,0) 3r@(2.5,3,90,80)>(-2,1,-90,30)", + + "5c@(2,1.9,10)>(-1,1,10)5c@(2,1.8,10)>(-0.5,1.6,10)/(5,-1)" + "5c@(1.6,0.2,10)>(0,-1,10)/(9,-2)5c@(-2,1.9,-10)>(1,1,-10)" + "5c@(-2,1.8,-10)>(0.5,1.6,-10)/(-5,-1)5@(-1.6,0.2,-10)>(0,-1,-10)/(-9,-2)", + + "3c@(-1.5,0,0)>(-1.5,1,0)3c@(1.5,-0.2,0)>(1.5,-0.1,0)3c@(0,-0.5,0)>(0,1,0)" + "3@(-1.5,2,0)>(-1.5,-1,0)3@(1.5,0,0)>(1.5,1,0)3@(0,0,0)>(0,-0.5,0)", + + "9c@(-2.5,0,-70,40)>(2.5,0,70)*2 1c@(1,0,10)>(-1,0,-10)*0", + + "3c@(2,0.5,60,0)>(1.5,4,60,80)/(-6,-12)" + "3c@(-2,0.5,-60,0)>(-1.5,4,-60,80)/(6,-12)", + + "3c@(-0.2,0)>(1,0)3c@(0.2,0)>(-1,0)3c@(-2.5,2,-85,30)>(2.5,2,85,40)*2 " + "3@(0.2,0)>(-1,0) 3@(-0.2,0)>(1,0) 3@(2.5,2,85,30)>(-2.5,2,-85,40)*2", + + "3c@(-0.5,-0.5,20,-30)>(2.6,4.3,60,60)/(0,1)*1 " + "3c@(1.6,5.6,60,80)>(-2.6,0,-80)*0", + + "5c@(-0.3,0,10)>(1.2,0,10) 5c@(0.3,0,-10)>(-1.2,0,-10)" + "5c@(-0.3,0,10)>(1.2,0,10) 5c@(0.3,0,-10)>(-1.2,0,-10)" + "5c@(-3,3.5,-65,80)>(3,2.5,65) 5c@(0.3,0,-10)>(-1.2,0,-10)" + "5@(-0.3,0,10)>(1.2,0,10) 5@(0.3,0,-10)>(-1.2,0,-10)" + "5@(-0.3,0,10)>(1.2,0,10)5@(3,3.5,65,80)>(-3,2.5,-65)" +}; + + +/***************************************************************************** + * + * Rendering + * + *****************************************************************************/ + +static const float FOV = 70.0f; +static const float BodyCol[] = {0.6f, 0.6f, 0.45f, 1.0f}; +static const float HandleCol[] = {0.45f, 0.45f, 0.45f, 1.0f}; +static const float LightPos[] = {0.0f, 200.0f, 400.0f, 1.0f}; +static const float LightDiff[] = {1.0f, 1.0f, 1.0f, 0.0f}; +static const float LightAmb[] = {0.02f, 0.02f, 0.02f, 0.0f}; +static const float ShoulderPos[3] = {0.95f, 2.1f, 1.7f}; +static const float DiffCol[] = {1.0f, 0.0f, 0.0f, 1.0f}; +static const float SpecCol[] = {1.0f, 1.0f, 1.0f, 1.0f}; + +static const float BallRad = 0.34f; +static const float UArmLen = 1.9f; +static const float LArmLen = 2.3f; + +#define DL_BALL 0 +#define DL_CLUB 1 +#define DL_RING 2 +#define DL_TORSO 3 +#define DL_FOREARM 4 +#define DL_UPPERARM 5 + +static const float AltCols[][4] = +{ + {0.0f, 0.7f, 0.0f, 1.0f}, + {0.0f, 0.0f, 0.9f, 1.0f}, + {0.0f, 0.9f, 0.9f, 1.0f}, + {0.45f, 0.0f, 0.9f, 1.0f}, + {0.9f, 0.45f, 0.0f, 1.0f}, + {0.0f, 0.45f, 0.9f, 1.0f}, + {0.9f, 0.0f, 0.9f, 1.0f}, + {0.9f, 0.9f, 0.0f, 1.0f}, + {0.9f, 0.0f, 0.45f, 1.0f}, + {0.45f, 0.15f, 0.6f, 1.0f}, + {0.9f, 0.0f, 0.0f, 1.0f}, + {0.0f, 0.9f, 0.45f, 1.0f}, +}; + +static const float Cols[][4] = +{ + {0.9f, 0.0f, 0.0f, 1.0f}, /* 0 */ + {0.0f, 0.7f, 0.0f, 1.0f}, /* 1 */ + {0.0f, 0.0f, 0.9f, 1.0f}, /* 2 */ + {0.0f, 0.9f, 0.9f, 1.0f}, /* 3 */ + {0.9f, 0.0f, 0.9f, 1.0f}, /* 4 */ + {0.9f, 0.9f, 0.0f, 1.0f}, /* 5 */ + {0.9f, 0.45f, 0.0f, 1.0f}, /* 6 */ + {0.9f, 0.0f, 0.45f, 1.0f}, /* 7 */ + {0.45f, 0.9f, 0.0f, 1.0f}, /* 8 */ + {0.0f, 0.9f, 0.45f, 1.0f}, /* 9 */ + {0.45f, 0.0f, 0.9f, 1.0f}, /* 10 */ + {0.0f, 0.45f, 0.9f, 1.0f}, /* 11 */ +}; + +static int InitGLDisplayLists(void); + + +void InitGLSettings(RENDER_STATE* pState, int WireFrame) +{ + memset(pState, 0, sizeof(RENDER_STATE)); + + pState->trackball = gltrackball_init (); + + if (WireFrame) + glPolygonMode(GL_FRONT, GL_LINE); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + glLightfv(GL_LIGHT0, GL_POSITION, LightPos); + glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiff); + glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmb); + + glEnable(GL_SMOOTH); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + + glDepthFunc(GL_LESS); + glEnable(GL_DEPTH_TEST); + + glCullFace(GL_BACK); + glEnable(GL_CULL_FACE); + + pState->DLStart = InitGLDisplayLists(); +} + + +static void SetCamera(RENDER_STATE* pState) +{ + /* Try to work out a sensible place to put the camera so that more or less + * the whole juggling pattern fits into the screen. We assume that the + * pattern is height limited (i.e. if we get the height right then the width + * will be OK). This is a pretty good assumption given that the screen + * tends to wider than high, and that a juggling pattern is normally much + * higher than wide. + * + * If I could draw a diagram here then it would be much easier to + * understand but my ASCII-art skills just aren't up to it. + * + * Basically we estimate a bounding volume for the juggler and objects + * throughout the pattern. We don't fully account for the fact that the + * juggler moves across the stage in an epicyclic-like motion and instead + * use the near and far planes in x-y (with z = +/- w). We also + * assume that the scene is centred at x=0, this reduces our task to finding + * a bounding rectangle. Finally we need to make an estimate of the + * height - for this we work out the max height of a standard throw or max + * weight from the pattern; we then do a bit of adjustment to account for + * a throw occurring at non-zero y values. + * + * Next we work out the best way to fit this rectangle into the perspective + * transform. Based on the angle of elevation (+ve angle looks down) and + * the FOV we can work out whether it's the near or far corners that are + * the extreme points. And then trace back from them to find the eye + * point. + * + */ + + float ElevRad = pState->CameraElev * PI / 180.0f; + float w = 3.0f; + float cy, cz; + float ey, ez; + float d; + float H = 0.0f; + int i; + float a; + + float tz, ty, ta; + float bz, by, ba; + const PATTERN_INFO* pPattern = pState->pPattern; + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + for (i = 0; i < pPattern->ThrowLen; i++) + H = max(H, pPattern->pThrowInfo[i].FromPos.y); + + H += pPattern->Height; + + ElevRad = pState->CameraElev * PI / 180.0f; + + /* ta is the angle from a point on the top of the bounding area to the eye + * similarly ba is the angle from a point on the bottom. */ + ta = (pState->CameraElev - (FOV - 10.0f) / 2.0f) * PI / 180.0f; + ba = (pState->CameraElev + (FOV - 10.0f) / 2.0f) * PI / 180.0f; + + /* tz and bz hold the z location of the top and bottom extreme points. + * For the top, if the angle to the eye location is positive then the + * extreme point is with far z corner (the camera looks in -ve z). + * The logic is reserved for the bottom. */ + tz = ta >= 0.0f ? -w : w; + bz = ba >= 0.0f ? w : -w; + + ty = H; + by = -1.0f; + + /* Solve of the eye location by using a bit of geometry. + * We know the eye lies on intersection of two lines. One comes from the + * top and other from the bottom. Giving two equations: + * ez = tz + a * cos(ta) = bz + b * cos(ba) + * ey = ty + a * sin(ta) = by + b * sin(ba) + * We don't bother to solve for b and use Crammer's rule to get + * | bz-tz -cos(ba) | + * | by-ty -sin(ba) | + * a = ---------------------- + * | cos(ta) -cos(ba) | + * | sin(ta) -sin(ba) | + */ + d = cosf(ba) * sinf(ta) - cosf(ta) * sinf(ba); + a = (cosf(ba) * (by - ty) - sinf(ba) * (bz - tz)) / d; + + ey = ty + a * sinf(ta); + ez = tz + a * cosf(ta); + + /* now work back from the eye point to get the lookat location */ + cz = 0.0; + cy = ey - ez * tanf(ElevRad); + + /* use the distance from the eye to the scene centre to get a measure + * of what the far clipping should be. We then add on a bit more to be + * comfortable */ + d = sqrtf(ez * ez + (cy - ey) * (cy - ey)); + + gluPerspective(FOV, pState->AspectRatio, 0.1f, d + 20.0f); + gluLookAt(0.0, ey, ez, 0.0, cy, cz, 0.0, 1.0, 0.0); + + glMatrixMode(GL_MODELVIEW); +} + + +void ResizeGL(RENDER_STATE* pState, int w, int h) +{ + glViewport(0, 0, w, h); + pState->AspectRatio = (float) w / h; + SetCamera(pState); +} + + +/* Determine the angle at the vertex of a triangle given the length of the + * three sides. */ + +static double CosineRule(double a, double b, double c) +{ + double cosang = (a * a + b * b - c * c) / (2 * a * b); + /* If lengths don't form a proper triangle return something sensible. + * This typically happens with patterns where the juggler reaches too + * far to get hold of an object. */ + if (cosang < -1.0 || cosang > 1.0) + return 0; + else + return 180.0 * acos(cosang) / PI; +} + + +/* Spheres for the balls are generated by subdividing each triangle face into + * four smaller triangles. We start with an octahedron (8 sides) and repeat the + * process a number of times. The result is a mesh that can be split into four + * panels (like beanbags) and is smoother than the normal stacks and slices + * approach. */ + +static void InterpolateVertex( + const float* v1, const float* v2, float t, float* result) +{ + result[0] = v1[0] * (1.0f - t) + v2[0] * t; + result[1] = v1[1] * (1.0f - t) + v2[1] * t; + result[2] = v1[2] * (1.0f - t) + v2[2] * t; +} + + +static void SetGLVertex(const float* v, float rad) +{ + float Len = sqrtf(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); + + if (Len >= 1.0e-10f) + { + glNormal3f(v[0] / Len, v[1] / Len, v[2] / Len); + glVertex3f(rad * v[0] / Len, rad * v[1] / Len, rad * v[2] / Len); + } + else + glVertex3fv(v); +} + + +static void SphereSegment( + const float* v1, const float* v2, const float* v3, float r, int Levels) +{ + int i, j; + + for (i = 0; i < Levels; i++) + { + float A[3], B[3], C[3], D[3]; + + InterpolateVertex(v3, v1, (float) i / Levels, D); + InterpolateVertex(v3, v1, (float)(i + 1) / Levels, A); + InterpolateVertex(v3, v2, (float)(i + 1) / Levels, B); + InterpolateVertex(v3, v2, (float) i / Levels, C); + + glBegin(GL_TRIANGLE_STRIP); + + SetGLVertex(B, r); + SetGLVertex(C, r); + + for (j = 1; j <= i; j++) + { + float v[3]; + + InterpolateVertex(B, A, (float) j / (i + 1), v); + SetGLVertex(v, r); + + InterpolateVertex(C, D, (float) j / i, v); + SetGLVertex(v, r); + } + + SetGLVertex(A, r); + + glEnd(); + } +} + + +/* OK, this function is a bit of misnomer, it only draws half a sphere. Indeed + * it draws two panels and allows us to colour this one way, then draw the + * same shape again rotated 90 degrees in a different colour. Resulting in what + * looks like a four-panel beanbag in two complementary colours. */ + +static void DrawSphere(float rad) +{ + int Levels = 4; + float v1[3], v2[3], v3[3]; + + v1[0] = 1.0f, v1[1] = 0.0f; v1[2] = 0.0f; + v2[0] = 0.0f, v2[1] = 1.0f; v2[2] = 0.0f; + v3[0] = 0.0f, v3[1] = 0.0f; v3[2] = 1.0f; + SphereSegment(v1, v2, v3, rad, Levels); + + v2[1] = -1.0f; + SphereSegment(v2, v1, v3, rad, Levels); + + v1[0] = v3[2] = -1.0f; + SphereSegment(v2, v1, v3, rad, Levels); + + v2[1] = 1.0f; + SphereSegment(v1, v2, v3, rad, Levels); +} + + +static void DrawRing(void) +{ + const int Facets = 22; + const float w = 0.1f; + GLUquadric* pQuad = gluNewQuadric(); + glRotatef(90.0f, 0.0f, 1.0f, 0.0f); + glTranslatef(0.0f, 0.0f, -w / 2.0f); + + gluCylinder(pQuad, 1.0f, 1.0f, w, Facets, 1); + gluQuadricOrientation(pQuad, GLU_INSIDE); + + gluCylinder(pQuad, 0.7f, 0.7f, w, Facets, 1); + gluQuadricOrientation(pQuad, GLU_OUTSIDE); + + glTranslatef(0.0f, 0.0f, w); + gluDisk(pQuad, 0.7, 1.0f, Facets, 1); + + glRotatef(180.0f, 0.0f, 1.0f, 0.0f); + glTranslatef(0.0f, 0.0f, w); + gluDisk(pQuad, 0.7, 1.0f, Facets, 1); + + gluDeleteQuadric(pQuad); +} + + +/* The club follows a 'circus club' design i.e. it has stripes running down the + * body. The club is draw such that the one stripe uses the current material + * and the second stripe the standard silver colour. */ + +void DrawClub(void) +{ + const float r[4] = {0.06f, 0.1f, 0.34f, 0.34f / 2.0f}; + const float z[4] = {-0.4f, 0.6f, 1.35f, 2.1f}; + float na[4]; + const int n = 18; + int i, j; + GLUquadric* pQuad; + + na[0] = (float) atan((r[1] - r[0]) / (z[1] - z[0])); + na[1] = (float) atan((r[2] - r[1]) / (z[2] - z[1])); + na[2] = (float) atan((r[3] - r[1]) / (z[3] - z[1])); + na[3] = (float) atan((r[3] - r[2]) / (z[3] - z[2])); + + for (i = 0; i < n; i += 2) + { + float a1 = i * PI * 2.0f / n; + float a2 = (i + 1) * PI * 2.0f / n; + + glBegin(GL_TRIANGLE_STRIP); + for (j = 1; j < 4; j++) + { + glNormal3f(cosf(na[j]) * cosf(a1), + cosf(na[j]) * sinf(a1), sinf(na[j])); + + glVertex3f(r[j] * cosf(a1), r[j] * sinf(a1), z[j]); + + glNormal3f(cosf(na[j]) * cosf(a2), + cosf(na[j]) * sinf(a2), sinf(na[j])); + + glVertex3f(r[j] * cosf(a2), r[j] * sinf(a2), z[j]); + } + glEnd(); + } + + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, HandleCol); + + for (i = 1; i < n; i += 2) + { + float a1 = i * PI * 2.0f / n; + float a2 = (i + 1) * PI * 2.0f / n; + + glBegin(GL_TRIANGLE_STRIP); + for (j = 1; j < 4; j++) + { + glNormal3f(cosf(na[j]) * cosf(a1), + cosf(na[j]) * sinf(a1), sinf(na[j])); + + glVertex3f(r[j] * cosf(a1), r[j] * sinf(a1), z[j]); + + glNormal3f(cosf(na[j]) * cosf(a2), + cosf(na[j]) * sinf(a2), sinf(na[j])); + + glVertex3f(r[j] * cosf(a2), r[j] * sinf(a2), z[j]); + } + glEnd(); + } + + pQuad = gluNewQuadric(); + glTranslatef(0.0f, 0.0f, z[0]); + gluCylinder(pQuad, r[0], r[1], z[1] - z[0], n, 1); + + glTranslatef(0.0f, 0.0f, z[3] - z[0]); + gluDisk(pQuad, 0.0, r[3], n, 1); + glRotatef(180.0f, 0.0f, 1.0f, 0.0f); + glTranslatef(0.0f, 0.0f, z[3] - z[0]); + gluDisk(pQuad, 0.0, r[0], n, 1); + gluDeleteQuadric(pQuad); +} + + +/* In total 6 display lists are used. There are created based on the DL_ + * constants defined earlier. The function returns the index of the first + * display list, all others can be calculated based on an offset from there. */ + +static int InitGLDisplayLists(void) +{ + int s = glGenLists(6); + GLUquadric* pQuad; + + glNewList(s + DL_BALL, GL_COMPILE); + DrawSphere(BallRad); + glEndList(); + + glNewList(s + DL_CLUB, GL_COMPILE); + DrawClub(); + glEndList(); + + glNewList(s + DL_RING, GL_COMPILE); + DrawRing(); + glEndList(); + + pQuad = gluNewQuadric(); + gluQuadricNormals(pQuad, GLU_SMOOTH); + + glNewList(s + DL_TORSO, GL_COMPILE); + glPushMatrix(); + glTranslatef(ShoulderPos[0], ShoulderPos[1], -ShoulderPos[2]); + glRotatef(-90.0f, 0.0f, 1.0f, 0.0f); + gluCylinder(pQuad, 0.3, 0.3, ShoulderPos[0] * 2, 18, 1); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(0.0f, -1.0f, -ShoulderPos[2]); + glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); + gluCylinder(pQuad, 0.3, 0.3, ShoulderPos[1] + 1.0f, 18, 1); + glRotatef(180.0f, 1.0f, 0.0f, 0.0f); + gluDisk(pQuad, 0.0, 0.3, 18, 1); + glPopMatrix(); + + /* draw the head */ + glPushMatrix(); + glTranslatef(0.0f, ShoulderPos[1] + 1.0f, -ShoulderPos[2]); + glRotatef(-30.0f, 1.0f, 0.0f, 0.0f); + gluCylinder(pQuad, 0.5, 0.5, 0.3, 15, 1); + + glPushMatrix(); + glRotatef(180.0f, 1.0f, 0.0f, 0.0f); + glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + gluDisk(pQuad, 0.0, 0.5, 15, 1); + glPopMatrix(); + + glTranslatef(0.0f, 0.0f, .3f); + gluDisk(pQuad, 0.0, 0.5, 15, 1); + glPopMatrix(); + glEndList(); + + glNewList(s + DL_UPPERARM, GL_COMPILE); + gluQuadricNormals(pQuad, GLU_SMOOTH); + gluQuadricDrawStyle(pQuad, GLU_FILL); + gluSphere(pQuad, 0.3, 12, 8); + + gluCylinder(pQuad, 0.3, 0.3, UArmLen, 12, 1); + glTranslatef(0.0f, 0.0f, UArmLen); + gluSphere(pQuad, 0.3, 12, 8); + glEndList(); + + glNewList(s + DL_FOREARM, GL_COMPILE); + gluCylinder(pQuad, 0.3, 0.3 / 2.0f, LArmLen, 12, 1); + glTranslatef(0.0f, 0.0f, LArmLen); + gluDisk(pQuad, 0, 0.3 / 2.0f, 18, 1); + glEndList(); + + gluDeleteQuadric(pQuad); + return s; +} + + +/* Drawing the arm requires connecting the upper and fore arm between the + * shoulder and hand position. Thinking about things kinematically by treating + * the shoulder and elbow as ball joints then, provided the arm can stretch far + * enough, there's a infnite number of ways to position the elbow. Basically + * it's possible to fix and hand and shoulder and then rotate the elbow a full + * 360 degrees. Clearly human anatomy isn't like this and picking a natural + * elbow position can be complex. We chicken out and assume that poking the + * elbow out by 20 degrees from the lowest position gives a reasonably looking + * orientation. */ + +void DrawArm(RENDER_STATE* pState, float TimePos, int Left) +{ + POS Pos; + float x, y, len, len2, ang, ang2; + + GetHandPosition(pState->pPattern, Left, TimePos, &Pos); + + x = Pos.x + (Left ? -ShoulderPos[0] : ShoulderPos[0]); + y = Pos.y - ShoulderPos[1]; + + + len = sqrtf(x * x + y * y + ShoulderPos[2] * ShoulderPos[2]); + len2 = sqrtf(x * x + ShoulderPos[2] * ShoulderPos[2]); + + ang = (float) CosineRule(UArmLen, len, LArmLen); + ang2 = (float) CosineRule(UArmLen, LArmLen, len); + + if (ang == 0.0 && ang2 == 0) + ang2 = 180.0; + + + glPushMatrix(); + glTranslatef(Left ? ShoulderPos[0] : -ShoulderPos[0], ShoulderPos[1], + -ShoulderPos[2]); + glRotatef((float)(180.0f * asin(x / len2) / 3.14f), 0.0f, 1.0f, 0.0f); + glRotatef((float)(-180.f * asin(y / len) / 3.14), 1.0f, 0.0f, 0.0f); + glRotatef(Left ? 20.0f : -20.0f, 0.0f, 0.0f, 1.0f); + glRotatef((float) ang, 1.0f, 0.0f, 0.0f); + glCallList(DL_UPPERARM + pState->DLStart); + + glRotatef((float)(ang2 - 180.0), 1.0f, 0.0f, 0.f); + glCallList(DL_FOREARM + pState->DLStart); + glPopMatrix(); +} + + +void DrawGLScene(RENDER_STATE* pState) +{ + float Time = pState->Time; + int nCols = sizeof(Cols) / sizeof(Cols[0]); + int i; + + PATTERN_INFO* pPattern = pState->pPattern; + + glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(5.0f * sinf(pState->TranslateAngle), 0.0f, 0.0f); + + gltrackball_rotate (pState->trackball); + + glRotatef(pState->SpinAngle, 0.0f, 1.0f, 0.0f); + glTranslatef(0.0, 0.0, -1.0f); + + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, DiffCol); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, SpecCol); + glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 60.0f); + + for (i = 0; i < pPattern->Objects; i++) + { + POS ObjPos; + + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Cols[i % nCols]); + glPushMatrix(); + + switch (pPattern->pObjectInfo[i].ObjectType) + { + case OBJECT_CLUB: + GetObjectPosition(pPattern, i, Time, 1.0f, &ObjPos); + glTranslatef(ObjPos.x, ObjPos.y, ObjPos.z); + glRotatef(ObjPos.Rot, 0.0f, 1.0f, 0.0f); + glRotatef(ObjPos.Elev, -1.0f, 0.0f, 0.0f); + glTranslatef(0.0f, 0.0f, -1.0f); + glCallList(DL_CLUB + pState->DLStart); + break; + + case OBJECT_RING: + GetObjectPosition(pPattern, i, Time, 1.0f, &ObjPos); + glTranslatef(ObjPos.x, ObjPos.y, ObjPos.z); + glRotatef(ObjPos.Rot, 0.0f, 1.0f, 0.0f); + glRotatef(ObjPos.Elev, -1.0f, 0.0f, 0.0f); + glCallList(DL_RING + pState->DLStart); + break; + + default: + GetObjectPosition(pPattern, i, Time, 0.0f, &ObjPos); + glTranslatef(ObjPos.x, ObjPos.y, ObjPos.z); + glRotatef(ObjPos.Rot, 0.6963f, 0.6963f, 0.1742f); + glCallList(DL_BALL + pState->DLStart); + glRotatef(90.0f, 0.0f, 1.0f, 0.0f); + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, + AltCols[i % nCols]); + glCallList(DL_BALL + pState->DLStart); + break; + } + + glPopMatrix(); + } + + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, BodyCol); + glCallList(DL_TORSO + pState->DLStart); + DrawArm(pState, Time, 1); + DrawArm(pState, Time, 0); +} + + +static int RandInRange(int Min, int Max) +{ + return Min + random() % (1 + Max - Min); +} + + +extern void UpdatePattern( + RENDER_STATE* pState, int MinBalls, int MaxBalls, + int MinHeightInc, int MaxHeightInc) +{ + if (pState->pPattern != NULL) + ReleasePatternInfo(pState->pPattern); + + pState->pPattern = (PATTERN_INFO*) malloc(sizeof(PATTERN_INFO)); + + if ((random() % 3) == 1) + { + int ExtSiteLen; + int n = random() % (sizeof(PatternText) / sizeof(PatternText[0])); + EXT_SITE_INFO* pExtInfo = ParsePattern(PatternText[n], &ExtSiteLen); + InitPatternInfo(pState->pPattern, NULL, pExtInfo, ExtSiteLen); + free(pExtInfo); + } + else + { + int* pRand; + int ballcount, maxweight; + const int RandPatternLen = 1500; + + ballcount = RandInRange(MinBalls, MaxBalls); + maxweight = ballcount + RandInRange(MinHeightInc, MaxHeightInc); + + pRand = Generate(RandPatternLen, maxweight, ballcount); + InitPatternInfo(pState->pPattern, pRand, NULL, RandPatternLen); + free(pRand); + } + + pState->CameraElev = 50.0f - random() % 90; + pState->TranslateAngle = random() % 360; + pState->SpinAngle = random() % 360; + pState->Time = 50.0f; + SetCamera(pState); +} + + +/******************************************************************************* + * + * XScreenSaver Configuration + * + ******************************************************************************/ + +extern XtAppContext app; + +typedef struct +{ + GLXContext* glxContext; + RENDER_STATE RenderState; + float CurrentFrameRate; + unsigned FramesSinceSync; + unsigned LastSyncTime; +} JUGGLER3D_CONFIG; + + +static JUGGLER3D_CONFIG* pConfigInfo = NULL; +static int MaxObjects; +static int MinObjects; +static int MaxHeightInc; +static int MinHeightInc; +static float SpinSpeed; +static float TranslateSpeed; +static float JuggleSpeed; + +static XrmOptionDescRec Options[] = +{ + {"-spin", ".spin", XrmoptionSepArg, 0}, + {"-trans", ".trans", XrmoptionSepArg, 0}, + {"-speed", ".speed", XrmoptionSepArg, 0}, + {"-maxobjs", ".maxobjs", XrmoptionSepArg, 0}, + {"-minobjs", ".minobjs", XrmoptionSepArg, 0}, + {"-maxhinc", ".maxhinc", XrmoptionSepArg, 0}, + {"-minhinc", ".minhinc", XrmoptionSepArg, 0}, +}; + + +static argtype Vars[] = +{ + {&MaxObjects, "maxobjs", "MaxObjs", "8", t_Int}, + {&MinObjects, "minobjs", "MinObjs", "3", t_Int}, + {&MaxHeightInc, "maxhinc", "MaxHInc", "6", t_Int}, + {&MinHeightInc, "minhinc", "MaxHInc", "2", t_Int}, + {&JuggleSpeed, "speed", "JuggleSpeed", "2.2", t_Float}, + {&TranslateSpeed, "trans", "TranslateSpeed", "0.1", t_Float}, + {&SpinSpeed, "spin", "SpinSpeed", "20.0", t_Float}, +}; + + +ModeSpecOpt SWITCH_OPTS = {countof(Options), Options, countof(Vars), Vars}; + + +void Juggler3D_HackReshapeEvent(ModeInfo *mi, int width, int height) +{ + JUGGLER3D_CONFIG* pConfig = &pConfigInfo[MI_SCREEN(mi)]; + ResizeGL(&pConfig->RenderState, width, height); +} + + +void Juggler3D_HackInitEvent(ModeInfo* mi) +{ + JUGGLER3D_CONFIG* pConfig; + + if (pConfigInfo == NULL) + { + /* Apply suitable bounds checks to the input parameters */ + MaxObjects = max(3, min(MaxObjects, 36)); + MinObjects = max(3, min(MinObjects, MaxObjects)); + + MaxHeightInc = max(1, min(MaxHeightInc, 32)); + MinHeightInc = max(1, min(MinHeightInc, MaxHeightInc)); + + pConfigInfo = (JUGGLER3D_CONFIG*) calloc( + MI_NUM_SCREENS(mi), sizeof(JUGGLER3D_CONFIG)); + if (pConfigInfo == NULL) + { + fprintf(stderr, "%s: out of memory\n", progname); + exit(1); + } + } + + pConfig = &pConfigInfo[MI_SCREEN(mi)]; + pConfig->glxContext = init_GL(mi); + pConfig->CurrentFrameRate = 0.0f; + pConfig->FramesSinceSync = 0; + pConfig->LastSyncTime = 0; + InitGLSettings(&pConfig->RenderState, MI_IS_WIREFRAME(mi)); + + UpdatePattern(&pConfig->RenderState, MinObjects, MaxObjects, + MinHeightInc, MaxHeightInc); + + Juggler3D_HackReshapeEvent(mi, MI_WIDTH(mi), MI_HEIGHT(mi)); +} + + +void Juggler3D_HackDrawEvent(ModeInfo* mi) +{ + JUGGLER3D_CONFIG* pConfig = &pConfigInfo[MI_SCREEN(mi)]; + Display* pDisplay = MI_DISPLAY(mi); + Window hwnd = MI_WINDOW(mi); + + if (pConfig->glxContext == NULL) + return; + + /* While drawing, keep track of the rendering speed so we can adjust the + * animation speed so things appear consistent. The basis of the this + * code comes from the frame rate counter (fps.c) but has been modified + * so that it reports the initial frame rate earlier (after 0.02 secs + * instead of 1 sec). */ + + if (pConfig->FramesSinceSync >= 1 * (int) pConfig->CurrentFrameRate) + { + struct timeval tvnow; + unsigned now; + + # ifdef GETTIMEOFDAY_TWO_ARGS + struct timezone tzp; + gettimeofday(&tvnow, &tzp); + # else + gettimeofday(&tvnow); + # endif + + now = (unsigned) (tvnow.tv_sec * 1000000 + tvnow.tv_usec); + if (pConfig->FramesSinceSync == 0) + { + pConfig->LastSyncTime = now; + } + else + { + unsigned Delta = now - pConfig->LastSyncTime; + if (Delta > 20000) + { + pConfig->LastSyncTime = now; + pConfig->CurrentFrameRate = + (pConfig->FramesSinceSync * 1.0e6f) / Delta; + pConfig->FramesSinceSync = 0; + } + } + } + + pConfig->FramesSinceSync++; + + if (pConfig->RenderState.Time > 150.0f) + { + UpdatePattern(&pConfig->RenderState, MinObjects, MaxObjects, + MinHeightInc, MaxHeightInc); + } + DrawGLScene(&pConfig->RenderState); + + if (pConfig->CurrentFrameRate > 1.0e-6f) + { + pConfig->RenderState.Time += JuggleSpeed / pConfig->CurrentFrameRate; + pConfig->RenderState.SpinAngle += SpinSpeed / pConfig->CurrentFrameRate; + pConfig->RenderState.TranslateAngle += + TranslateSpeed / pConfig->CurrentFrameRate; + } + + if (mi->fps_p) + do_fps(mi); + + glFinish(); + glXSwapBuffers(pDisplay, hwnd); +} + + +Bool Juggler3D_HackHandleEvent(ModeInfo* mi, XEvent* pEvent) +{ + JUGGLER3D_CONFIG* pConfig = &pConfigInfo[MI_SCREEN(mi)]; + RENDER_STATE* pState = &pConfig->RenderState; + + if (pEvent->xany.type == ButtonPress && + pEvent->xbutton.button == Button1) + { + pState->button_down_p = True; + gltrackball_start (pState->trackball, + pEvent->xbutton.x, pEvent->xbutton.y, + MI_WIDTH (mi), MI_HEIGHT (mi)); + return True; + } + else if (pEvent->xany.type == ButtonRelease && + pEvent->xbutton.button == Button1) + { + pState->button_down_p = False; + return True; + } + else if (pEvent->xany.type == ButtonPress && + (pEvent->xbutton.button == Button4 || + pEvent->xbutton.button == Button5)) + { + gltrackball_mousewheel (pState->trackball, pEvent->xbutton.button, 2, + !pEvent->xbutton.state); + return True; + } + else if (pEvent->xany.type == MotionNotify && + pState->button_down_p) + { + gltrackball_track (pState->trackball, + pEvent->xmotion.x, pEvent->xmotion.y, + MI_WIDTH (mi), MI_HEIGHT (mi)); + return True; + } + else if (pEvent->xany.type == KeyPress) + { + char str[20]; + KeySym Key = 0; + int count = XLookupString(&pEvent->xkey, str, 20, &Key, 0); + str[count] = '\0'; + if (*str == ' ') + { + UpdatePattern(&pConfig->RenderState, MinObjects, MaxObjects, + MinHeightInc, MaxHeightInc); + } + } + + return False; +} + +#endif diff --git a/hacks/glx/juggler3d.man b/hacks/glx/juggler3d.man new file mode 100644 index 00000000..a07d890b --- /dev/null +++ b/hacks/glx/juggler3d.man @@ -0,0 +1,88 @@ +.TH XScreenSaver 1 "" "X Version 11" +.SH NAME +Juggler3D - a 3D juggling simulation. +.SH SYNOPSIS +.B juggler3d +[\-display \fIhost:display.screen\fP] +[\-visual \fIvisual\fP] +[\-window] +[\-root] +[\-delay \fInumber\fP] +[\-speed \fInumber\fP] +[\-trans \fInumber\fP] +[\-spin \fInumber\fP] +[\-maxobjs \fInumber\fP] +[\-minobjs \fInumber\fP] +[\-maxhinc \fInumber\fP] +[\-minhinc \fInumber\fP] +[\-wireframe] +[\-fps] +.SH DESCRIPTION +Displays a 3D simulation of a juggler performing with balls, clubs and rings. +Juggling patterns are either created randomly using siteswaps or from a +small library of predefined patterns. \fBjuggler3d\fP is partially based on the +Win32 screensaver Juggle Saver (www.jugglesaver.co.uk) by the same author. +.SH OPTIONS +.TP 8 +.B \-visual \fIvisual\fP +Specify which visual to use. Legal values are the name of a visual class, +or the id number (decimal or hex) of a specific visual. +.TP 8 +.B \-window +Draw on a newly-created window. This is the default. +.TP 8 +.B \-root +Draw on the root window. +.TP 8 +.B \-delay \fInumber\fP +Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.). +.TP 8 +.B \-speed \fInumber\fP +Speed of objects being juggled in beats per seconds. Default: 2.2. +.TP 8 +.B \-trans \fInumber\fP +Speed of horizontal juggler movement (translational) across the screen in +degrees/seconds. Default: 0.1 +.TP 8 +.B \-spin \fInumber\fP +Speed of juggler rotation in degrees/seconds. Default: 20 +.TP 8 +.B \-maxobj \fInumber\fP +Maximum number of objects used in a random juggling pattern. 3 - 36. +.TP 8 +.B \-minobj \fInumber\fP +Minimum number of objects used in a random juggling pattern. 3 - \fBmaxobj\fP. +.TP 8 +.B \-minhinc \fInumber\fP | -maxhinc \fInumber\fP +Used to determine maximum throw weight in random siteswap. Options refer to +minimum height increment and maximum height increment. Maximum weight chosen +will lie between \fBmaxobj\fP + \fBminhinc\fP and \fBmaxobj\fP + \fBmaxhinc\fP. +Defaults: \fBminhinc\fP=1 and \fBmaxhinc\fP=6. +.TP 8 +.B \-wireframe | \-no-wireframe +Render in wireframe instead of solid. +.TP 8 +.B \-fps | \-no-fps +Whether to show a frames-per-second display at the bottom of the screen. +.SH ENVIRONMENT +.PP +.TP 8 +.B DISPLAY +to get the default host and display number. +.TP 8 +.B XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 2005 by Brian Apps. 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. No representations are made about the +suitability of this software for any purpose. It is provided "as is" without +express or implied warranty. +.SH AUTHOR +Brian Apps diff --git a/hacks/glx/molecule.c b/hacks/glx/molecule.c index a787b011..a6830286 100644 --- a/hacks/glx/molecule.c +++ b/hacks/glx/molecule.c @@ -665,6 +665,14 @@ push_bond (molecule *m, int from, int to) } +static void +parse_error (const char *file, int lineno, const char *line) +{ + fprintf (stderr, "%s: %s: parse error, line %d: %s\n", + progname, file, lineno, line); + exit (1); +} + /* This function is crap. */ @@ -749,7 +757,8 @@ parse_pdb_data (molecule *m, const char *data, const char *filename, int line) char *name = (char *) calloc (1, 4); GLfloat x = -999, y = -999, z = -999; - sscanf (s+7, " %d ", &id); + if (1 != sscanf (s+7, " %d ", &id)) + parse_error (filename, line, s); strncpy (name, s+12, 3); while (isspace(*name)) name++; @@ -762,7 +771,9 @@ parse_pdb_data (molecule *m, const char *data, const char *filename, int line) *ss = tolower(*ss); ss++; } - sscanf (s + 32, " %f %f %f ", &x, &y, &z); + if (3 != sscanf (s + 32, " %f %f %f ", &x, &y, &z)) + parse_error (filename, line, s); + /* fprintf (stderr, "%s: %s: %d: atom: %d \"%s\" %9.4f %9.4f %9.4f\n", progname, filename, line, @@ -776,14 +787,16 @@ parse_pdb_data (molecule *m, const char *data, const char *filename, int line) char *name = (char *) calloc (1, 4); GLfloat x = -999, y = -999, z = -999; - sscanf (s+7, " %d ", &id); + if (1 != sscanf (s+7, " %d ", &id)) + parse_error (filename, line, s); strncpy (name, s+12, 3); while (isspace(*name)) name++; ss = name + strlen(name)-1; while (isspace(*ss) && ss > name) *ss-- = 0; - sscanf (s + 30, " %f %f %f ", &x, &y, &z); + if (3 != sscanf (s + 30, " %f %f %f ", &x, &y, &z)) + parse_error (filename, line, s); /* fprintf (stderr, "%s: %s: %d: atom: %d \"%s\" %9.4f %9.4f %9.4f\n", progname, filename, line, diff --git a/hacks/glx/polytopes.c b/hacks/glx/polytopes.c index f4043dca..781cf5ac 100644 --- a/hacks/glx/polytopes.c +++ b/hacks/glx/polytopes.c @@ -1,10 +1,10 @@ /* polytopes --- Shows one of the six regular polytopes rotating in 4d */ #if 0 -static const char sccsid[] = "@(#)polytopes.c 1.1 03/05/18 xlockmore"; +static const char sccsid[] = "@(#)polytopes.c 1.2 05/09/28 xlockmore"; #endif -/* Copyright (c) 2003 Carsten Steger . */ +/* Copyright (c) 2003-2005 Carsten Steger . */ /* * Permission to use, copy, modify, and distribute this software and its @@ -21,6 +21,7 @@ static const char sccsid[] = "@(#)polytopes.c 1.1 03/05/18 xlockmore"; * * REVISION HISTORY: * C. Steger - 03/08/10: Initial version + * C. Steger - 05/09/28: Added trackball support */ /* @@ -113,13 +114,15 @@ static const char sccsid[] = "@(#)polytopes.c 1.1 03/05/18 xlockmore"; #define DEF_DTHETA DTHETA_STR #ifdef STANDALONE -# define PROGCLASS "Polytopes" -# define HACK_INIT init_polytopes -# define HACK_DRAW draw_polytopes -# define HACK_RESHAPE reshape_polytopes -# define polytopes_opts xlockmore_opts -# define DEFAULTS "*delay: 25000 \n" \ - "*showFPS: False \n" +# define PROGCLASS "Polytopes" +# define HACK_INIT init_polytopes +# define HACK_DRAW draw_polytopes +# define HACK_RESHAPE reshape_polytopes +# define HACK_HANDLE_EVENT polytopes_handle_event +# define EVENT_MASK PointerMotionMask|KeyReleaseMask +# define polytopes_opts xlockmore_opts +# define DEFAULTS "*delay: 25000 \n" \ + "*showFPS: False \n" # include "xlockmore.h" /* from the xscreensaver distribution */ #else /* !STANDALONE */ @@ -128,8 +131,10 @@ static const char sccsid[] = "@(#)polytopes.c 1.1 03/05/18 xlockmore"; #ifdef USE_GL +#include #include #include +#include "gltrackball.h" #ifdef USE_MODULES @@ -158,6 +163,11 @@ static float speed_yz; static float alpha, beta, delta, zeta, eta, theta; static float aspect; +/* Trackball states */ +trackball_state *trackballs[2]; +int current_trackball; +Bool button_pressed; + static const float offset4d[4] = { 0.0, 0.0, 0.0, 3.0 }; static const float offset3d[4] = { 0.0, 0.0, -2.0, 0.0 }; @@ -2382,19 +2392,67 @@ static void rotateyz(float m[4][4], float phi) /* Compute the rotation matrix m from the rotation angles. */ -static void rotateall(float m[4][4]) +static void rotateall(float al, float be, float de, float ze, float et, + float th, float m[4][4]) { int i, j; for (i=0; i<4; i++) for (j=0; j<4; j++) m[i][j] = (i==j); - rotatewx(m,alpha); - rotatewy(m,beta); - rotatewz(m,delta); - rotatexy(m,zeta); - rotatexz(m,eta); - rotateyz(m,theta); + rotatewx(m,al); + rotatewy(m,be); + rotatewz(m,de); + rotatexy(m,ze); + rotatexz(m,et); + rotateyz(m,th); +} + + +/* Multiply two rotation matrices: o=m*n. */ +static void mult_rotmat(float m[4][4], float n[4][4], float o[4][4]) +{ + int i, j, k; + + for (i=0; i<4; i++) + { + for (j=0; j<4; j++) + { + o[i][j] = 0.0; + for (k=0; k<4; k++) + o[i][j] += m[i][k]*n[k][j]; + } + } +} + + +/* Compute a 4D rotation matrix from two unit quaternions. */ +static void quats_to_rotmat(float p[4], float q[4], float m[4][4]) +{ + double al, be, de, ze, et, th; + double r00, r01, r02, r12, r22; + + r00 = 1.0-2.0*(p[1]*p[1]+p[2]*p[2]); + r01 = 2.0*(p[0]*p[1]+p[2]*p[3]); + r02 = 2.0*(p[2]*p[0]-p[1]*p[3]); + r12 = 2.0*(p[1]*p[2]+p[0]*p[3]); + r22 = 1.0-2.0*(p[1]*p[1]+p[0]*p[0]); + + al = atan2(-r12,r22)*180.0/M_PI; + be = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI; + de = atan2(-r01,r00)*180.0/M_PI; + + r00 = 1.0-2.0*(q[1]*q[1]+q[2]*q[2]); + r01 = 2.0*(q[0]*q[1]+q[2]*q[3]); + r02 = 2.0*(q[2]*q[0]-q[1]*q[3]); + r12 = 2.0*(q[1]*q[2]+q[0]*q[3]); + r22 = 1.0-2.0*(q[1]*q[1]+q[0]*q[0]); + + ze = atan2(-r12,r22)*180.0/M_PI; + et = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI; + th = atan2(-r01,r00)*180.0/M_PI; + + rotateall(al,be,de,ze,et,th,m); } @@ -2422,10 +2480,16 @@ static void normal(float *p, float *q, float *r, float *n) /* Project an array of vertices from 4d to 3d. */ static void project(float vert[][4], float v[][4], int num) { - float m[4][4], s; + float s, q1[4], q2[4], r1[4][4], r2[4][4], m[4][4]; int i, j, k; - rotateall(m); + rotateall(alpha,beta,delta,zeta,eta,theta,r1); + + gltrackball_get_quaternion(trackballs[0],q1); + gltrackball_get_quaternion(trackballs[1],q2); + quats_to_rotmat(q1,q2,r2); + + mult_rotmat(r2,r1,m); /* Project the vertices from 4d to 3d. */ for (i=0; i= 360.0) - alpha -= 360.0; - beta += speed_wy; - if (beta >= 360.0) - beta -= 360.0; - delta += speed_wz; - if (delta >= 360.0) - delta -= 360.0; - zeta += speed_xy; - if (zeta >= 360.0) - zeta -= 360.0; - eta += speed_xz; - if (eta >= 360.0) - eta -= 360.0; - theta += speed_yz; - if (theta >= 360.0) - theta -= 360.0; + if (!button_pressed) + { + alpha += speed_wx; + if (alpha >= 360.0) + alpha -= 360.0; + beta += speed_wy; + if (beta >= 360.0) + beta -= 360.0; + delta += speed_wz; + if (delta >= 360.0) + delta -= 360.0; + zeta += speed_xy; + if (zeta >= 360.0) + zeta -= 360.0; + eta += speed_xz; + if (eta >= 360.0) + eta -= 360.0; + theta += speed_yz; + if (theta >= 360.0) + theta -= 360.0; + } glMatrixMode(GL_PROJECTION); glLoadIdentity(); @@ -2863,6 +2930,64 @@ void reshape_polytopes(ModeInfo * mi, int width, int height) } +Bool polytopes_handle_event(ModeInfo *mi, XEvent *event) +{ + Display *display = MI_DISPLAY(mi); + KeySym sym; + + if (event->xany.type == ButtonPress && + event->xbutton.button == Button1) + { + button_pressed = True; + gltrackball_start(trackballs[current_trackball], + event->xbutton.x, event->xbutton.y, + MI_WIDTH(mi), MI_HEIGHT(mi)); + return True; + } + else if (event->xany.type == ButtonRelease && + event->xbutton.button == Button1) + { + button_pressed = False; + return True; + } + else if (event->xany.type == KeyPress) + { + sym = XKeycodeToKeysym(display,event->xkey.keycode,0); + if (sym == XK_Shift_L || sym == XK_Shift_R) + { + current_trackball = 1; + if (button_pressed) + gltrackball_start(trackballs[current_trackball], + event->xbutton.x, event->xbutton.y, + MI_WIDTH(mi), MI_HEIGHT(mi)); + return True; + } + } + else if (event->xany.type == KeyRelease) + { + sym = XKeycodeToKeysym(display,event->xkey.keycode,0); + if (sym == XK_Shift_L || sym == XK_Shift_R) + { + current_trackball = 0; + if (button_pressed) + gltrackball_start(trackballs[current_trackball], + event->xbutton.x, event->xbutton.y, + MI_WIDTH(mi), MI_HEIGHT(mi)); + return True; + } + } + else if (event->xany.type == MotionNotify && button_pressed) + { + gltrackball_track(trackballs[current_trackball], + event->xmotion.x, event->xmotion.y, + MI_WIDTH(mi), MI_HEIGHT(mi)); + return True; + } + + return False; +} + + /* *----------------------------------------------------------------------------- *----------------------------------------------------------------------------- @@ -2890,6 +3015,11 @@ void init_polytopes(ModeInfo * mi) } hp = &poly[MI_SCREEN(mi)]; + trackballs[0] = gltrackball_init(); + trackballs[1] = gltrackball_init(); + current_trackball = 0; + button_pressed = False; + if ((hp->glx_context = init_GL(mi)) != NULL) { reshape_polytopes(mi,MI_WIDTH(mi),MI_HEIGHT(mi)); diff --git a/hacks/glx/polytopes.man b/hacks/glx/polytopes.man index 8e423ab1..76bf983f 100644 --- a/hacks/glx/polytopes.man +++ b/hacks/glx/polytopes.man @@ -171,6 +171,15 @@ Rotation speed around the xz plane (default: 1.9). .TP 8 .B \-speed-yz \fIfloat\fP Rotation speed around the yz plane (default: 2.1). +.SH INTERACTION +If you run this program in standalone mode you can rotate the polytope +by dragging the mouse while pressing the left mouse button. This +rotates the polytope in 3D, i.e., around the wx, wy, and wz planes. +If you press the shift key while dragging the mouse with the left +button pressed the polytope is rotated in 4D, i.e., around the xy, xz, +and yz planes. To examine the polytope at your leisure, it is best to +set all speeds to 0. Otherwise, the polytope will rotate while the +left mouse button is not pressed. .SH ENVIRONMENT .PP .TP 8 @@ -184,7 +193,7 @@ stored in the RESOURCE_MANAGER property. .BR X (1), .BR xscreensaver (1) .SH COPYRIGHT -Copyright \(co 2003 by Carsten Steger. Permission to use, copy, +Copyright \(co 2003-2005 by Carsten Steger. 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 @@ -193,4 +202,4 @@ No representations are made about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. .SH AUTHOR -Carsten Steger , 10-aug-2003. +Carsten Steger , 28-sep-2005. diff --git a/hacks/glx/tangram.c b/hacks/glx/tangram.c index 2c4e4db5..a5aa8a9d 100644 --- a/hacks/glx/tangram.c +++ b/hacks/glx/tangram.c @@ -1,12 +1,18 @@ /* tangram, Copyright (c) 2005 Jeremy English * - * 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. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. + * 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. No representations are made + * about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Sun 10 July 2005 Changed the code that solves the puzzles. + * Also, limited the palette and added names. + * + * Wed 13 July 2005 Added option to turn off rotation. + * Changed color and materials */ @@ -14,15 +20,15 @@ extern XtAppContext app; -#define PROGCLASS "TANGRAM" +#define PROGCLASS "Tangram" #define HACK_INIT init_tangram #define HACK_DRAW draw_tangram #define HACK_RESHAPE reshape_tangram #define sws_opts xlockmore_opts -#define DEFAULTS "*delay: 30000 \n" \ - "*wireframe: False \n" \ +#define DEFAULTS "*delay: 10000 \n" \ + "*wireframe: False \n" \ #undef countof #define countof(x) (sizeof((x))/sizeof((*x))) @@ -39,11 +45,7 @@ extern XtAppContext app; #include #include #include "tangram_shapes.h" - -typedef enum { - true = 1, - false = 0 -} bool; +#include "glxfonts.h" typedef struct { GLubyte r; @@ -62,9 +64,17 @@ typedef struct { GLint r; /* rotation */ GLint fr; /* flip Rotate. Used to keep track during animation */ GLint dl; /* display List */ - + GLfloat dz; /* velocity */ + GLfloat ddz; /* Acceleration */ + GLfloat solved; /* shapes state */ + Bool up; /* Move up the z axis? */ } tangram_shape; +typedef struct { + char *name; + tangram_shape ts[7]; +} puzzle; + typedef enum { no_shape = -1, small_triangle1 = 0, @@ -76,763 +86,545 @@ typedef enum { rhomboid = 6 } shape_type; -typedef enum { - state_exploding, - state_solving, - state_solved -} tangram_state; - -tangram_shape solved[][7] = { - { - {{-1.664000, -1.552000, 0}, 135, 0, 0}, - {{-1.696000, 0.944000, 0}, 315, 0, 0}, - {{0.064000, -2.128000, 0}, 135, 0, 0}, - {{-0.960000, -1.056000, 0}, 90, 0, 0}, - {{1.104000, 0.960000, 0}, 270, 0, 0}, - {{-1.376000, -0.800000, 0}, 180, 0, 0}, - {{1.152000, 0.736000, 0}, 360, 0, 0}, - }, - { - {{-0.096000, 1.552000, 0}, 135, 180, 0}, - {{-0.064000, 2.336000, 0}, 315, 0, 0}, - {{-0.080000, -0.224000, 0}, 135, 180, 0}, - {{-2.096000, 1.584000, 0}, 90, 180, 0}, - {{1.920000, 1.584000, 0}, 270, 0, 0}, - {{0.416000, -0.192000, 0}, 180, 0, 0}, - {{-0.096000, -1.296000, 0}, 335, 0, 0}, - }, - { - {{-0.144000, -0.720000, 0}, 225, 0, 0}, - {{0.608000, 0.032000, 0}, 135, 0, 0}, - {{-1.584000, 0.720000, 0}, 0, 0, 0}, - {{-0.112000, -0.720000, 0}, 315, 0, 0}, - {{-0.096000, -0.704000, 0}, 45, 0, 0}, - {{0.592000, 0.016000, 0}, 225, 0, 0}, - {{-0.880000, -0.032000, 0}, 315, 0, 0}, - }, - { - {{1.472000, 2.176000, 0}, 225, 0, 0}, - {{1.248000, 3.488000, 0}, 270, 0, 0}, - {{-0.752000, -1.680000, 0}, 270, 0, 0}, - {{0.704000, -1.552000, 0}, 135, 0, 0}, - {{1.280000, -0.080000, 0}, 180, 0, 0}, - {{-0.016000, -0.896000, 0}, 225, 0, 0}, - {{-0.000000, -0.944000, 0}, 315, 0, 0}, - }, - { - {{0.320000, 1.360000, 0}, 90, 0, 0}, - {{0.704000, 3.072000, 0}, 270, 0, 0}, - {{-1.200000, -3.392000, 0}, 135, 0, 0}, - {{0.688000, -1.184000, 0}, 135, 0, 0}, - {{-0.768000, 0.192000, 0}, 315, 0, 0}, - {{-1.168000, -2.304000, 0}, 180, 0, 0}, - {{1.312000, 1.296000, 0}, 270, 0, 0}, - }, - { - {{-2.064000, 0.848000, 0}, 65, 0, 0}, - {{0.096000, 1.424000, 0}, 99, 180, 0}, - {{2.016000, -2.448000, 0}, 270, 180, 0}, - {{-2.016000, 0.368000, 0}, 315, 0, 0}, - {{-0.560000, -1.040000, 0}, 135, 0, 0}, - {{1.312000, -1.696000, 0}, 225, 0, 0}, - {{0.864000, 0.336000, 0}, 180, 180, 0}, - }, - { - {{0.560000, -0.208000, 0}, 135, 0, 0}, - {{0.336000, -1.552000, 0}, 90, 180, 0}, - {{-2.336000, 1.248000, 0}, 90, 180, 0}, - {{1.296000, -1.504000, 0}, 180, 0, 0}, - {{-0.896000, 1.200000, 0}, 135, 180, 0}, - {{0.304000, -2.544000, 0}, 180, 0, 0}, - {{1.248000, 0.544000, 0}, 225, 0, 0}, - }, - { - {{-0.480000, -2.832000, 0}, 45, 0, 0}, - {{-0.544000, -2.832000, 0}, 225, 180, 0}, - {{-0.064000, -0.880000, 0}, 225, 180, 0}, - {{-2.528000, 2.656000, 0}, 0, 0, 0}, - {{-2.512000, 0.640000, 0}, 45, 180, 0}, - {{0.192000, -2.096000, 0}, 225, 0, 0}, - {{-0.064000, -0.832000, 0}, 180, 0, 0}, - }, - { - {{0.880000, -1.456000, 0}, 45, 0, 0}, - {{0.832000, 0.592000, 0}, 180, 180, 0}, - {{-2.016000, 1.648000, 0}, 135, 180, 0}, - {{0.448000, 2.064000, 0}, 315, 0, 0}, - {{-0.992000, 0.688000, 0}, 315, 180, 0}, - {{1.856000, -0.400000, 0}, 180, 0, 0}, - {{-0.128000, -1.424000, 0}, 90, 0, 0}, - }, - { - {{2.208000, 2.000000, 0}, 180, 0, 0}, - {{-0.640000, 3.072000, 0}, 180, 180, 0}, - {{1.360000, -3.312000, 0}, 180, 0, 0}, - {{-0.592000, 2.256000, 0}, 360, 0, 0}, - {{-0.960000, -0.160000, 0}, 45, 180, 0}, - {{0.288000, -2.896000, 0}, 135, 0, 0}, - {{0.496000, -0.128000, 0}, 135, 0, 0}, - }, - { - {{-0.480000, 0.864000, 0}, 58, 180, 0}, - {{0.624000, -0.752000, 0}, 90, 180, 0}, - {{0.576000, -0.560000, 0}, 180, 180, 0}, - {{-0.192000, -1.264000, 0}, 225, 0, 0}, - {{-0.176000, -1.280000, 0}, 135, 180, 0}, - {{-0.816000, -0.528000, 0}, 123, 0, 0}, - {{-0.416000, -0.528000, 0}, 90, 0, 0}, - }, - { - {{0.688000, -0.144000, 0}, 45, 180, 0}, - {{-0.080000, 0.592000, 0}, 225, 0, 0}, - {{-0.048000, 0.592000, 0}, 315, 180, 0}, - {{-1.488000, -0.848000, 0}, 45, 0, 0}, - {{1.376000, -0.864000, 0}, 225, 180, 0}, - {{0.688000, -0.128000, 0}, 135, 0, 0}, - {{-1.504000, -0.832000, 0}, 135, 0, 0}, - }, - { - {{0.624000, -1.776000, 0}, 225, 180, 0}, - {{-0.144000, 0.432000, 0}, 225, 0, 0}, - {{-0.800000, -0.272000, 0}, 45, 180, 0}, - {{-2.320000, -0.304000, 0}, 45, 0, 0}, - {{2.048000, -0.320000, 0}, 225, 180, 0}, - {{-0.112000, 0.480000, 0}, 135, 0, 0}, - {{-0.832000, -0.320000, 0}, 135, 180, 0}, - }, - { - {{-1.744000, -0.400000, 0}, 45, 180, 0}, - {{0.416000, 1.776000, 0}, 315, 0, 0}, - {{-1.008000, 0.272000, 0}, 90, 180, 0}, - {{0.800000, 1.488000, 0}, 135, 0, 0}, - {{0.832000, 1.440000, 0}, 45, 180, 0}, - {{-1.744000, -1.872000, 0}, 135, 0, 0}, - {{-1.008000, 0.320000, 0}, 45, 180, 0}, - }, - { - {{-0.720000, 3.440000, 0}, 180, 180, 0}, - {{0.912000, -1.072000, 0}, 225, 0, 0}, - {{0.736000, 3.440000, 0}, 180, 180, 0}, - {{0.720000, 1.984000, 0}, 225, 0, 0}, - {{-0.672000, 0.544000, 0}, 45, 180, 0}, - {{-0.192000, -3.840000, 0}, 135, 0, 0}, - {{-0.528000, -2.480000, 0}, 135, 0, 0}, - }, - { - {{1.184000, 1.904000, 0}, 90, 180, 0}, - {{-2.256000, 0.960000, 0}, 90, 0, 0}, - {{-0.208000, -0.528000, 0}, 45, 180, 0}, - {{-0.256000, -0.512000, 0}, 135, 0, 0}, - {{0.144000, -0.944000, 0}, 135, 180, 0}, - {{-0.608000, -3.648000, 0}, 105, 0, 0}, - {{0.832000, -0.912000, 0}, 135, 0, 0}, - }, - { - {{-1.056000, -2.272000, 0}, 90, 0, 0}, - {{0.960000, -1.264000, 0}, 180, 0, 0}, - {{-0.000000, -2.288000, 0}, 135, 0, 0}, - {{-1.088000, -2.256000, 0}, 180, 0, 0}, - {{0.992000, 0.736000, 0}, 0, 0, 0}, - {{0.960000, -0.256000, 0}, 180, 0, 0}, - {{-0.064000, 0.752000, 0}, 180, 180, 0}, - }, - { - {{-1.360000, -0.224000, 0}, 0, 0, 0}, - {{-0.336000, -0.176000, 0}, 90, 0, 0}, - {{0.688000, -0.192000, 0}, 45, 0, 0}, - {{-1.424000, -1.168000, 0}, 180, 0, 0}, - {{1.744000, 0.816000, 0}, 0, 0, 0}, - {{-0.384000, -0.176000, 0}, 180, 0, 0}, - {{1.648000, -1.216000, 0}, 270, 180, 0}, - }, - { - {{2.112000, 1.504000, 0}, 0, 0, 0}, - {{-1.040000, 1.472000, 0}, 180, 180, 0}, - {{0.032000, -1.600000, 0}, 135, 0, 0}, - {{1.056000, 1.504000, 0}, 270, 0, 0}, - {{-0.992000, -0.528000, 0}, 0, 180, 0}, - {{2.080000, 0.512000, 0}, 180, 0, 0}, - {{-1.104000, 0.480000, 0}, 270, 180, 0}, - }, - { - {{0.608000, 1.184000, 0}, 135, 0, 0}, - {{-2.928000, -1.584000, 0}, 135, 0, 0}, - {{0.688000, 0.560000, 0}, 90, 180, 0}, - {{0.640000, -0.832000, 0}, 180, 0, 0}, - {{-0.752000, -2.304000, 0}, 315, 180, 0}, - {{-2.192000, -0.912000, 0}, 315, 0, 0}, - {{2.704000, 1.616000, 0}, 270, 0, 0}, - }, - { - {{0.880000, 0.960000, 0}, 45, 0, 0}, - {{0.832000, -0.960000, 0}, 0, 0, 0}, - {{1.536000, 1.712000, 0}, 225, 180, 0}, - {{-0.992000, 2.096000, 0}, 315, 0, 0}, - {{0.480000, 2.704000, 0}, 180, 180, 0}, - {{0.816000, 0.912000, 0}, 315, 0, 0}, - {{0.784000, -1.952000, 0}, 315, 180, 0}, - }, - { - {{0.176000, 3.584000, 0}, 270, 0, 0}, - {{2.016000, -1.424000, 0}, 90, 0, 0}, - {{2.496000, 0.608000, 0}, 180, 180, 0}, - {{-0.304000, 0.496000, 0}, 270, 0, 0}, - {{-0.256000, -0.144000, 0}, 0, 180, 0}, - {{-1.600000, -0.368000, 0}, 303, 0, 0}, - {{0.768000, 0.912000, 0}, 180, 0, 0}, - }, - { - {{-2.096000, 1.696000, 0}, 315, 0, 0}, - {{-1.632000, -1.440000, 0}, 45, 0, 0}, - {{-1.232000, -0.064000, 0}, 315, 180, 0}, - {{0.304000, 2.416000, 0}, 315, 0, 0}, - {{1.776000, -0.496000, 0}, 315, 180, 0}, - {{1.168000, -0.240000, 0}, 332, 0, 0}, - {{-0.880000, -1.216000, 0}, 135, 0, 0}, - }, - { - {{-0.432000, -0.496000, 0}, 259, 0, 0}, - {{0.176000, -1.488000, 0}, 105, 0, 0}, - {{1.184000, -1.168000, 0}, 300, 180, 0}, - {{1.824000, 0.096000, 0}, 195, 0, 0}, - {{-2.400000, -0.048000, 0}, 11, 180, 0}, - {{-0.240000, -1.200000, 0}, 315, 0, 0}, - {{-0.688000, -1.488000, 0}, 281, 180, 0}, - }, - { - {{0.096000, 2.000000, 0}, 315, 0, 0}, - {{0.432000, 0.160000, 0}, 360, 0, 0}, - {{0.208000, -1.504000, 0}, 220, 180, 0}, - {{-1.104000, -0.336000, 0}, 50, 0, 0}, - {{-1.136000, -0.288000, 0}, 310, 180, 0}, - {{0.416000, 1.232000, 0}, 360, 0, 0}, - {{0.048000, 2.016000, 0}, 225, 180, 0}, - }, - { - {{-2.128000, 2.112000, 0}, 45, 0, 0}, - {{0.128000, 1.856000, 0}, 360, 0, 0}, - {{2.128000, -0.720000, 0}, 180, 180, 0}, - {{-1.376000, 2.816000, 0}, 360, 0, 0}, - {{-1.360000, 0.768000, 0}, 45, 180, 0}, - {{0.128000, 0.336000, 0}, 360, 0, 0}, - {{0.432000, -2.944000, 0}, 149, 0, 0}, - }, - { - {{1.952000, -0.800000, 0}, 225, 0, 0}, - {{2.064000, -0.816000, 0}, 45, 0, 0}, - {{0.928000, 0.688000, 0}, 225, 0, 0}, - {{-1.568000, 3.152000, 0}, 0, 0, 0}, - {{-1.520000, 1.104000, 0}, 45, 0, 0}, - {{2.720000, -0.064000, 0}, 225, 0, 0}, - {{1.968000, 0.672000, 0}, 270, 0, 0}, - }, - { - {{2.480000, -0.912000, 0}, 225, 0, 0}, - {{2.592000, -0.928000, 0}, 45, 0, 0}, - {{0.352000, 1.280000, 0}, 315, 0, 0}, - {{-0.688000, 0.336000, 0}, 135, 0, 0}, - {{1.808000, -0.112000, 0}, 135, 0, 0}, - {{3.248000, -0.176000, 0}, 225, 0, 0}, - {{-1.472000, 1.024000, 0}, 225, 0, 0}, - }, - { - {{-0.400000, -1.232000, 0}, 270, 0, 0}, - {{0.400000, -0.640000, 0}, 270, 0, 0}, - {{1.904000, -3.232000, 0}, 180, 0, 0}, - {{1.872000, -1.776000, 0}, 225, 0, 0}, - {{1.552000, 0.656000, 0}, 270, 0, 0}, - {{1.056000, 1.760000, 0}, 270, 0, 0}, - {{-0.320000, -1.024000, 0}, 135, 180, 0}, - }, - { - {{0.896000, -0.480000, 0}, 0, 0, 0}, - {{0.128000, -0.720000, 0}, 45, 0, 0}, - {{0.960000, -1.728000, 0}, 270, 0, 0}, - {{-1.040000, -1.648000, 0}, 90, 0, 0}, - {{-0.848000, 2.304000, 0}, 0, 0, 0}, - {{-0.096000, 0.944000, 0}, 315, 0, 0}, - {{-1.568000, -1.728000, 0}, 90, 180, 0}, - }, - { - {{0.416000, 3.648000, 0}, 270, 0, 0}, - {{-0.000000, -1.072000, 0}, 331, 0, 0}, - {{1.360000, 0.528000, 0}, 180, 0, 0}, - {{0.880000, 0.464000, 0}, 270, 0, 0}, - {{0.576000, -3.184000, 0}, 151, 0, 0}, - {{0.864000, 2.576000, 0}, 270, 0, 0}, - {{-1.120000, 0.528000, 0}, 90, 0, 0}, - }, - { - {{-1.056000, -3.456000, 0}, 90, 0, 0}, - {{0.736000, 2.000000, 0}, 135, 0, 0}, - {{-1.488000, 1.760000, 0}, 45, 0, 0}, - {{-0.432000, 0.016000, 0}, 0, 180, 0}, - {{-0.432000, -0.064000, 0}, 0, 0, 0}, - {{0.560000, -2.576000, 0}, 225, 0, 0}, - {{0.032000, 2.656000, 0}, 0, 0, 0}, - }, - { - {{-2.800000, -2.304000, 0}, 101, 0, 0}, - {{1.888000, 2.032000, 0}, 135, 180, 0}, - {{-1.856000, 2.016000, 0}, 315, 0, 0}, - {{0.352000, -0.144000, 0}, 315, 180, 0}, - {{-2.848000, 0.976000, 0}, 0, 0, 0}, - {{-1.424000, -1.104000, 0}, 236, 0, 0}, - {{-1.792000, 2.016000, 0}, 45, 0, 0}, - }, - { - {{0.864000, 0.880000, 0}, 180, 0, 0}, - {{0.912000, -2.288000, 0}, 180, 180, 0}, - {{-1.136000, -0.144000, 0}, 45, 0, 0}, - {{-1.136000, -3.312000, 0}, 360, 180, 0}, - {{-1.168000, 1.920000, 0}, 0, 0, 0}, - {{-1.184000, -1.248000, 0}, 180, 0, 0}, - {{-1.136000, -0.224000, 0}, 0, 0, 0}, - }, - { - {{0.592000, 0.704000, 0}, 90, 0, 0}, - {{0.576000, -2.496000, 0}, 90, 180, 0}, - {{2.624000, -1.440000, 0}, 225, 0, 0}, - {{2.640000, -3.504000, 0}, 270, 180, 0}, - {{2.656000, 1.712000, 0}, 270, 0, 0}, - {{0.544000, 0.704000, 0}, 180, 0, 0}, - {{1.648000, 0.640000, 0}, 0, 0, 0}, - }, - { - {{0.448000, -3.344000, 0}, 90, 0, 0}, - {{-1.616000, 1.984000, 0}, 90, 180, 0}, - {{-1.584000, 0.928000, 0}, 45, 0, 0}, - {{-1.600000, -2.288000, 0}, 0, 180, 0}, - {{1.536000, -1.328000, 0}, 270, 0, 0}, - {{2.592000, -3.328000, 0}, 180, 0, 0}, - {{-1.600000, 0.832000, 0}, 0, 0, 0}, - }, - { - {{0.608000, 0.880000, 0}, 180, 0, 0}, - {{0.576000, -2.304000, 0}, 180, 180, 0}, - {{-1.456000, -0.176000, 0}, 45, 0, 0}, - {{-1.472000, -3.344000, 0}, 0, 180, 0}, - {{-1.472000, 1.888000, 0}, 0, 0, 0}, - {{0.640000, -1.168000, 0}, 180, 0, 0}, - {{-1.456000, -0.256000, 0}, 0, 0, 0}, - }, - { - {{-0.208000, -0.352000, 0}, 225, 0, 0}, - {{0.528000, 1.856000, 0}, 225, 180, 0}, - {{-0.176000, -3.904000, 0}, 135, 0, 0}, - {{-0.880000, 0.384000, 0}, 45, 180, 0}, - {{-0.192000, -0.384000, 0}, 315, 0, 0}, - {{0.304000, -2.864000, 0}, 180, 0, 0}, - {{-0.224000, 2.528000, 0}, 315, 0, 0}, - }, - { - {{-0.032000, 0.704000, 0}, 315, 0, 0}, - {{2.208000, -1.504000, 0}, 225, 180, 0}, - {{-0.720000, -0.064000, 0}, 0, 0, 0}, - {{-0.720000, -1.536000, 0}, 45, 180, 0}, - {{-0.016000, 1.744000, 0}, 315, 180, 0}, - {{0.464000, 0.736000, 0}, 180, 0, 0}, - {{1.456000, -0.816000, 0}, 315, 0, 0}, - }, - { - {{-0.944000, 1.040000, 0}, 360, 0, 0}, - {{1.120000, 0.000000, 0}, 180, 180, 0}, - {{0.080000, -0.048000, 0}, 315, 0, 0}, - {{0.080000, -1.104000, 0}, 135, 180, 0}, - {{0.080000, 1.120000, 0}, 315, 180, 0}, - {{1.120000, 0.048000, 0}, 180, 0, 0}, - {{0.064000, 0.992000, 0}, 180, 180, 0}, - }, - { - {{-0.688000, 0.784000, 0}, 135, 0, 0}, - {{0.800000, 0.784000, 0}, 135, 0, 0}, - {{0.512000, -2.512000, 0}, 315, 0, 0}, - {{1.488000, 0.000000, 0}, 225, 0, 0}, - {{-1.392000, 0.000000, 0}, 45, 0, 0}, - {{0.496000, -2.432000, 0}, 180, 0, 0}, - {{0.480000, -2.496000, 0}, 270, 0, 0}, - }, - { - {{-0.992000, -2.160000, 0}, 90, 0, 0}, - {{-1.040000, -1.152000, 0}, 270, 0, 0}, - {{0.064000, -2.144000, 0}, 135, 0, 0}, - {{0.080000, -1.088000, 0}, 90, 0, 0}, - {{0.032000, -1.072000, 0}, 180, 0, 0}, - {{0.544000, -3.216000, 0}, 180, 0, 0}, - {{2.160000, -1.136000, 0}, 270, 0, 0}, - }, - { - {{-2.896000, -0.128000, 0}, 45, 0, 0}, - {{-0.800000, 0.992000, 0}, 135, 0, 0}, - {{-1.152000, -0.416000, 0}, 225, 0, 0}, - {{-0.016000, 0.656000, 0}, 315, 0, 0}, - {{1.456000, -0.736000, 0}, 135, 0, 0}, - {{2.864000, 0.736000, 0}, 180, 0, 0}, - {{-0.048000, 1.664000, 0}, 180, 180, 0}, - }, - { - {{2.960000, -1.376000, 0}, 270, 0, 0}, - {{1.952000, -1.312000, 0}, 90, 0, 0}, - {{-0.096000, 0.720000, 0}, 315, 0, 0}, - {{-2.112000, -0.320000, 0}, 90, 180, 0}, - {{1.904000, -0.320000, 0}, 180, 180, 0}, - {{-0.096000, -1.776000, 0}, 135, 0, 0}, - {{-3.168000, -2.304000, 0}, 360, 180, 0}, - }, - { - {{-1.600000, -1.232000, 0}, 270, 0, 0}, - {{-1.600000, -0.128000, 0}, 180, 0, 0}, - {{2.272000, -0.128000, 0}, 225, 0, 0}, - {{-0.160000, -3.648000, 0}, 315, 180, 0}, - {{-0.176000, 2.336000, 0}, 135, 180, 0}, - {{-2.608000, -1.184000, 0}, 90, 0, 0}, - {{1.280000, -2.208000, 0}, 360, 180, 0} - } +#define SPEED 0.03 +enum { + BOTTOM = 0, + DEF_WAIT = 500, + INIT_DZ = 2, + NUM_SHAPES = 7 }; +typedef struct { + GLXContext *glx_context; + tangram_shape tsm1, tsm2, tm, tlg1, tlg2, sq, rh; + tangram_shape n_tsm1, n_tsm2, n_tm, n_tlg1, n_tlg2, n_sq, n_rh; + char *puzzle_name; + int csi; -/* Dream */ -color palette[] = { - {22, 26, 28}, - {122, 142, 139}, - {72, 82, 76}, - {94, 115, 108}, - {194, 202, 195}, - {165, 175, 171}, - {132, 117, 107}, - {49, 54, 48}, - {111, 84, 78}, - {155, 144, 137}, - {82, 99, 100}, - {87, 57, 52}, - {131, 132, 125}, - {110, 130, 125}, - {62, 70, 68}, - {156, 160, 153}, - {182, 190, 184}, - {112, 116, 111}, - {56, 37, 35}, - {226, 230, 226}, - {146, 158, 154}, - {111, 101, 91}, - {96, 99, 96}, - {158, 130, 115}, - {147, 117, 105}, - {90, 85, 83}, - {112, 124, 121}, - {140, 144, 136}, - {176, 162, 156}, - {69, 56, 52}, - {183, 177, 169}, - {34, 38, 33}, - {213, 219, 212}, - {96, 108, 107}, - {143, 132, 121}, - {159, 166, 156}, - {132, 124, 113}, - {141, 151, 149}, - {132, 100, 94}, - {75, 73, 68}, - {57, 62, 57}, - {78, 90, 83}, - {210, 205, 207}, - {155, 152, 143}, - {42, 47, 40}, - {94, 70, 64}, - {195, 193, 188}, - {124, 116, 106}, - {123, 124, 117}, - {173, 182, 172}, - {133, 138, 135}, - {183, 185, 178}, - {120, 130, 120}, - {96, 100, 110}, - {127, 88, 78}, - {166, 161, 154}, - {91, 92, 98}, - {132, 124, 136}, - {101, 122, 117}, - {112, 108, 99}, - {140, 144, 151}, - {98, 109, 116}, - {58, 58, 51}, - {84, 84, 82}, - {132, 132, 142}, - {112, 116, 127}, - {58, 48, 48}, - {66, 66, 58}, - {205, 210, 205}, - {70, 78, 80}, - {246, 246, 244}, - {167, 168, 159}, - {147, 152, 145}, - {166, 154, 148}, - {107, 73, 67}, - {175, 177, 168}, - {132, 117, 126}, - {86, 106, 101}, - {78, 78, 75}, - {123, 138, 135}, - {112, 92, 83}, - {143, 138, 127}, - {133, 109, 95}, - {38, 34, 44}, - {150, 134, 147}, - {147, 123, 115}, - {46, 48, 54}, - {195, 198, 195}, - {194, 186, 188}, - {122, 110, 100}, - {105, 116, 106}, - {42, 42, 42}, - {223, 221, 220}, - {68, 71, 65}, - {156, 160, 164}, - {114, 124, 132}, - {155, 152, 163}, - {103, 94, 89}, - {58, 63, 70}, - {132, 143, 137}, - {168, 143, 128}, - {190, 198, 190}, - {239, 237, 237}, - {103, 101, 94}, - {84, 90, 84}, - {211, 213, 210}, - {183, 185, 188}, - {94, 94, 108}, - {203, 204, 196}, - {123, 125, 135}, - {120, 132, 133}, - {111, 110, 125}, - {28, 32, 28}, - {53, 56, 62}, - {88, 63, 59}, - {104, 108, 103}, - {140, 124, 115}, - {147, 126, 137}, - {155, 144, 157}, - {87, 98, 92}, - {188, 192, 189}, - {162, 133, 115}, - {148, 144, 134}, - {175, 169, 162}, - {138, 131, 120}, - {118, 124, 118}, - {139, 125, 135}, - {148, 144, 154}, - {72, 47, 44}, - {100, 72, 66}, - {66, 42, 39}, - {105, 84, 73}, - {86, 78, 82}, - {234, 238, 236}, - {108, 78, 73}, - {130, 110, 121}, - {134, 150, 146}, - {254, 254, 252}, - {151, 138, 130}, - {125, 99, 88}, - {80, 56, 52}, - {98, 63, 60}, - {114, 138, 132}, - {61, 42, 37}, - {150, 166, 164}, - {127, 94, 87}, - {225, 226, 223}, - {64, 47, 44}, - {218, 226, 220}, - {242, 242, 242}, - {150, 138, 150}, - {166, 138, 122}, - {102, 78, 71}, - {124, 118, 131}, - {74, 65, 66}, - {49, 33, 28}, - {182, 170, 175}, - {139, 117, 107}, - {120, 84, 76}, - {232, 232, 231}, - {46, 50, 41}, - {102, 102, 115}, - {104, 108, 119}, - {140, 118, 123}, - {120, 92, 84}, - {139, 108, 97}, - {156, 125, 107}, - {218, 214, 215}, - {144, 133, 143}, - {168, 161, 172}, - {58, 58, 68}, - {167, 169, 173}, - {148, 152, 158}, - {175, 177, 180}, - {67, 73, 77}, - {134, 143, 148}, - {79, 50, 45}, - {74, 83, 86}, - {150, 134, 124}, - {90, 86, 95}, - {184, 176, 186}, - {38, 39, 45}, - {160, 168, 166}, - {78, 73, 78}, - {195, 193, 196}, - {177, 184, 181}, - {43, 41, 52}, - {32, 33, 39}, - {135, 138, 148}, - {203, 198, 201}, - {26, 26, 28}, - {98, 116, 113}, - {198, 202, 199}, - {170, 176, 172}, - {54, 57, 48}, - {162, 146, 140}, - {114, 131, 130}, - {162, 160, 150}, - {118, 116, 108}, - {150, 159, 156}, - {118, 99, 84}, - {74, 54, 51}, - {138, 102, 100}, - {62, 64, 55}, - {162, 154, 146}, - {190, 185, 179}, - {98, 94, 94}, - {106, 124, 121}, - {118, 110, 100}, - {118, 117, 131}, - {50, 50, 60}, - {162, 152, 164}, - {94, 63, 58}, - {62, 70, 77}, - {174, 162, 172}, - {78, 91, 92}, - {85, 85, 93}, - {54, 50, 61}, - {67, 66, 74}, - {166, 154, 167}, - {126, 109, 119}, - {104, 116, 118}, - {83, 92, 95}, - {203, 205, 204}, - {88, 100, 101}, - {176, 169, 179}, - {145, 138, 148}, - {116, 78, 68}, - {78, 78, 84}, - {126, 142, 137}, - {78, 83, 76}, - {94, 58, 52}, - {62, 38, 36}, - {98, 86, 76}, - {38, 42, 34}, - {218, 220, 217}, - {82, 70, 60}, - {202, 194, 188}, - {178, 183, 172}, - {126, 131, 120}, - {138, 132, 143}, - {250, 250, 250}, - {114, 74, 68}, - {90, 108, 106}, - {50, 38, 36}, - {162, 161, 168}, - {118, 124, 132}, - {62, 65, 71}, - {190, 185, 193}, - {98, 94, 109}, - {126, 132, 138}, - {34, 34, 28}, - {162, 146, 163}, - {78, 85, 88}, - {158, 134, 124}, - {190, 178, 188} -}; + int ncolors; + XColor *colors; + int ccolor; -static tangram_shape tsm1 = { {-0.144, -0.72, 0}, 225, false, 0 }; -static tangram_shape tsm2 = { {0.608, 0.032, 0}, 135, false, 0 }; -static tangram_shape tm = { {-1.584, 0.72, 0}, 0, false, 0 }; -static tangram_shape tlg1 = { {-0.112, -0.72, 0}, 315, false, 0 }; -static tangram_shape tlg2 = { {-0.096, -0.704, 0}, 45, false, 0 }; -static tangram_shape sq = { {0.592, 0.016, 0}, 225, false, 0 }; -static tangram_shape rh = { {-0.88, -0.032, 0}, 315, false, 0 }; + XFontStruct *xfont1; + XFontStruct *xfont2; + XFontStruct *xfont3; + GLuint font1_dlist, font2_dlist, font3_dlist; + GLuint name_list; +} tangram_configuration; +static tangram_configuration *tps = NULL; #define DEF_VIEWING_TIME "5" +#define DEF_ROTATE_CAMERA "True" +#define DEF_X_CAMERA_ROTATE "0.2" +#define DEF_Y_CAMERA_ROTATE "0.5" +#define DEF_Z_CAMERA_ROTATE "0" + + static GLuint viewing_time = 0; +static Bool do_rotate = True; +static GLfloat x_camera_rotate = 0.3; +static GLfloat y_camera_rotate = 0.75; +static GLfloat z_camera_rotate = 0; +static int wire; static XrmOptionDescRec opts[] = { - {"-viewing_time", ".viewing_time", XrmoptionSepArg, 0} + {"-viewing_time", ".viewing_time", XrmoptionSepArg, 0}, + {"-rotate", ".rotate", XrmoptionNoArg, "True"}, + {"+rotate", ".rotate", XrmoptionNoArg, "False"}, + {"-x_camera_rotate", ".x_camera_rotate", XrmoptionSepArg, 0}, + {"-y_camera_rotate", ".y_camera_rotate", XrmoptionSepArg, 0}, + {"-z_camera_rotate", ".z_camera_rotate", XrmoptionSepArg, 0} }; static argtype vars[] = { - {&viewing_time, "viewing_time", "Viewing Time", DEF_VIEWING_TIME, t_Int} + {&viewing_time, "viewing_time", "Viewing Time", DEF_VIEWING_TIME, t_Int}, + {&do_rotate, "rotate", "Rotate", DEF_ROTATE_CAMERA, t_Bool}, + {&x_camera_rotate, "x_camera_rotate", "X Camera Rotate", DEF_X_CAMERA_ROTATE, t_Float}, + {&y_camera_rotate, "y_camera_rotate", "Y Camera Rotate", DEF_Y_CAMERA_ROTATE, t_Float}, + {&z_camera_rotate, "z_camera_rotate", "Z Camera Rotate", DEF_Z_CAMERA_ROTATE, t_Float} }; ModeSpecOpt sws_opts = { countof(opts), opts, countof(vars), vars, NULL }; -static int wire; -static int csi = -1; /* Current Shape index */ +static puzzle solved[] = { + {"Teapot", { + {{-1.664000, -1.552000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.696000, 0.944000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.064000, -2.128000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.960000, -1.056000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.104000, 0.960000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.376000, -0.800000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.152000, 0.736000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Candle", { + {{-0.016000, 2.176001, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{0.016000, 2.960001, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.000000, 0.400000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-2.015998, 2.208001, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{2.000001, 2.208001, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.496000, 0.432000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.016000, -0.672000, 0}, 335, 0, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Square", { + {{-0.048000, -0.016000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.704000, 0.736000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.488000, 1.424001, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.016000, -0.016000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.000000, 0.000000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.688000, 0.720000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.784000, 0.672000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Crane", { + {{1.248001, 1.759999, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.024000, 3.071999, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.975999, -2.096001, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.480000, -1.968001, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{1.056000, -0.496000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.239999, -1.312001, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.223999, -1.360001, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Crane", { + {{0.320000, 1.360000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.704000, 3.072000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.200000, -3.392000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.688000, -1.184000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.768000, 0.192000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.168000, -2.304000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.312000, 1.296000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Duck", { + {{-1.391999, 1.424000, 0}, 65, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.768000, 2.000000, 0}, 99, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{2.688001, -1.872000, 0}, 270, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.343999, 0.944000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.112000, -0.464000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.984001, -1.120000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{1.536001, 0.912000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Pelican", { + {{1.088000, 0.064001, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.864000, -1.279999, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.807999, 1.520000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{1.824001, -1.231998, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.368000, 1.472000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{0.832000, -2.271998, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.776001, 0.816000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Cat", { + {{0.416000, -2.432000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.352000, -2.432000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{0.832000, -0.480000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.632000, 3.056000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.616000, 1.040000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{1.088000, -1.696000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.832000, -0.432000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Coi", { + {{1.264000, -1.232000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{1.216000, 0.816000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.631999, 1.872000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{0.832000, 2.287999, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.608000, 0.912000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{2.240001, -0.176000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.256000, -1.200000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Man Skipping", { + {{1.727998, 2.303998, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.120000, 3.376001, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{0.879998, -3.008001, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.072000, 2.559999, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.440000, 0.144000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.192001, -2.592001, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.015999, 0.176000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Old Man", { + {{-0.400000, 1.744000, 0}, 58, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{0.704000, 0.128000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{0.656000, 0.320000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.112000, -0.384000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.096000, -0.399999, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.736000, 0.352000, 0}, 123, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.336000, 0.352000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Spear Head", { + {{0.688000, -0.144000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.080000, 0.592000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.048000, 0.592000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.488000, -0.848000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{1.376000, -0.864000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{0.688000, -0.128000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.504000, -0.832000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Diamond", { + {{0.624000, -1.776000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.144000, 0.432000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.800000, -0.272000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-2.320000, -0.304000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{2.048000, -0.320000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.112000, 0.480000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.832000, -0.320000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Arrow", { + {{-2.048001, -1.232000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{0.112000, 0.943999, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.312001, -0.560000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{0.496000, 0.656000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.528000, 0.608000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-2.048001, -2.704000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.312001, -0.512000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Lady", { + {{-0.720000, 3.440000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{0.912000, -1.072000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.736000, 3.440000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{0.720000, 1.984000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.672000, 0.544000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.192000, -3.840000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.528000, -2.480000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Running Man", { + {{1.136000, 2.720000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-2.304001, 1.776000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.256000, 0.288000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.304000, 0.304000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.096000, -0.128000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.656000, -2.832000, 0}, 105, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.784000, -0.096000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Parallelogram", { + {{-1.104000, -1.455999, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.912000, -0.447999, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.048000, -1.471999, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.136000, -1.439999, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.944000, 1.552000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.912000, 0.560000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.112000, 1.568000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"N", { + {{-1.615999, 0.064000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.592000, 0.112000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.432000, 0.096000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.679999, -0.880000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{1.488001, 1.103999, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.640000, 0.112000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{1.392001, -0.928000, 0}, 270, 180, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Farm House", { + {{2.112000, 1.504000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.040000, 1.472000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{0.032000, -1.600000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{1.056000, 1.504000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.992000, -0.528000, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{2.080000, 0.512000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.104000, 0.480000, 0}, 270, 180, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Vulture", { + {{0.912000, 1.728000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-2.623998, -1.040000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.992000, 1.104000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{0.944000, -0.288000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.448000, -1.760000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.887998, -0.368000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{3.008002, 2.160000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Swan", { + {{0.720000, 0.352000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.672000, -1.568000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.376000, 1.104000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.151999, 1.488000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.320000, 2.096000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{0.656000, 0.304000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.624000, -2.559999, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"High Karate", { + {{-0.144000, 2.576000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.696001, -2.432000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{2.176001, -0.400000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.624000, -0.512000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.576000, -1.152000, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.919999, -1.376000, 0}, 303, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.448000, -0.096001, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Lazy", { + {{-2.416000, 1.120000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.952000, -2.016000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.552000, -0.640000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.016000, 1.840000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.456000, -1.072000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{0.848000, -0.816000, 0}, 332, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.200000, -1.792000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Bat", { + {{-0.304000, -0.352000, 0}, 259, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.304000, -1.344000, 0}, 105, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{1.312000, -1.024000, 0}, 300, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{1.952000, 0.240000, 0}, 195, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-2.272000, 0.096000, 0}, 11, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.112000, -1.056000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.560000, -1.344000, 0}, 281, 180, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Sail Boat", { + {{0.544000, 2.000000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.880000, 0.160000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.656000, -1.503999, 0}, 220, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.656000, -0.336000, 0}, 50, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.688000, -0.288000, 0}, 310, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{0.864000, 1.232000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.496000, 2.016001, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Glenda", { + {{-2.016000, 2.080000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.240001, 1.824000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{2.239999, -0.752000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.264000, 2.784000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.248000, 0.736000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{0.240001, 0.304000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.544000, -2.976001, 0}, 149, 0, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Cat", { + {{1.376000, -1.536001, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{1.488000, -1.552001, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.352000, -0.048000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-2.144000, 2.415999, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-2.096000, 0.368000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{2.144000, -0.800000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.392000, -0.064000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Lying Cat", { + {{2.480000, -0.912000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{2.592000, -0.928000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.352000, 1.280000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.688000, 0.336000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{1.808000, -0.112000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{3.248000, -0.176000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.472000, 1.024000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Witch", { + {{-0.943999, -0.304000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.144000, 0.288000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.360000, -2.304000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{1.328000, -0.848000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.008000, 1.584000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.512000, 2.688000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.863999, -0.096000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Laugh", { + {{0.703999, -0.160000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.064000, -0.400000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.767999, -1.408000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.232000, -1.328000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.040000, 2.624000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.288000, 1.264000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.760001, -1.408000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Standing Man", { + {{0.272000, 3.392000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.144000, -1.328000, 0}, 331, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.216001, 0.272000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.736000, 0.208000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.432000, -3.440000, 0}, 151, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.720000, 2.320000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.263998, 0.272000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Walking Man", { + {{-1.056000, -3.456000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.736000, 2.000000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.488000, 1.760000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.432000, 0.016000, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.432000, -0.064000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.560000, -2.576000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.032000, 2.656000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Repose", { + {{-2.800000, -2.304000, 0}, 101, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{1.888000, 2.032000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.856000, 2.016000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.352000, -0.144000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-2.848000, 0.976000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.424000, -1.104000, 0}, 236, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.792000, 2.016000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Shape", { + {{1.263999, 1.600001, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.311999, -1.568000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.736000, 0.576000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.736000, -2.591999, 0}, 360, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.768000, 2.640001, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.784000, -0.528000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.736000, 0.496000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Shape", { + {{-0.816000, 1.392000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.832000, -1.807999, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{1.216000, -0.752000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{1.232000, -2.815999, 0}, 270, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{1.248000, 2.400000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.864000, 1.392000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.240000, 1.328000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Lightning", { + {{0.176000, -2.448000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.888000, 2.880000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.856000, 1.824000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.872000, -1.392000, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{1.264000, -0.432000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{2.320001, -2.432000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.872000, 1.728000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"E", { + {{0.928000, 1.664000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.896000, -1.519998, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.136000, 0.608000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.152000, -2.559998, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.152000, 2.672002, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.960000, -0.384000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.136000, 0.528000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Dagger", { + {{-0.096000, 0.448000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.640000, 2.656000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.064000, -3.104000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.767999, 1.184000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.080000, 0.416000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.416000, -2.064000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.112000, 3.328001, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Knight", { + {{-0.368000, 0.400000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{1.871998, -1.808000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.056000, -0.368000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.056000, -1.840000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.352000, 1.440000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{0.128000, 0.432000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.119999, -1.120000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Candy", { + {{-1.039999, 1.136000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.024000, 0.096000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.016000, 0.048000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.016000, -1.008000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.016000, 1.216000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{1.024000, 0.144000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.032000, 1.088000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"King", { + {{-0.688000, 1.904000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.800000, 1.904000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.512000, -1.392000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{1.488000, 1.120000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.392000, 1.120000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.496000, -1.312000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.480000, -1.376000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Top", { + {{-1.055999, -0.800000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.103999, 0.208000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{0.000000, -0.784000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.016000, 0.272000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.032000, 0.288000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{0.480000, -1.855999, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{2.096001, 0.224000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Dog", { + {{-2.896000, -0.128000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.800000, 0.992000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-1.152000, -0.416000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.016000, 0.656000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.456000, -0.736000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{2.864000, 0.736000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.048000, 1.664000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True}, + }, + }, + {"Moose Head", { + {{2.944000, -0.288000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.936000, -0.224000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.112000, 1.808000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{-2.128000, 0.768000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{1.888000, 0.768000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.112000, -0.688000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-3.184000, -1.216000, 0}, 360, 180, 0, INIT_DZ, -SPEED, 0, False}, + }, + }, + {"Negative Square", { + {{-1.520000, -0.624000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-1.520000, 0.480000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{2.352000, 0.480000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True}, + {{-0.080000, -3.040000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False}, + {{-0.096000, 2.944000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True}, + {{-2.528000, -0.576000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False}, + {{1.360000, -1.600000, 0}, 360, 180, INIT_DZ, -SPEED, 0, True}, + }} +}; + -static void get_solved_puzzle(tangram_shape * tsm1, tangram_shape * tsm2, +static void get_solved_puzzle(ModeInfo * mi, + tangram_shape * tsm1, tangram_shape * tsm2, tangram_shape * tm, tangram_shape * tlg1, tangram_shape * tlg2, tangram_shape * sq, tangram_shape * rh) { + tangram_configuration *tp = &tps[MI_SCREEN(mi)]; int sz = sizeof(solved) / sizeof(solved[0]); int r; - GLuint t_dl; + /* we don't want to see the same puzzle twice */ do { r = random() % sz; - } while (r == csi); - csi = r; - - t_dl = tsm1->dl; - *tsm1 = solved[r][small_triangle1]; - tsm1->dl = t_dl; - - t_dl = tsm2->dl; - *tsm2 = solved[r][small_triangle2]; - tsm2->dl = t_dl; - - t_dl = tm->dl; - *tm = solved[r][medium_triangle]; - tm->dl = t_dl; - - t_dl = tlg1->dl; - *tlg1 = solved[r][large_triangle1]; - tlg1->dl = t_dl; - - t_dl = tlg2->dl; - *tlg2 = solved[r][large_triangle2]; - tlg2->dl = t_dl; - - t_dl = sq->dl; - *sq = solved[r][square]; - sq->dl = t_dl; - - t_dl = rh->dl; - *rh = solved[r][rhomboid]; - rh->dl = t_dl; - -} - -static bool colors_match(color c1, color c2) -{ - bool res = false; - if (c1.r == c2.r && c1.g == c2.g && c1.b == c2.b) - res = true; - return res; -} - -static color rand_palette(void) -{ - int l = sizeof(palette) / sizeof(color); - int r = random() % l; - return palette[r]; + } while (r == tp->csi); + tp->csi = r; + + *tsm1 = solved[r].ts[small_triangle1]; + *tsm2 = solved[r].ts[small_triangle2]; + *tm = solved[r].ts[medium_triangle]; + *tlg1 = solved[r].ts[large_triangle1]; + *tlg2 = solved[r].ts[large_triangle2]; + *sq = solved[r].ts[square]; + *rh = solved[r].ts[rhomboid]; + + tp->puzzle_name = solved[r].name; } static int approach_number(int goal, int current, int step) @@ -860,64 +652,37 @@ static int approach_number(int goal, int current, int step) } /* gt - floating point greater than comparison */ -static bool gt(GLfloat x1, GLfloat x2, GLfloat per) +static Bool gt(GLfloat x1, GLfloat x2, GLfloat per) { if ((x1 > x2) && (fabs(x1 - x2) > per)) - return true; + return True; else - return false; + return False; } /* lt - floating point less than comparison */ -static bool lt(GLfloat x1, GLfloat x2, GLfloat per) +static Bool lt(GLfloat x1, GLfloat x2, GLfloat per) { if ((x1 < x2) && (fabs(x1 - x2) > per)) - return true; + return True; else - return false; + return False; } -/* eq - Check the equality of a pair of floating point numbers to a certain perscision */ -static bool eq(GLfloat x1, GLfloat x2, GLfloat per) -{ - if (fabs(x1 - x2) < per) - return true; - else - return false; -} - - static GLfloat approach_float(GLfloat goal, GLfloat current, - bool * changed, GLfloat per) + Bool * changed, GLfloat per) { - *changed = false; + *changed = False; if (gt(goal, current, per)) { current += per; - *changed = true; + *changed = True; } else if (lt(goal, current, per)) { current -= per; - *changed = true; + *changed = True; } return current; } -static bool coords_match(coord c1, coord c2, GLfloat per) -{ - if (eq(c1.x, c2.x, per) && eq(c1.y, c2.y, per) && eq(c1.z, c2.z, per)) - return true; - else - return false; -} - -static bool xy_coords_match(coord c1, coord c2, GLfloat per) -{ - if (eq(c1.x, c2.x, per) && eq(c1.y, c2.y, per)) - return true; - else - return false; -} - - #if 0 static void print_shape(char *s, tangram_shape sh) { @@ -928,117 +693,38 @@ static void print_shape(char *s, tangram_shape sh) fprintf(stderr, "\n"); } #endif + -/* approach_shape - bring use on step closer to the new shape */ -static tangram_shape approach_shape(tangram_shape old, tangram_shape new, - bool * b, char *name) +void reset_shape(tangram_shape * ts) { - - GLuint dl; - bool changed; - *b = false; - - old.fr = approach_number(new.fr, old.fr, 2); - if (old.fr != new.fr) { - return old; - } - - old.r = approach_number(new.r, old.r, 2); - if (old.r != new.r) { - return old; - } - - old.crd.x = approach_float(new.crd.x, old.crd.x, &changed, 0.1); - if (!changed) - old.crd.x = approach_float(new.crd.x, old.crd.x, &changed, 0.01); - if (!changed) - old.crd.x = approach_float(new.crd.x, old.crd.x, &changed, 0.001); - if (!changed) - old.crd.x = approach_float(new.crd.x, old.crd.x, &changed, 0.0001); - - old.crd.y = approach_float(new.crd.y, old.crd.y, &changed, 0.1); - if (!changed) - old.crd.y = approach_float(new.crd.y, old.crd.y, &changed, 0.01); - if (!changed) - old.crd.y = approach_float(new.crd.y, old.crd.y, &changed, 0.001); - if (!changed) - old.crd.y = approach_float(new.crd.y, old.crd.y, &changed, 0.0001); - - if (xy_coords_match(new.crd, old.crd, 0.0001)) { - old.crd.z = approach_float(new.crd.z, old.crd.z, &changed, 0.1); - if (!changed) - old.crd.z = - approach_float(new.crd.z, old.crd.z, &changed, 0.01); - if (!changed) - old.crd.z = - approach_float(new.crd.z, old.crd.z, &changed, 0.001); - if (!changed) - old.crd.z = - approach_float(new.crd.z, old.crd.z, &changed, 0.0001); - } - - - if (coords_match(new.crd, old.crd, 0.0001)) { - dl = old.dl; -#if 0 - fprintf(stderr, "%s\n", name); - print_shape("old", old); - print_shape("new", new); -#endif - old = new; /* pick up the rest of the settings; */ - old.dl = dl; - *b = true; - } - - return old; + GLfloat r = random() % 10; + GLfloat f = r / 10; + ts->crd.z = BOTTOM; + ts->dz = INIT_DZ + f; + ts->ddz = -SPEED; } -static color get_color(void) +void bounce(tangram_shape * ts) { - static color new_color = { 100, 100, 100 }; - static color old_color = { 100, 100, 100 }; - - if (colors_match(old_color, new_color)) { - old_color = new_color; - new_color = rand_palette(); + ts->crd.z *= -1; /* ignore this */ + ts->dz += ts->ddz; + ts->crd.z += ts->dz * SPEED; + if (ts->crd.z < BOTTOM) { + reset_shape(ts); } - if ((random() % 10) == 0) { /* slow down the cycle */ - old_color.r = approach_number(new_color.r, old_color.r, 1); - old_color.g = approach_number(new_color.g, old_color.g, 1); - old_color.b = approach_number(new_color.b, old_color.b, 1); - } - - return old_color; -} - -static void explode(tangram_shape * tsm1, tangram_shape * tsm2, - tangram_shape * tm, tangram_shape * tlg1, - tangram_shape * tlg2, tangram_shape * sq, - tangram_shape * rh) -{ - tsm1->crd.z = 1; - tsm1->r = 0; - tsm2->crd.z = -1; - tsm2->r = 0; - tm->crd.z = 2; - tm->r = 0; - tlg1->crd.z = -2; - tlg1->r = 0; - tlg2->crd.z = 3; - tlg2->r = 0; - sq->crd.z = -3; - sq->r = 0; - rh->crd.z = 4; - rh->r = 0; + ts->crd.z *= -1; /* ignore this */ } - static void draw_tangram_shape(tangram_shape ts) { glPushMatrix(); - glTranslatef(ts.crd.x, ts.crd.y, ts.crd.z); + if (!do_rotate) { + ts.up = True; + } + + glTranslatef(ts.crd.x, ts.crd.y, ts.up ? ts.crd.z : -ts.crd.z); glRotated(90, 1, 0, 0); glRotated(ts.fr, 1, 0, 0); glRotated(ts.r, 0, 1, 0); @@ -1046,25 +732,29 @@ static void draw_tangram_shape(tangram_shape ts) glPopMatrix(); } -static void draw_shapes(void) +static void load_fonts(ModeInfo * mi) { + tangram_configuration *tp = &tps[MI_SCREEN(mi)]; + load_font(mi->dpy, "titleFont", &tp->xfont1, &tp->font1_dlist); + load_font(mi->dpy, "titleFont2", &tp->xfont2, &tp->font2_dlist); + load_font(mi->dpy, "titleFont3", &tp->xfont3, &tp->font3_dlist); +} - if (!wire) { - color c = get_color(); - glColor3ub(c.r, c.g, c.b); - } - - draw_tangram_shape(tsm1); - - draw_tangram_shape(tsm2); - draw_tangram_shape(tm); - draw_tangram_shape(tlg1); - draw_tangram_shape(tlg2); - draw_tangram_shape(sq); - draw_tangram_shape(rh); +static void draw_shapes(ModeInfo * mi) +{ + tangram_configuration *tp = &tps[MI_SCREEN(mi)]; + draw_tangram_shape(tp->tsm1); + draw_tangram_shape(tp->tsm2); + draw_tangram_shape(tp->tm); + draw_tangram_shape(tp->tlg1); + draw_tangram_shape(tp->tlg2); + draw_tangram_shape(tp->sq); + draw_tangram_shape(tp->rh); + glCallList(tp->name_list); } + static void set_perspective(void) { glPushMatrix(); @@ -1084,11 +774,10 @@ void reshape_tangram(ModeInfo * mi, int w, int h) glLoadIdentity(); } -static void rotate_camera(void) +static void set_camera(void) { static GLfloat theta[3] = { 1, 1, 1 }; - static bool going_down[3] = { false, false, false }; - + static Bool going_down[3] = { False, False, False }; glPushMatrix(); glMatrixMode(GL_PROJECTION); @@ -1098,9 +787,11 @@ static void rotate_camera(void) gluLookAt(0, 5, -5, 0, 0, 0, 0, -1, 0); - glRotatef(theta[0], 1, 0, 0); - glRotatef(theta[1], 0, 1, 0); - glRotatef(theta[2], 0, 0, 1); + if (do_rotate) { + glRotatef(theta[0], 1, 0, 0); + glRotatef(theta[1], 0, 1, 0); + glRotatef(theta[2], 0, 0, 1); + } glMatrixMode(GL_MODELVIEW); glPopMatrix(); @@ -1108,138 +799,253 @@ static void rotate_camera(void) if (going_down[0] && theta[0] < 0) { - going_down[0] = false; + going_down[0] = False; } else if ((!going_down[0]) && theta[0] > 90) { - going_down[0] = true; + going_down[0] = True; } if (theta[1] > 360.0) theta[1] -= 360.0; + if (theta[2] > 360.0) + theta[2] -= 360.0; + if (going_down[0]) - theta[0] -= 0.5; + theta[0] -= x_camera_rotate; else - theta[0] += 0.5; - theta[1] += 1; + theta[0] += x_camera_rotate; + + theta[1] += y_camera_rotate; + theta[2] += z_camera_rotate; } -static void init_shapes(void) +static void init_shapes(ModeInfo * mi) { - get_solved_puzzle(&tsm1, &tsm2, &tm, &tlg1, &tlg2, &sq, &rh); - tsm1.dl = get_sm_tri_dl(wire); - tsm2.dl = get_sm_tri_dl(wire); - tm.dl = get_md_tri_dl(wire); - tlg1.dl = get_lg_tri_dl(wire); - tlg2.dl = get_lg_tri_dl(wire); - sq.dl = get_square_dl(wire); - rh.dl = get_rhomboid_dl(wire); + int wire = MI_IS_WIREFRAME(mi); + tangram_configuration *tp = &tps[MI_SCREEN(mi)]; + get_solved_puzzle(mi, &tp->tsm1, &tp->tsm2, &tp->tm, &tp->tlg1, + &tp->tlg2, &tp->sq, &tp->rh); + get_solved_puzzle(mi, &tp->n_tsm1, &tp->n_tsm2, &tp->n_tm, &tp->n_tlg1, + &tp->n_tlg2, &tp->n_sq, &tp->n_rh); + tp->tsm1.dl = get_sm_tri_dl(wire); + tp->tsm2.dl = get_sm_tri_dl(wire); + tp->tm.dl = get_md_tri_dl(wire); + tp->tlg1.dl = get_lg_tri_dl(wire); + tp->tlg2.dl = get_lg_tri_dl(wire); + tp->sq.dl = get_square_dl(wire); + tp->rh.dl = get_rhomboid_dl(wire); } -void init_tangram(ModeInfo * mi) +static void gl_init(ModeInfo * mi) { - GLfloat pos[4] = { 1, 1, -5, 1.00 }; - GLfloat pos2[4] = { 1, 1, 5, 1.00 }; - GLfloat lKa[4] = { 0, 0, 0, 1 }; - GLfloat lKd[4] = { 1, 1, 1, 1 }; - GLfloat lKs[4] = { 1, 1, 1, 1 }; - wire = MI_IS_WIREFRAME(mi); - init_GL(mi); + int wire = MI_IS_WIREFRAME(mi); - if (!wire) { - glLightfv(GL_LIGHT0, GL_POSITION, pos); - glLightfv(GL_LIGHT0, GL_AMBIENT, lKa); - glLightfv(GL_LIGHT0, GL_DIFFUSE, lKd); - glLightfv(GL_LIGHT0, GL_SPECULAR, lKs); + GLfloat y = do_rotate ? -10 : 3; + GLfloat x = do_rotate ? 5 : 10; + GLfloat pos[4] = { 0, 0, -5, 1.00 }; + GLfloat pos2[4] = { 0, 0, 5, 1.00 }; + GLfloat dif2[4] = { 1, 1, 1, 1 }; - glLightfv(GL_LIGHT1, GL_POSITION, pos2); - glLightfv(GL_LIGHT1, GL_AMBIENT, lKa); - glLightfv(GL_LIGHT1, GL_DIFFUSE, lKd); - glLightfv(GL_LIGHT1, GL_SPECULAR, lKs); + pos[0] = -x; + pos[1] = y; - glEnable(GL_DEPTH_TEST); + pos2[1] = x; + pos2[1] = y; + if (!wire) { glEnable(GL_LIGHTING); + glLightfv(GL_LIGHT0, GL_POSITION, pos); glEnable(GL_LIGHT0); - glEnable(GL_LIGHT1); + if (do_rotate) { + glLightfv(GL_LIGHT1, GL_POSITION, pos2); + glLightfv(GL_LIGHT1, GL_DIFFUSE, dif2); + glEnable(GL_LIGHT1); + } + glEnable(GL_DEPTH_TEST); + } + +} + +void init_tangram(ModeInfo * mi) +{ + tangram_configuration *tp; + + if (!tps) { + tps = (tangram_configuration *) + calloc(MI_NUM_SCREENS(mi), sizeof(tangram_configuration)); + if (!tps) { + fprintf(stderr, "%s: out of memory\n", progname); + exit(1); + } - glEnable(GL_COLOR_MATERIAL); + tp = &tps[MI_SCREEN(mi)]; } - init_shapes(); + tp = &tps[MI_SCREEN(mi)]; + + if ((tp->glx_context = init_GL(mi)) != NULL) { + gl_init(mi); + } + + wire = MI_IS_WIREFRAME(mi); + + load_fonts(mi); + init_shapes(mi); } -static tangram_shape explode_step(tangram_shape old, tangram_shape new, - bool * b, GLfloat per) +static Bool all_solved(tangram_shape * ls[]) { - old.crd.z = approach_float(new.crd.z, old.crd.z, b, per); - if (eq(new.crd.z, old.crd.z, per)) - *b = true; - else - *b = false; + int i; + Bool b = True; + for (i = 0; i < NUM_SHAPES; i++) { + b = (b && ls[i]->solved); + } + return b; +} + +static void solve(tangram_shape * new_s, tangram_shape * old_s) +{ + Bool moved_x, moved_y, moved_r, moved_fr, z_ok; - return old; + old_s->fr = approach_number(new_s->fr, old_s->fr, 2); + moved_fr = (old_s->fr != new_s->fr); + + old_s->r = approach_number(new_s->r, old_s->r, 2); + moved_r = (old_s->r != new_s->r); + + old_s->crd.x = + approach_float(new_s->crd.x, old_s->crd.x, &moved_x, 0.1); + if (!moved_x) + old_s->crd.x = new_s->crd.x; + + old_s->crd.y = + approach_float(new_s->crd.y, old_s->crd.y, &moved_y, 0.1); + if (!moved_y) + old_s->crd.y = new_s->crd.y; + + z_ok = (-old_s->crd.z <= BOTTOM); + + old_s->solved = (moved_x == False && moved_y == False && + moved_r == False && moved_fr == False && + z_ok == True); } +static void set_not_solved(tangram_shape * ls[]) +{ + int i; + for (i = 0; i < NUM_SHAPES; i++) + ls[i]->solved = False; +} + + void draw_tangram(ModeInfo * mi) { Display *dpy = MI_DISPLAY(mi); Window window = MI_WINDOW(mi); - static tangram_state state = state_solved; - static tangram_shape n_tsm1, n_tsm2, n_tm, n_tlg1, n_tlg2, n_sq, n_rh; - static bool b_tsm1, b_tsm2, b_tm, b_tlg1, b_tlg2, b_sq, b_rh; - static time_t s_tm = 0; - static time_t c_tm; - rotate_camera(); - - switch (state) { - case state_exploding: - tsm1 = explode_step(tsm1, n_tsm1, &b_tsm1, 0.1); - tsm2 = explode_step(tsm2, n_tsm2, &b_tsm2, 0.1); - tm = explode_step(tm, n_tm, &b_tm, 0.1); - tlg1 = explode_step(tlg1, n_tlg1, &b_tlg1, 0.1); - tlg2 = explode_step(tlg2, n_tlg2, &b_tlg2, 0.1); - sq = explode_step(sq, n_sq, &b_sq, 0.1); - rh = explode_step(rh, n_rh, &b_rh, 0.1); - if (b_tsm1 && b_tsm2 && b_tm && b_tlg1 && b_tlg2 && b_sq && b_rh) { - get_solved_puzzle(&n_tsm1, &n_tsm2, &n_tm, &n_tlg1, &n_tlg2, - &n_sq, &n_rh); - state = state_solving; + tangram_configuration *tp = &tps[MI_SCREEN(mi)]; + + tangram_shape *ls[NUM_SHAPES]; + tangram_shape *nls[NUM_SHAPES]; + + + int i; + int MAX_DISPLAY; + static char *pn = ""; + static int display_counter = 0; + + static GLfloat color[4] = { 0.0, 0.0, 0.0, 1.0 }; + static GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 }; + MAX_DISPLAY = viewing_time * 100; + + ls[small_triangle1] = &tp->tsm1; + ls[small_triangle2] = &tp->tsm2; + ls[medium_triangle] = &tp->tm; + ls[large_triangle1] = &tp->tlg1; + ls[large_triangle2] = &tp->tlg2; + ls[square] = &tp->sq; + ls[rhomboid] = &tp->rh; + + nls[small_triangle1] = &tp->n_tsm1; + nls[small_triangle2] = &tp->n_tsm2; + nls[medium_triangle] = &tp->n_tm; + nls[large_triangle1] = &tp->n_tlg1; + nls[large_triangle2] = &tp->n_tlg2; + nls[square] = &tp->n_sq; + nls[rhomboid] = &tp->n_rh; + + set_camera(); + + if (display_counter <= 0) { + for (i = 0; i < NUM_SHAPES; i++) { + if (ls[i]->solved) { + if (all_solved(ls)) { + display_counter = MAX_DISPLAY; + pn = tp->puzzle_name; + get_solved_puzzle(mi, nls[small_triangle1], + nls[small_triangle2], + nls[medium_triangle], + nls[large_triangle1], + nls[large_triangle2], nls[square], + nls[rhomboid]); + tp->ncolors = 128; + tp->colors = + (XColor *) calloc(tp->ncolors, sizeof(XColor)); + + make_random_colormap(0, 0, 0, + tp->colors, &tp->ncolors, + True, False, 0, False); + + + color[0] = tp->colors[0].red / 65536.0; + color[1] = tp->colors[1].green / 65536.0; + color[2] = tp->colors[2].blue / 65536.0; + + + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, + color); + + set_not_solved(ls); + break; + } + } else { + pn = ""; + bounce(ls[i]); + solve(nls[i], ls[i]); + } } - - break; - case state_solving: - - tsm1 = approach_shape(tsm1, n_tsm1, &b_tsm1, "small 1"); - tsm2 = approach_shape(tsm2, n_tsm2, &b_tsm2, "small 2"); - tm = approach_shape(tm, n_tm, &b_tm, "medium"); - tlg1 = approach_shape(tlg1, n_tlg1, &b_tlg1, "large 1"); - tlg2 = approach_shape(tlg2, n_tlg2, &b_tlg2, "large 2"); - sq = approach_shape(sq, n_sq, &b_sq, "square"); - rh = approach_shape(rh, n_rh, &b_rh, "rhomboid"); - if (b_tsm1 && b_tsm2 && b_tm && b_tlg1 && b_tlg2 && b_sq && b_rh) { - state = state_solved; - s_tm = time(0); - } - break; - case state_solved: - c_tm = time(0); - if (floor(difftime(c_tm, s_tm)) >= viewing_time) { - /*if ((random() % 100) == 0) { */ - explode(&n_tsm1, &n_tsm2, &n_tm, &n_tlg1, &n_tlg2, &n_sq, - &n_rh); - - state = state_exploding; - - } - break; + } else { + display_counter--; } - glPushMatrix(); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glPushMatrix(); + glLoadIdentity(); + glNewList(tp->name_list, GL_COMPILE); + { + XFontStruct *f; + GLuint fl; + if (MI_WIDTH(mi) >= 500 && MI_HEIGHT(mi) >= 375) + f = tp->xfont1, fl = tp->font1_dlist; + else if (MI_WIDTH(mi) >= 350 && MI_HEIGHT(mi) >= 260) + f = tp->xfont2, fl = tp->font2_dlist; + else + f = tp->xfont3, fl = tp->font3_dlist; + + glColor3f(0.8, 0.8, 0); + print_gl_string(mi->dpy, f, fl, + mi->xgwa.width, mi->xgwa.height, + 10, mi->xgwa.height - 10, pn); + } + glEndList(); + + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, white); + glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 128); + + draw_shapes(mi); - draw_shapes(); glFlush(); glPopMatrix(); glXSwapBuffers(dpy, window); diff --git a/hacks/glx/tangram.man b/hacks/glx/tangram.man index 1c69306e..dcf5cd9b 100644 --- a/hacks/glx/tangram.man +++ b/hacks/glx/tangram.man @@ -10,6 +10,7 @@ tangram - watch the computer solve tangram puzzles. [\-delay \fInumber\fP] [\-wireframe] [\-viewing_time \fInumber\fP] +[\-rotate] .SH DESCRIPTION The \fItangram\fP program uses a view basic shapes to build silhouettes of recognizable objects. .SH OPTIONS @@ -34,7 +35,9 @@ Render in wireframe instead of solid. .TP 8 .B \-viewing_time \fInumber\fP Specify the length of time, in seconds, that the finished puzzle -should be displayed. Default: 5 +.TP 8 +.B \-rotate | \-no-rotate +Rotate the camera around the puzzle. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/glx/tangram_shapes.c b/hacks/glx/tangram_shapes.c index 25dec5b2..283c2ba4 100644 --- a/hacks/glx/tangram_shapes.c +++ b/hacks/glx/tangram_shapes.c @@ -32,33 +32,46 @@ static void tri_45_90(int wire) glNormal3f(0, 1, 0); glVertex3fv(vertices[0]); + glNormal3f(0, 1, 0); glVertex3fv(vertices[2]); + glNormal3f(0, 1, 0); glVertex3fv(vertices[1]); glNormal3f(0, -1, 0); glVertex3fv(vertices[3]); + glNormal3f(0, -1, 0); glVertex3fv(vertices[4]); + glNormal3f(0, -1, 0); glVertex3fv(vertices[5]); glEnd(); glBegin((wire) ? GL_LINE_LOOP : GL_QUADS); glNormal3f(1, 0, 1); glVertex3fv(vertices[2]); + glNormal3f(1, 0, 1); glVertex3fv(vertices[5]); + glNormal3f(1, 0, 1); glVertex3fv(vertices[4]); + glNormal3f(1, 0, 1); glVertex3fv(vertices[1]); glNormal3f(-1, 0, 0); glVertex3fv(vertices[0]); + glNormal3f(-1, 0, 0); glVertex3fv(vertices[1]); + glNormal3f(-1, 0, 0); glVertex3fv(vertices[4]); + glNormal3f(-1, 0, 0); glVertex3fv(vertices[3]); glNormal3f(0, 0, -1); - glVertex3fv(vertices[2]); - glVertex3fv(vertices[5]); - glVertex3fv(vertices[3]); glVertex3fv(vertices[0]); + glNormal3f(0, 0, -1); + glVertex3fv(vertices[3]); + glNormal3f(0, 0, -1); + glVertex3fv(vertices[5]); + glNormal3f(0, 0, -1); + glVertex3fv(vertices[2]); glEnd(); } @@ -66,11 +79,12 @@ void unit_cube(int wire) { glBegin((wire) ? GL_LINE_LOOP : GL_QUADS); - glNormal3f(0.0f, -1.0f, 0.0f); - glVertex3f(0.0f, -alpha, 0.0f); - glVertex3f(1.0f, -alpha, 0.0f); - glVertex3f(1.0f, -alpha, 1.0f); - glVertex3f(0.0f, -alpha, 1.0f); + + glNormal3f(0.0f, 1.0f, 0.0f); + glVertex3f(0.0f, alpha, 0.0f); + glVertex3f(0.0f, alpha, 1.0f); + glVertex3f(1.0f, alpha, 1.0f); + glVertex3f(1.0f, alpha, 0.0f); glNormal3f(0.0f, 0.0f, 1.0f); glVertex3f(0.0f, -alpha, 1.0f); @@ -96,11 +110,12 @@ void unit_cube(int wire) glVertex3f(0.0f, alpha, 1.0f); glVertex3f(0.0f, alpha, 0.0f); - glNormal3f(0.0f, 1.0f, 0.0f); - glVertex3f(0.0f, alpha, 0.0f); - glVertex3f(0.0f, alpha, 1.0f); - glVertex3f(1.0f, alpha, 1.0f); - glVertex3f(1.0f, alpha, 0.0f); + glNormal3f(0.0f, -1.0f, 0.0f); + glVertex3f(0.0f, -alpha, 0.0f); + glVertex3f(1.0f, -alpha, 0.0f); + glVertex3f(1.0f, -alpha, 1.0f); + glVertex3f(0.0f, -alpha, 1.0f); + glEnd(); } diff --git a/hacks/glx/timetunnel.c b/hacks/glx/timetunnel.c new file mode 100644 index 00000000..abf0e132 --- /dev/null +++ b/hacks/glx/timetunnel.c @@ -0,0 +1,1234 @@ +/* timetunnel. Based on dangerball.c, hack by Sean Brennan */ +/* dangerball, Copyright (c) 2001-2004 Jamie Zawinski + * + * 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. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#include +#include /* for log2 */ + +extern XtAppContext app; + +#define PROGCLASS "TimeTunnel" +#define HACK_INIT init_tunnel +#define HACK_DRAW draw_tunnel +#define HACK_RESHAPE reshape_tunnel +#define HACK_HANDLE_EVENT tunnel_handle_event +#define EVENT_MASK PointerMotionMask +#define sws_opts xlockmore_opts + +#define DEF_START "0.00" +#define DEF_DILATE "1.00" +#define DEF_END "27.79" +#define DEF_LOCKLOGO "False" +#define DEF_TUNONLY "False" +#define DEF_REVERSE "False" +#define DEF_FOG "True" +#define DEF_TEXTURE "True" +#define MAX_TEXTURE 10 +#define CYL_LEN 14.0 +#define DIAMOND_LEN 10.0 + +#define DEFAULTS "*delay: 30000 \n" \ + "*count: 30 \n" \ + "*showFPS: False \n" \ + "*timeStart: 0.0 \n" \ + "*timeEnd: 27.79 \n" \ + "*wireframe: False \n" \ + + + +#undef countof +#define countof(x) (sizeof((x))/sizeof((*x))) + +#include "xlockmore.h" +#include "colors.h" +#include "rotator.h" +#include "gltrackball.h" +#include +#include /* for time based animations */ + +static float start, end, dilate; +static Bool do_texture, tunonly, wire, reverse, do_fog; +#ifdef GET_SUED_BY_THE_BBC +static Bool locklogo; +#endif + +static XrmOptionDescRec opts[] = { + {"-texture" , ".texture", XrmoptionNoArg, "true" }, + {"-start" , ".start", XrmoptionSepArg, 0 }, + {"-end" , ".end", XrmoptionSepArg, 0 }, + {"-dilate" , ".dilate", XrmoptionSepArg, 0 }, +#ifdef GET_SUED_BY_THE_BBC + {"-locklogo" , ".locklogo", XrmoptionNoArg, "true" }, +#endif + {"-tunonly" , ".tunonly", XrmoptionNoArg, "true" }, + {"-reverse" , ".reverse", XrmoptionNoArg, "true" }, + {"-fog" , ".fog", XrmoptionNoArg, "false" }, +}; + +static argtype vars[] = { + {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool}, + {&start, "start", "Start", DEF_START, t_Float}, + {&end, "end", "End", DEF_END , t_Float}, + {&dilate, "dilate", "Dilate", DEF_DILATE , t_Float}, +#ifdef GET_SUED_BY_THE_BBC + {&locklogo, "locklogo", "LockLogo", DEF_LOCKLOGO , t_Bool}, +#endif + {&tunonly, "tunonly", "TunnelOnly", DEF_TUNONLY , t_Bool}, + {&reverse, "reverse", "Reverse", DEF_REVERSE , t_Bool}, + {&do_fog, "fog", "Fog", DEF_FOG , t_Bool}, +}; + +ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL}; +#include "xpm-ximage.h" +#include "../../utils/images/logo-180.xpm" +#include "../images/tunnelstar.xpm" +#include "../images/timetunnel0.xpm" +#include "../images/timetunnel1.xpm" +#include "../images/timetunnel2.xpm" +#ifdef GET_SUED_BY_THE_BBC +# include "../images/tardis.xpm" +# include "../images/whologo.xpm" +# include "../images/whohead1.xpm" +/* #include "../images/whohead_psy.xpm" */ +# endif /* GET_SUED_BY_THE_BBC */ + + +#ifdef USE_GL /* whole file */ + +#include + +/* ANIMATION CONTROLS */ +/* an effect is a collection of floating point variables that vary with time. +A knot is a timestamp with an array of floats. State is the current values of the floats. +State is set by linearly interpolating between knots */ +typedef struct { + float *knots, *state; + int numknots, knotwidth; + float direction; +} effect_t; + +typedef struct { + GLXContext *glx_context; + rotator *rot; + trackball_state *trackball; + Bool button_down_p; + + int time_oldusec, time_oldsec; + + int num_texshifts; /* animates tunnels. Not an effect. */ + GLfloat pos, *texshift; + + GLuint texture_binds[MAX_TEXTURE], cyllist, diamondlist; + + float effect_time, effect_maxsecs; /* global time controls */ + float start_time, end_time; + + int num_effects; + effect_t *effects; /* array of all effects */ + +} tunnel_configuration; + +static tunnel_configuration *tconf = NULL; + +/* allocate memory and populate effect with knot data */ +void init_effect(effect_t *e, int numk, int kwidth, + float dir, float *data ) { + int i, j; + + e->numknots = numk; + e->knotwidth = kwidth; + e->direction = dir; + e->knots = calloc(numk * kwidth, sizeof(float)); + e->state = calloc(numk, sizeof(float)); + for ( i = 0 ; i < e->numknots ; i++) + for ( j = 0 ; j < e->knotwidth; j++) + e->knots[i * kwidth + j] = data[i * kwidth + j]; +} + +/* static knot data. each effect is listed and knot data is hard coded. + Knots are linerally interpolated to yield float values, depending on + knot width. knot format is [time, data, data, data...]. + Data can be alpha, zvalue, etc. */ +void init_effects(effect_t *e, int effectnum) +{ + /* effect 1: wall tunnel. percent closed */ + float e1d[6][2] = + {{0.0, 0.055}, + {2.77, 0.055}, + {3.07,1.0}, + {8.08, 1.0}, + {8.08, 0.0}, + {10.0, 0.0}}; + /* effect 2: tardis. distance and alpha */ + float e2d[8][3] = + { {0.0, 0.0 , 0.0}, + {3.44, 0.0 , 0.0}, + {3.36, 5.4 , 0.0}, + {4.24, 3.66, 1.0}, + {6.51, 2.4, 0.94}, + {8.08, 0.75 , 0.0}, + {8.08, 0.0 , 0.0}, + {10.0, 0.0, 0.0}}; + /* effect 3: cylender. alpha */ + float e3d[5][2] = + {{0.0, 0.0}, + {6.41, 0.00}, + {8.08, 1.0}, + {14.81, 1.0}, + {15.65, 0.0}}; + + /* effect 4: fog. color, density, start, end */ + float e4d[9][5] = + {{0.0 , 1.0, 0.45, 3.0, 15.0}, + {6.40, 1.0, 0.45, 3.0, 14.0}, + {8.08, 1.0, 0.95, 1.0, 14.0}, + {15.17, 1.0, 0.95, 1.0, 6.0}, + {15.51, 1.0, 0.95, 3.0, 8.0}, + {23.35, 1.0, 0.95, 3.0, 8.0}, + {24.02, 0.0, 0.95, 2.3, 5.0}, + {26.02, 0.0, 0.95, 2.3, 5.0}, + {27.72, 0.0, 1.00, 0.3, 0.9} + }; + + /* effect 5: logo. dist, alpha */ + float e5d[7][3] = + {{0.0, 0.0, 0.0}, + {16.52, 0.00, 0.0}, + {16.52, 0.80, 0.01}, + {17.18, 1.15, 1.0}, + {22.36, 5.3, 1.0}, + {22.69, 5.7, 0.0}, + {22.69, 0.0, 0.0} + }; + /* effect 6: diamond tunnel. alpha */ + float e6d[3][2] = + {{0.0, 0.00}, + {15.17, 0.00}, + {15.51,1.0}}; + + /* effect 7: tardis cap draw . positive draws cap*/ + float e7d[3][2] = + {{0.0, -1.00}, + {4.24, -1.00}, + {4.24, 1.00}}; + + /* effect 8: star/asterisk: alpha */ + float e8d[5][2] = + {{0.0, .00}, + {10.77, .00}, + {11.48, 1.00}, + {15.35, 1.00}, + {16.12, 0.00}}; + + /* effect 9: whohead 1 alpha */ + float e9d[5][2] = + {{0.0, .00}, + {13.35, .00}, + {14.48, 1.00}, + {15.17, 1.00}, + {15.97, 0.00}}; + /* {14.87, 1.00}, + {15.17, 0.00}}; */ + + /* effect 10: whohead-brite alpha */ + float e10d[5][2] = + {{0.0, .00}, + {11.34, .00}, + {12.34, .20}, + {13.35, 0.60}, + {14.48, 0.00}}; + /* {13.95, 0.00}}; */ + + /* effect 11: whohead-psy alpha */ + float e11d[5][2] = + {{0.0, .00}, + {14.87, .00}, + {15.17, 1.00}, + {15.91, 0.00}, + {16.12, 0.00}}; + + /* effect 12: whohead-silhouette pos-z, alpha */ + float e12d[6][3] = + {{0.0, 1.0, .00}, + {15.07, 1.0, 0.00}, + {15.07, 1.0, 1.00}, + {16.01, 1.0, 1.00}, + {16.78, 0.5, 1.00}, + {16.78, 0.1, 0.00} }; + + /* effect 1: wall tunnel */ + if (effectnum == 1) + init_effect(e, 6, 2, -0.2, (float *) e1d); + + /* effect 2: tardisl */ + if (effectnum == 2) + init_effect(e, 8, 3, 1.0, (float *) e2d); + + /* effect 3: cylender tunnel */ + if (effectnum == 3) + init_effect(e, 5, 2, 0.889 , (float *) e3d); + + /* effect 4: fog color */ + if (effectnum == 4) + init_effect(e, 9, 5, 1.0, (float *) e4d); + /* effect 5: logo distance, alpha*/ + if (effectnum == 5) + init_effect(e, 7, 3, 1.0, (float *) e5d); + /* effect 6: diamond tunnel, alpha*/ + if (effectnum == 6) + init_effect(e, 3, 2, 0.24 , (float *) e6d); + + /* effect 7: cap wall tunnel*/ + if (effectnum == 7) + init_effect(e, 3, 2, 1.0, (float *) e7d); + + /* effect 8: asterisk */ + if (effectnum == 8) + init_effect(e, 5, 2, 1.0, (float *) e8d); + + /* effect 9, 10, 11, 12: whoheads */ + if (effectnum == 9 ) + init_effect(e, 5, 2, 1.0, (float *) e9d); + if (effectnum == 10 ) + init_effect(e, 5, 2, 1.0, (float *) e10d); + if (effectnum == 11 ) + init_effect(e, 5, 2, 1.0, (float *) e11d); + if (effectnum == 12 ) + init_effect(e, 6, 3, 1.0, (float *) e12d); +} + + +/* set fog parameters, controlled by effect */ +void update_fog(float color, float density, float start, float end) { + GLfloat col[4]; + + col[0] = col[1] = col[2] = color; + col[3] = 1.0; + + glFogi(GL_FOG_MODE, GL_LINEAR); + glFogfv(GL_FOG_COLOR, col); + glFogf(GL_FOG_DENSITY, density); + glFogf(GL_FOG_START, start); + glFogf(GL_FOG_END, end); +} + +/* set effect's floating point data values by linearally interpolating +between two knots whose times bound the current time: eff_time */ + +void update_knots(effect_t *e, float eff_time) { + int i, j; + float timedelta, lowknot, highknot, *curknot, *nextknot; + + for ( i = 0 ; i < e->numknots ; i++) + if (e->knots[i * e->knotwidth] <= eff_time) { + if ( i < e->numknots - 1) + nextknot = e->knots + (i + 1) * e->knotwidth; + else + /*repeat last knot to carry knot data forward*/ + nextknot = e->knots + (i) * e->knotwidth; + curknot = e->knots + i * e->knotwidth; + if (*nextknot - *curknot <= 0.0) timedelta = 1.0; + else + timedelta = (eff_time-*curknot)/(*nextknot-*curknot); + if (timedelta > 1.0) timedelta = 1.0; + for (j = 1 ; j < e->knotwidth ; j++) { + highknot = (float) *(nextknot + j); + lowknot = (float) *(curknot + j); + e->state[j - 1 ] = lowknot+(highknot-lowknot)*timedelta; + } + } + +} + + +/* Window management, etc + */ +void +reshape_tunnel (ModeInfo *mi, int width, int height) +{ + GLfloat h = (GLfloat) height / (GLfloat) width; + + glViewport (0, 0, (GLint) width, (GLint) height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective (90.0, 1/h, 0.2, 50.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + gluLookAt( 0.0, 0.0, 0.3, + 0.0, 0.0, 1.0, + 0.0, 1.0, 0.0); + + glClear(GL_COLOR_BUFFER_BIT); +} + + + + +Bool +tunnel_handle_event (ModeInfo *mi, XEvent *event) +{ + tunnel_configuration *tc = &tconf[MI_SCREEN(mi)]; + + if (event->xany.type == ButtonPress && + event->xbutton.button == Button1) + { + tc->button_down_p = True; + gltrackball_start (tc->trackball, + event->xbutton.x, event->xbutton.y, + MI_WIDTH (mi), MI_HEIGHT (mi)); + return True; + } + else if (event->xany.type == ButtonRelease && + event->xbutton.button == Button1) + { + tc->button_down_p = False; + return True; + } + else if (event->xany.type == ButtonPress && + (event->xbutton.button == Button4 || + event->xbutton.button == Button5)) + { + gltrackball_mousewheel (tc->trackball, event->xbutton.button, 10, + !!event->xbutton.state); + return True; + } + else if (event->xany.type == MotionNotify && + tc->button_down_p) + { + gltrackball_track (tc->trackball, + event->xmotion.x, event->xmotion.y, + MI_WIDTH (mi), MI_HEIGHT (mi)); + return True; + } + + return False; +} + +void setTexParams(void) +{ + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); +} + +void update_animation(tunnel_configuration *tc) { + + /* time based, of course*/ + /* shift texture based on elapsed time since previous call*/ + static struct timeval tv; + static struct timezone tz; + static int elapsed_usecs, elapsed_secs, i; + float computed_timeshift; + + /* get new animation time */ + gettimeofday(&tv, &tz); + elapsed_secs = tv.tv_sec - tc->time_oldsec; + elapsed_usecs = tv.tv_usec - tc->time_oldusec; + /* store current time */ + tc->time_oldsec = tv.tv_sec ; + tc->time_oldusec = tv.tv_usec; + /* elaped time. computed timeshift is tenths of a second */ + computed_timeshift = (float) (elapsed_secs * 1000000. + elapsed_usecs)/ + 100000.0; + + /* calibrate effect time to lie between start and end times */ + /* loop if time exceeds end time */ + if (reverse) + tc->effect_time -= computed_timeshift / 10.0 * dilate; + else + tc->effect_time += computed_timeshift / 10.0 * dilate; + if ( tc->effect_time >= tc->end_time) + tc->effect_time = tc->start_time; + if ( tc->effect_time < tc->start_time) + tc->effect_time = tc->end_time;; + + /* move texture shifters in effect's direction, e.g. tardis + tunnel moves backward, effect 1's direction */ + if (reverse) { + tc->texshift[0] -= tc->effects[1].direction * computed_timeshift/ 10.0; + tc->texshift[1] -= tc->effects[3].direction * computed_timeshift/ 10.0; + tc->texshift[2] -= tc->effects[6].direction * computed_timeshift/ 10.0; + + } else { + tc->texshift[0] += tc->effects[1].direction * computed_timeshift/ 10.0; + tc->texshift[1] += tc->effects[3].direction * computed_timeshift/ 10.0; + tc->texshift[2] += tc->effects[6].direction * computed_timeshift/ 10.0; + } + + /* loop texture shifters if necessary */ + for ( i = 0 ; i < tc->num_texshifts; i++) { + if (tc->texshift[i] > 1.0) + tc->texshift[i] -= (int) tc->texshift[i]; + if (tc->texshift[i]< -1.0) + tc->texshift[i] -= (int) tc->texshift[i]; + } + + /* update effect data with current time. Uses linear interpolation */ + for ( i = 1 ; i <= tc->num_effects ; i++) + update_knots(&tc->effects[i], tc->effect_time); + +} /*update_animation*/ + +/* draw a textured(tex) quad at a certain depth (z), and certain alpha (alpha), +with aspect ratio (aspect), and blending mode (blend_mode) of either adding +or subtracting. if alpha is zero or less, nothing happens */ +void draw_sign(ModeInfo *mi, tunnel_configuration *tc, float z, float alpha, float aspect, + GLuint tex, int blend_mode) +{ + + if (alpha > 0.0) { + mi->polygon_count ++; + /* glEnable(GL_BLEND); */ + glBlendColor(0.0, 0.0, 0.0, alpha); + /*glBlendColor(0.0, 0.0, 0.0, 0.0); */ + if (blend_mode == 1) { + glBlendFunc(GL_CONSTANT_ALPHA, + GL_ONE); + glBlendEquation(GL_FUNC_REVERSE_SUBTRACT); + } else if (blend_mode == 2) { + glBlendFunc(GL_CONSTANT_ALPHA, + GL_ONE); + glBlendEquation(GL_FUNC_ADD); + } else { + glBlendFunc(GL_CONSTANT_ALPHA, + GL_ONE_MINUS_CONSTANT_ALPHA); + glBlendEquation(GL_FUNC_ADD); + } /* blend mode switch */ + +#ifdef HAVE_GLBINDTEXTURE + if (do_texture) + glBindTexture(GL_TEXTURE_2D, tc->texture_binds[tex]); +#endif + glBegin(GL_QUADS); + glTexCoord2f(1.0, 0.0); + glVertex3f(-1.0 , -1.0 * aspect , z); + glTexCoord2f(1.0, 1.0); + glVertex3f(-1.0 , 1.0 * aspect , z); + glTexCoord2f(0.0, 1.0); + glVertex3f(1.0 , 1.0 * aspect , z); + glTexCoord2f(0.0, 0.0); + glVertex3f(1.0 , -1.0 * aspect , z); + glEnd(); + if (blend_mode != 0) { + glBlendFunc(GL_CONSTANT_ALPHA, + GL_ONE_MINUS_CONSTANT_ALPHA); + glBlendEquation(GL_FUNC_ADD); + } + /* glDisable(GL_BLEND); */ + + } +} /* draw sign */ + + +/* draw a time tunnel. used for both cylender and diamond tunnels. + uses texture shifter (indexed by shiftnum) to simulate motion. + tunnel does not move, and is acutally a display list. if alpha = 0, skip */ +void draw_cyl(ModeInfo *mi, tunnel_configuration *tc, float alpha, int texnum, int listnum, int shiftnum) +{ + if (alpha > 0.0) { + if (listnum == tc->diamondlist) + mi->polygon_count += 4; + if (listnum == tc->cyllist) + mi->polygon_count += 30; + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glTranslatef(tc->texshift[shiftnum], 0.0, 0.0); + glMatrixMode(GL_MODELVIEW); + /* glEnable(GL_BLEND); */ + glBlendColor(0.0, 0.0, 0.0, alpha); + glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA); + +#ifdef HAVE_GLBINDTEXTURE + if (do_texture) + glBindTexture(GL_TEXTURE_2D, tc->texture_binds[texnum]); +#endif + glCallList(listnum); + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + /* glDisable(GL_BLEND); */ + } +} + + +/* make tardis type tunnel. Starts as walls and then +grows to outline of tardis. percent is how complete +tardis outline is. cap is to draw cap for nice fog effects */ + +void make_wall_tunnel(ModeInfo *mi, tunnel_configuration *tc, float percent, float cap) +{ + /* tardis is about 2x1, so wrap tex around, starting at the base*/ + /* tex coords are: + + _tl__tr_ + | | +l| |r + | | + -bl__br_ + that's br=bottom right, etc. ttr is top-top-right */ + + float half_floor= 0.08333333333333333, + full_wall = 0.33333333333333333; + float br1, + r0 , r1 , + tr0, tr1, + tl0, tl1, + l0 , l1 , + bl0, depth=0.3, zdepth=15.0; + /* zdepth is how far back tunnel goes */ + /* depth is tex coord scale. low number = fast texture shifting */ + + float textop, texbot; + float height; + + br1 = half_floor; + r0 = br1 ; + r1 = r0 + full_wall; + tr0 = r1; + tr1 = r1 + half_floor; + tl0 = tr1; + tl1 = tl0 + half_floor; + l0 = tr1; + l1 = l0 + full_wall; + bl0 = l1; + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glRotatef(90.0, 0.0, 0.0, 1.0); + glTranslatef(tc->texshift[0], 0.0, 0.0); + glMatrixMode(GL_MODELVIEW); + +#ifdef HAVE_GLBINDTEXTURE + if (do_texture) + glBindTexture(GL_TEXTURE_2D, tc->texture_binds[0]); +#endif + glColor3f(1.0, 1.0, 0.0); + if (cap > 0.0 && percent > 0.0 && ! tunonly && do_fog) { + mi->polygon_count += 6; + glBegin(GL_TRIANGLE_FAN); + glVertex3f(0.0, 0.0, zdepth); + glVertex3f(-1.0, -2.0, zdepth); + glVertex3f(1.0, -2.0, zdepth); + glVertex3f(1.0, 2.0, zdepth); + glVertex3f(0.2, 2.0, zdepth); + glVertex3f(0.2, 2.2, zdepth); + glVertex3f(-0.2, 2.2, zdepth); + glVertex3f(-0.2, 2.0, zdepth); + glVertex3f(-1.0, 2.0, zdepth); + glVertex3f(-1.0, -2.0, zdepth); + glEnd(); + } + if (percent > ( full_wall * 2.0)) { + glBegin(GL_QUADS); + + height = (percent - full_wall * 2.0) /( 1.0 - full_wall * 2.0); + if (height > 1.0) height = 1.0; + + + if ( height > 0.8) { + mi->polygon_count += 2; + if ( height > 0.90) { + mi->polygon_count += 2; + /* TTTR */ + texbot = tr0; + textop = tr0 + half_floor * height; + glTexCoord2f(0.0, texbot); + glVertex3f(0.2, 2.2, 0.0); + + glTexCoord2f(0.0, textop); + glVertex3f(2.0 - height * 2.0, 2.2, 0.0); + + glTexCoord2f(depth, textop); + glVertex3f(2.0 - height * 2.0, 2.2, zdepth); + + glTexCoord2f(depth, texbot); + glVertex3f(0.2, 2.2, zdepth); + + /* TTTL */ + texbot = tl1 - half_floor * height; + textop = tl1; + glTexCoord2f(0.0, texbot); + glVertex3f(-2.0 + height * 2.0, 2.2, 0.0); + + glTexCoord2f(0.0, textop); + glVertex3f(-0.2, 2.2, 0.0); + + glTexCoord2f(depth, textop); + glVertex3f(-0.2, 2.2, zdepth); + + glTexCoord2f(depth, texbot); + glVertex3f(-2.0 + height * 2.0, 2.2, zdepth); + } + if (height > 0.90) height = 0.90; + + /* TTR */ + texbot = tr0; + textop = tr0 + half_floor * height; + glTexCoord2f(0.0, texbot); + glVertex3f(0.2, 2.0, 0.0); + + glTexCoord2f(0.0, textop); + glVertex3f(0.2, 0.4 + height * 2.0, 0.0); + + glTexCoord2f(depth, textop); + glVertex3f(0.2, 0.4 + height * 2.0, zdepth); + + glTexCoord2f(depth, texbot); + glVertex3f(0.2, 2.0, zdepth); + + /* TTL */ + texbot = tl1 - half_floor * height; + textop = tl1; + glTexCoord2f(0.0, texbot); + /*glVertex3f(-.2, 2.0 + (0.9 - height) * 2.0, 0.0); */ + glVertex3f(-.2, 0.4 + height * 2.0, 0.0); + + glTexCoord2f(0.0, textop); + glVertex3f(-.2, 2.0, 0.0); + + glTexCoord2f(depth, textop); + glVertex3f(-.2, 2.0, zdepth); + + glTexCoord2f(depth, texbot); + glVertex3f(-.2, 0.4 + height * 2.0, zdepth); + } + + height = (percent - full_wall * 2.0) /( 1.0 - full_wall * 2.0); + if (height > 0.8) height = 0.8; + + + mi->polygon_count += 2; + /* TR */ + texbot = tr0; + textop = tr0 + half_floor * height; + glTexCoord2f(0.0, texbot); + glVertex3f(1.0, 2.0, 0.0); + + glTexCoord2f(0.0, textop); + glVertex3f(1.0 - height, 2.0, 0.0); + + glTexCoord2f(depth, textop); + glVertex3f(1.0 - height, 2.0, zdepth); + + glTexCoord2f(depth, texbot); + glVertex3f(1.0, 2.0, zdepth); + + /* TL */ + texbot = tl1 - half_floor * height; + textop = tl1; + glTexCoord2f(0.0, texbot); + glVertex3f(-1.0 + height, 2.0, 0.0); + + glTexCoord2f(0.0, textop); + glVertex3f(-1.0, 2.0, 0.0); + + glTexCoord2f(depth, textop); + glVertex3f(-1.0, 2.0, zdepth); + + glTexCoord2f(depth, texbot); + glVertex3f(-1.0 + height, 2.0, zdepth); + + height = (percent - full_wall * 2.0) /( 1.0 - full_wall * 2.0); + + if (height > 1.0) height = 1.0; + + + mi->polygon_count += 2; + /* BR */ + texbot = tr0; + textop = tr0 + half_floor * height; + glTexCoord2f(0.0, texbot); + glVertex3f(1.0, -2.0, 0.0); + + glTexCoord2f(0.0, textop); + glVertex3f(1.0 - height, -2.0, 0.0); + + glTexCoord2f(depth, textop); + glVertex3f(1.0 - height, -2.0, zdepth); + + glTexCoord2f(depth, texbot); + glVertex3f(1.0, -2.0, zdepth); + + /* BL */ + texbot = tl1 - half_floor * height; + textop = tl1; + glTexCoord2f(0.0, texbot); + glVertex3f(-1.0 + height, -2.0, 0.0); + + glTexCoord2f(0.0, textop); + glVertex3f(-1.0, -2.0, 0.0); + + glTexCoord2f(depth, textop); + glVertex3f(-1.0, -2.0, zdepth); + + glTexCoord2f(depth, texbot); + glVertex3f(-1.0 + height, -2.0, zdepth); + + + glEnd(); + } + + if (percent > 0.0) { + mi->polygon_count += 2; + glBegin(GL_QUADS); + height = percent / ( full_wall * 2.0); + if (height > 1.0) height = 1.0; + textop = (l0 + l1) / 2.0 - full_wall * 0.5 * height; + texbot = (l0 + l1) / 2.0 + full_wall * 0.5 * height; + + glTexCoord2f(0.0, textop); + glVertex3f(-1.0, height * 2, 0.0); + + glTexCoord2f(0.0, texbot); + glVertex3f(-1.0, -height * 2, 0.0); + + glTexCoord2f(depth, texbot); + glVertex3f(-1.0, -height * 2, zdepth); + + glTexCoord2f(depth, textop); + glVertex3f(-1.0, height * 2, zdepth); + + textop = (r0 + r1) / 2.0 - full_wall * 0.5 * height; + texbot = (r0 + r1) / 2.0 + full_wall * 0.5 * height; + + glTexCoord2f(0.0, texbot); + glVertex3f(1.0, height * 2, 0.0); + + glTexCoord2f(0.0, textop); + glVertex3f(1.0, -height * 2, 0.0); + + glTexCoord2f(depth, textop); + glVertex3f(1.0, -height * 2, zdepth); + + glTexCoord2f(depth, texbot); + glVertex3f(1.0, height * 2, zdepth); + glEnd(); + } + + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); +} /* make_wall_tunnel */ + +/* wraps an int to between min and max. + Kind of like the remainder when devided by (max - min). + Used to create torus mapping on square array */ +int wrapVal(int val, int min, int max) +{ + int ret; + + ret = val; + if (val >= max) + ret = min + (val - max ) % (max - min); + if (val < min) + ret = max - (min - val) % (max - min); + return(ret); +} + +/*=================== Load Texture =========================================*/ +/* ripped from atunnel.c, Copyright (c) E. Lassauge, 2003-2004. */ +/* modified like so by Sean Brennan: + take texture object for glbind + removed xlock stuff + Added filters: + blur color / alpha channel [3x3 box filter, done [blur] times + anegative : create b/w image from zero alpha. zero alpha gets bw_color, + nonzero alpha gets 1.0 - bwcolor, then alpha flipped to 1-alpha. + +*/ + +float mylog2(float x) { return ( log(x) / log(2));} + +static void LoadTexture(ModeInfo * mi, char **fn, unsigned int texbind, int blur, float bw_color, Bool anegative, Bool onealpha) +{ + /* looping and temporary array index variables */ + int ix, iy, bx, by, indx, indy, boxsize, cchan, tmpidx, dtaidx; + + float boxdiv, tmpfa, blursum ; + unsigned char *tmpbuf, tmpa; + Bool rescale; + + + XImage *teximage; /* Texture data */ + + rescale = FALSE; + + boxsize = 2; + boxdiv = 1.0 / ( boxsize * 2.0 + 1.0) / ( boxsize * 2.0 + 1.0); + + if ((teximage = xpm_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi), + MI_COLORMAP(mi), fn)) == None) { + fprintf(stderr, "%s: error reading the texture.\n", progname); + glDeleteTextures(1, &texbind); + do_texture = False; + exit(0); + } + + /* check if image is 2^kumquat, where kumquat is an integer between 1 and 10. Recale to + nearest power of 2. */ + tmpfa = mylog2((float) teximage->width); + bx = 2 << (int) (tmpfa -1); + if (bx != teximage->width) { + rescale = TRUE; + if ((tmpfa - (int) tmpfa) > 0.5849) + bx = bx * 2; + } + tmpfa = mylog2((float) teximage->height); + by = 2 << (int) (tmpfa - 1); + if (by != teximage->height) { + rescale = TRUE; + if ((tmpfa - (int) tmpfa) > 0.5849) + by = by * 2; + } + + if (rescale) { + tmpbuf = calloc(bx * by * 4, sizeof(unsigned char)); + if (gluScaleImage(GL_RGBA, teximage->width, teximage->height, GL_UNSIGNED_BYTE, teximage->data, + bx, by, GL_UNSIGNED_BYTE, tmpbuf)) + check_gl_error("scale image"); + + free(teximage->data); + teximage->data = (char *) tmpbuf; + teximage->width = bx; + teximage->height= by; + } + /* end rescale code */ + + if (anegative ) { + for (ix = 0 ; ix < teximage->height * teximage->width; ix++) + { + if (!teximage->data[ ix * 4 + 3]) { + teximage->data[ ix * 4 + 3] = (unsigned char) 0xff; + tmpa = (unsigned char) (bw_color * 0xff); + } else { + if (onealpha) + teximage->data[ ix * 4 + 3] = (unsigned char) 0xff; + else + teximage->data[ ix * 4 + 3] = (unsigned char) 0xff - + teximage->data[ ix * 4 + 3]; + tmpa = (unsigned char) ((1.0 - bw_color) * 0xff); + } + /* make texture uniform b/w color */ + teximage->data[ ix * 4 + 0] = + (unsigned char) ( tmpa); + teximage->data[ ix * 4 + 1] = + (unsigned char) ( tmpa); + teximage->data[ ix * 4 + 2] = + (unsigned char) ( tmpa); + /* negate alpha */ + } + } + + if (blur > 0) { + if (! anegative ) /* anegative alread b/w's the whole image */ + for (ix = 0 ; ix < teximage->height * teximage->width; ix++) + if (!teximage->data[ ix * 4 + 3]) + { + teximage->data[ ix * 4 + 0] = + (unsigned char) ( 255.0 * bw_color); + teximage->data[ ix * 4 + 1] = + (unsigned char) ( 255.0 * bw_color); + teximage->data[ ix * 4 + 2] = + (unsigned char) ( 255.0 * bw_color); + } + ; + tmpbuf = calloc(teximage->height * teximage->width * 4, sizeof(unsigned char) ) ; + while (blur--) { + /* zero out tmp alpha buffer */ + for (iy = 0 ; iy height * teximage->width * 4 ; iy++) + tmpbuf[iy] = 0; + for (cchan = 0; cchan < 4 ; cchan++) { + for (iy = 0 ; iy < teximage->height ; iy++) { + for (ix = 0 ; ix < teximage->width ; ix++) { + dtaidx = (teximage->width * iy + ix) * 4; + tmpa = teximage->data[dtaidx + cchan]; + tmpfa = (float) tmpa * boxdiv; + /* box filter */ + blursum = 0.0; + for (by = -boxsize ; by <= boxsize; by++) { + for (bx = -boxsize ; bx <= boxsize; bx++) { + indx = wrapVal(ix + bx, 0, teximage->width); + indy = wrapVal(iy + by, 0, teximage->height); + tmpidx = (teximage->width * indy + indx) * 4; + blursum = tmpfa; + tmpbuf[tmpidx + cchan] += (unsigned char) blursum; + } /* for bx */ + } /* for by */ + } /* for ix */ + } /* for iy */ + } /* for cchan */ + /* copy back buffer */ + for (ix = 0 ; ix < teximage->height * teximage->width * 4; ix++) + teximage->data[ix] = tmpbuf[ix]; + } /*while blur */ + free(tmpbuf); /*tidy*/ + } /* if blur */ + + + + + clear_gl_error(); +#ifdef HAVE_GLBINDTEXTURE + glBindTexture(GL_TEXTURE_2D, texbind); +#endif + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, teximage->width, teximage->height, + 0, GL_RGBA, GL_UNSIGNED_BYTE, teximage->data); + check_gl_error("texture"); + setTexParams(); + XDestroyImage(teximage); +} + +/* creates cylender for time tunnel. sides, zmin, zmax, rad(ius) obvious. + stretch scales texture coords; makes tunnel go slower the larger it is. + not drawn, but put into display list. */ +void makecyl(int sides, float zmin, float zmax, float rad, float stretch) { + int i; + float theta; + + /* cap */ + if (do_fog) { + glBegin(GL_TRIANGLE_FAN); + glTexCoord2f(1.0, 0.0); + glVertex3f(0.0 , 0.0 , zmax); + for (i = 0 ; i <= sides; i++) { + theta = 2.0 * M_PI * ((float) i / (float) sides); + glVertex3f(cos(theta) * rad, sin(theta) * rad, zmax); + } + glVertex3f(cos(0.0) * rad, sin(0.0) * rad, zmax); + glEnd(); + } + + glBegin(GL_QUAD_STRIP); + for (i = 0 ; i <= sides; i++) + { + if ( i != sides) { + theta = 2.0 * M_PI * ((float) i / (float) sides); + glTexCoord2f(0.0, 1.0 * (float) i / (float) sides); + glVertex3f(cos(theta) * rad, sin(theta) * rad, zmin); + glTexCoord2f(stretch, 1.0 * (float) i / (float) sides); + glVertex3f(cos(theta) * rad, sin(theta) * rad, zmax); + } else { + theta = 0.0; + glTexCoord2f(0.0, 1.0); + glVertex3f(cos(theta) * rad, sin(theta) * rad, zmin); + glTexCoord2f(stretch, 1.0); + glVertex3f(cos(theta) * rad, sin(theta) * rad, zmax); + } + } + glEnd(); +} + +void +init_tunnel (ModeInfo *mi) +{ + int i; + + tunnel_configuration *tc; + + wire = MI_IS_WIREFRAME(mi); + + if (!tconf) { + tconf = (tunnel_configuration *) + calloc (MI_NUM_SCREENS(mi), sizeof (tunnel_configuration)); + if (!tconf) { + fprintf(stderr, "%s: out of memory\n", progname); + exit(1); + } + + tc = &tconf[MI_SCREEN(mi)]; + } + + tc = &tconf[MI_SCREEN(mi)]; + + tc->glx_context = init_GL(mi); + + tc->cyllist = glGenLists(1); + tc->diamondlist = glGenLists(1); + tc->num_effects = 12; + tc->num_texshifts = 3; + tc->effect_time = 0.0; + tc->effect_maxsecs = 30.00; + /* check bounds on cmd line opts */ + if (start > tc->effect_maxsecs) start = tc->effect_maxsecs; + if (end > tc->effect_maxsecs) end = tc->effect_maxsecs; + if (start < tc->effect_time) start = tc->effect_time; + if (end < tc->effect_time) end = tc->effect_time; + + /* set loop times, in seconds */ + tc->start_time = start; + tc->end_time = end; + + /* reset animation knots, effect 0 not defined. */ + tc->effects = malloc(sizeof(effect_t) * ( tc->num_effects + 1)); + for ( i = 1; i <= tc->num_effects ; i++) + init_effects(&tc->effects[i], i); + + if (wire) { + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + do_texture = FALSE; + } + + if (do_texture) + { + glGenTextures(MAX_TEXTURE, tc->texture_binds); + + /*LoadTexture(*mi, **fn, texbind, bluralpha, bw_color, anegative, onealpha)*/ + LoadTexture(mi, timetunnel0_xpm, tc->texture_binds[0], 0, 0.0, FALSE, FALSE); + LoadTexture(mi, timetunnel1_xpm, tc->texture_binds[2], 0, 0.0, FALSE, FALSE); + LoadTexture(mi, timetunnel2_xpm, tc->texture_binds[5], 0, 0.0, FALSE, FALSE); + LoadTexture(mi, tunnelstar_xpm, tc->texture_binds[4], 0, 0.0, FALSE, FALSE); +# ifdef GET_SUED_BY_THE_BBC + if (locklogo) { +# endif /* GET_SUED_BY_THE_BBC */ + LoadTexture(mi, (char **) logo_180_xpm, tc->texture_binds[3], 0,0.0, FALSE, FALSE); + tc->texture_binds[1] = tc->texture_binds[3]; + tc->texture_binds[6] = tc->texture_binds[3]; + tc->texture_binds[8] = tc->texture_binds[3]; + /* negative */ + LoadTexture(mi, (char **) logo_180_xpm, tc->texture_binds[9], 2,1.0, TRUE, TRUE); +# ifdef GET_SUED_BY_THE_BBC + } else { + LoadTexture(mi, whologo_xpm, tc->texture_binds[3], 0,0.0, FALSE, FALSE); + LoadTexture(mi, tardis_xpm, tc->texture_binds[1], 0, 0.0 ,FALSE, FALSE); + LoadTexture(mi, whohead1_xpm, tc->texture_binds[6], 0, 1.0, FALSE, FALSE); + /* LoadTexture(mi, whohead_psy_xpm, tc->texture_binds[8], 1, 0.7, FALSE, FALSE); */ + /* negative */ + LoadTexture(mi, whohead1_xpm, tc->texture_binds[9], 2, 1.0, TRUE, TRUE); + } +# endif /* GET_SUED_BY_THE_BBC */ + glEnable(GL_TEXTURE_2D); + check_gl_error("tex"); + } + + reshape_tunnel (mi, MI_WIDTH(mi), MI_HEIGHT(mi)); + + glDisable(GL_DEPTH_TEST); /* who needs it? ;-) */ + + if (do_fog) + glEnable(GL_FOG); + + if (!wire) + { + glEnable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, 0.5); + } + + tc->trackball = gltrackball_init (); + + + tc->texshift = calloc(tc->num_texshifts, sizeof(GLfloat)); + for ( i = 0 ; i < tc->num_texshifts; i++) + tc->texshift[i] = 0.0; + + glNewList(tc->cyllist, GL_COMPILE); + makecyl(30, -0.1, CYL_LEN, 1., 10. / 40.0 * CYL_LEN); + /*makecyl(30, -0.5, DIAMOND_LEN, 1., 4. / 40 * DIAMOND_LEN); */ + glEndList(); + + glNewList(tc->diamondlist, GL_COMPILE); + makecyl(4, -0.5, DIAMOND_LEN, 1., 4. / 40 * DIAMOND_LEN); + glEndList(); +} + + +void +draw_tunnel (ModeInfo *mi) +{ + tunnel_configuration *tc = &tconf[MI_SCREEN(mi)]; + Display *dpy = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + + + if (!tc->glx_context) + return; + + glShadeModel(GL_SMOOTH); + + glEnable(GL_NORMALIZE); + /* glEnable(GL_CULL_FACE); */ + + glClear(GL_COLOR_BUFFER_BIT ); + + update_animation(tc); + + + glPushMatrix (); + + glRotatef(180., 0., 1., 0.); + gltrackball_rotate (tc->trackball); + glRotatef(180., 0., 1., 0.); + + + + mi->polygon_count = 0; + + update_fog(tc->effects[4].state[0], /*color*/ + tc->effects[4].state[1], /*density*/ + tc->effects[4].state[2], /*start*/ + tc->effects[4].state[3]); /*end*/ + + /* --- begin composite image assembly --- */ + + /* head mask and draw diamond tunnel */ + + glEnable(GL_BLEND); + draw_cyl(mi, tc, tc->effects[6].state[0], 5, tc->diamondlist, 2); + if (! tunonly) + draw_sign(mi, tc,tc->effects[12].state[0], tc->effects[12].state[1], 1.0 / 1.33, 9, 1); + glDisable(GL_BLEND); + /* then tardis tunnel */ + make_wall_tunnel(mi, tc, tc->effects[1].state[0], tc->effects[7].state[0]); + + /* then cylender tunnel */ + glEnable(GL_BLEND); + draw_cyl(mi, tc, tc->effects[3].state[0], 2, tc->cyllist, 1); + + /*void draw_sign(mi, tc,z,alpha,aspect,tex,blendmode)*/ + /* tardis */ + if (! tunonly) + draw_sign(mi, tc, tc->effects[2].state[0], tc->effects[2].state[1], 2.0, 1, 0); + /* logo */ + if (! tunonly) + draw_sign(mi, tc, tc->effects[5].state[0], tc->effects[5].state[1], 1.0, 3, 0); + /*who head brite*/ + if (! tunonly) + draw_sign(mi, tc,1.0, tc->effects[10].state[0], 1.0 / 1.33, 6, 2); + /*who head psychadelic REMOVED*/ + /* draw_sign(mi, tc,1.0, tc->effects[11].state[0], 1.0 / 1.33, 8, 0); */ + + /* star */ + /* draw_sign(mi, tc, tc->effects[8].state[0]tc->effects[8].state[0], 1.0 , 1.0, 4, 1); */ + draw_sign(mi, tc, tc->effects[8].state[0], tc->effects[8].state[0], 1.0, 4, 1); + + /* normal head */ + if (! tunonly) + draw_sign(mi, tc,1.0, tc->effects[9].state[0], 1.0 / 1.33, 6, 0); + + /* --- end composite image assembly --- */ + + + glPopMatrix (); + + if (mi->fps_p) do_fps (mi); + glFinish(); + + check_gl_error("drawing done, calling swap buffers"); + glXSwapBuffers(dpy, window); +} + +#endif /* USE_GL */ diff --git a/hacks/glx/timetunnel.man b/hacks/glx/timetunnel.man new file mode 100644 index 00000000..76aaeea5 --- /dev/null +++ b/hacks/glx/timetunnel.man @@ -0,0 +1,81 @@ +.TH XScreenSaver 1 "" "X Version 11" +.SH NAME +timetunnel - Plasma tunnels fade in and out +.SH SYNOPSIS +.B timetunnel +[\-display \fIhost:display.screen\fP] +[\-visual \fIvisual\fP] +[\-window] +[\-root] +[\-start \fInumber\fP] +[\-end \fInumber\fP] +[\-dialate \fInumber\fP] +[\-tunonly] +[\-reverse] +[\-fog] +[\-no-texture] +[\-wireframe] +[\-fps] +.SH DESCRIPTION +Draws an animation similar to the opening and closing effects on the +Dr. Who television show. +.SH OPTIONS +.TP 8 +.B \-visual \fIvisual\fP +Specify which visual to use. Legal values are the name of a visual class, +or the id number (decimal or hex) of a specific visual. +.TP 8 +.B \-window +Draw on a newly-created window. This is the default. +.TP 8 +.B \-root +Draw on the root window. +.TP 8 +.B \-start \fInumber\fP +Start time of loop, 0.0 - 30.00. Default 0.0. May be identical to end time. +.TP 8 +.B \-end \fInumber\fP +End time of loop, 0.0 - 30.00. Default 27.79. May be identical to start time. +.TP 8 +.B \-dialate \fInumber\fP +Scale time to speed or slow simulation. Numbers less than one slow it down. +.TP 8 +.B \-tunonly +Show only tunnels, no logos, etc. +.TP 8 +.B \-reverse +Play in reverse, including tunnels. +.TP 8 +.B \-fog +Turn off fog. +.TP 8 +.B \-no-texture +Turn off textures. +.TP 8 +.B \-wireframe +Show as wire frame +.TP 8 +.B \-fps | \-no-fps +Whether to show a frames-per-second display at the bottom of the screen. +.SH ENVIRONMENT +.PP +.TP 8 +.B DISPLAY +to get the default host and display number. +.TP 8 +.B XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 2005 by Sean Brennan. 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. No representations are made about the +suitability of this software for any purpose. It is provided "as is" without +express or implied warranty. +.SH AUTHOR +Sean Brennan diff --git a/hacks/glx/xpm-ximage.c b/hacks/glx/xpm-ximage.c index 7d67728b..c32250a4 100644 --- a/hacks/glx/xpm-ximage.c +++ b/hacks/glx/xpm-ximage.c @@ -23,6 +23,15 @@ extern char *progname; +static Bool +bigendian (void) +{ + union { int i; char c[sizeof(int)]; } u; + u.i = 1; + return !u.c[0]; +} + + #if defined(HAVE_GDK_PIXBUF) # include @@ -86,6 +95,15 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap, image = XCreateImage (dpy, visual, 32, ZPixmap, 0, 0, w, h, 32, 0); image->data = (char *) malloc(h * image->bytes_per_line); + + /* Set the bit order in the XImage structure to whatever the + local host's native bit order is. + */ + image->bitmap_bit_order = + image->byte_order = + (bigendian() ? MSBFirst : LSBFirst); + + if (!image->data) { fprintf (stderr, "%s: out of memory (%d x %d)\n", progname, w, h); @@ -165,15 +183,6 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap, #undef countof #define countof(x) (sizeof((x))/sizeof((*x))) -#if 0 -static Bool -bigendian (void) -{ - union { int i; char c[sizeof(int)]; } u; - u.i = 1; - return !u.c[0]; -} -#endif /* The libxpm version of this function... @@ -269,6 +278,11 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap, things as necessary) OpenGL pretends everything is client-side, so we need to pack things in the right order for the client machine. */ + + ximage->bitmap_bit_order = + ximage->byte_order = + (bigendian() ? MSBFirst : LSBFirst); + #if 0 /* #### Cherub says that the little-endian case must be taken on MacOSX, or else the colors/alpha are the wrong way around. How can diff --git a/hacks/images/timetunnel0.xpm b/hacks/images/timetunnel0.xpm new file mode 100644 index 00000000..65a6e8b0 --- /dev/null +++ b/hacks/images/timetunnel0.xpm @@ -0,0 +1,343 @@ +/* XPM */ +static char * timetunnel0_xpm[] = { +"256 256 84 1", +" c #5D699C", +". c #5A6EC7", +"+ c #596FD1", +"@ c #576FD7", +"# c #566FDE", +"$ c #6172B3", +"% c #5670E6", +"& c #6477BF", +"* c #6076D2", +"= c #6377C6", +"- c #6277CC", +"; c #5876F6", +"> c #607AE7", +", c #5D7AF0", +"' c #627BDE", +") c #6982D1", +"! c #6582DE", +"~ c #6882D8", +"{ c #6D7FDC", +"] c #6284FD", +"^ c #7088D1", +"/ c #6886F6", +"( c #738ACC", +"_ c #7185EF", +": c #6C89EC", +"< c #698AF4", +"[ c #648DFD", +"} c #6C8EE7", +"| c #748BE7", +"1 c #738FDE", +"2 c #6D94FF", +"3 c #6B9BFD", +"4 c #7796FA", +"5 c #709DF5", +"6 c #7A9EDD", +"7 c #7C9BEB", +"8 c #8A99D1", +"9 c #73A1E8", +"0 c #8198F6", +"a c #8895F3", +"b c #819CE6", +"c c #7D9DF7", +"d c #89A0E3", +"e c #78A6FE", +"f c #76ACFD", +"g c #83AAE9", +"h c #72B3FF", +"i c #89ABFC", +"j c #80B6FD", +"k c #92AEF9", +"l c #7DBFFE", +"m c #8DBCEE", +"n c #9BB7EC", +"o c #8DBCFA", +"p c #9FB4F8", +"q c #97B8F9", +"r c #7AC7FF", +"s c #AEB7EF", +"t c #80D5FF", +"u c #8DD1FD", +"v c #99CCFD", +"w c #89DDFF", +"x c #B1CAFB", +"y c #A8D3FB", +"z c #82E6FF", +"A c #9AE1FE", +"B c #CCCCFA", +"C c #B3D9FC", +"D c #87F4FF", +"E c #93EFFF", +"F c #A8EAFE", +"G c #B6E6FD", +"H c #C5E0FC", +"I c #99FDFF", +"J c #AEFCFF", +"K c #BDF7FF", +"L c #E7E9FA", +"M c #E4F0FD", +"N c #D9F6FF", +"O c #C9FFFE", +"P c #D7FDF8", +"Q c #D5FFFF", +"R c #ECFFFE", +"S c #FCFFFD", +";%%;,,,;,,,#,,,,,,/>++#@@#+.+++@+@@+@#++..++.+@+++':|1gAAFAv9e}32<::||01|44cc111e777iikc77ibGSSRRRRRRQOJIIIIIDIEEwwttwwzztj& ^$ iJEIDDIIIJIIOOIOROJEEJKKOQQMSBqqddb(bb^b1^^^&=~~:!<'{!!!!~|{::<::|{:{'{'''''*'''*''+'*++.'++++@+++@@#@@@@#>@####%%%%,#@###", +"%##%%%,,,>#>###,//#@+@@@@@@++@++.+#@+@+#+++++++....*}55jAAttvAvomf71}:~~|~!~~)1~))1117c|}c1dHSSSSROOJJJEIDDEztrllhjjrrjjju2= $)= GulEEwwEIIIIIJOJJORQJJFKKQNSSBndd(((((((^^&&====~~!{{:<'{!:::::':!{:{:{:''''''''{'''*'@@+++.+*++++@@@#%#>>>##%###%#%#%####", +"%#%%%%%,##%#,,,/,,#@@++###@++++.+@++@.+@+..+.+++++..*!5ehturrhjlvvvvvvmmoobbb7^^^(((d8d88CHLLSSSNKKFFEEEEDDDztwtrljheeeffj/- $)&$ AjflEttwzIIIIIJJOJIORRQKKGHLSssd(((^^((^(^&&&&)====~-'*''{<'{<<{!'''~'''<:{'*''''''>''''''>>@@+@@+#@#,;%%#,,%%%%%%%###%#%%", +"%%%%,%%,%%,,]/,###,##++#@@@+++.+@@++.++++++.....++***-!}5erwljfhfffjhjjjjooommmomyCHNNRRRLLLSSSSSNKFFFFEEEEEwrllhrhhhffjef[-$$$)^$$ j32eEEEzwIEEIIIIIJOQJOPRRMMLSBs8(((^^(&$&$&&&&&=&&===--**_'_'_/_<_'''////__'''_'*'''''''''''>>>@@@####;%;%,>%%%;%%##%%#%%;", +"%%#%#%%%%,,/#%%#####%@@+@@@@@+.++++++..+.......*.***-!}!:43jrleffe553c5e5b7igovvGKKQQQKCvmnCLSSSSSNFAutAwtwturjjhlfefeee33[-$$&=)$$$ $4342lzEEEIEwtwEIIIIJOQPQRRSSSB88(((^)&$&&&&&&&&=&&&====--*{'{'>>/_'_><'''<<<<<<<<<<<<<[<<_>#,###,%%,>,%%###%@##%##%%", +"%#%,,##,,>###%%#######@@#@###@++.+@..++...+......**--!!!:::>,>>>>''>''<:::__//////]]/242[//]>>,>,>,,###@####%##%;;", +"#,,,/>>##@#####%%########@@##@+@+++.+.........-*****!!!!:_/<<2hh55efefjfeiiivvvvoii7pbbbdgnySSSSSSSSRKAuuuuurlhhfe55e3333[[-$$==1(($$$_{!!:fztzwhhoruAEIJIJJFGGNSSSLd88(((^^&&)&&&&&&&=&&=&====-==--****+@>>@>>_>>___'<<<>__2,,,,,>,,],###,%##%,##%%", +",,/>@#%%###%%%%###%###@#%@#@#@+##++.+++.+....+***'''|!!!>,>>>>/>>/////_'_'__/__/<2/>],,,],,,;>%,%,%,,,#,%,", +",##%####%@#%#####%%#@##%%@@#@@@@@@@++@+.+..+***''*'!~!!|::<42cc3hrrtturje3:|~||~}177^^^^((8xCxMNNKKQROJJFrglo99f55}34322>>,>//>/>'_>_'>_/'<_<__/<32/>,,>,,],,,,,%,#%,##,]", +"%%%##%%@%#####@@###@@@###+@@#+@++#@.@++>+++****''*!|7eeie43ceie33fffee2<2<:|~~~~~|77)1^^(((sdnHHCGKJORJIJErlj9iee5}344<<<<[)&&===&&$$$!---===1oh5efjjvEzAAAJJKGNSSSB8(((^^^^^^)^&==----=----=--=-=-*-***+.++@'*'_>]]]/////////,,,]]],],;%,,,],,#", +"#####%%%%%%%####@##@#####@+@@@.+@>.*++'*+''*'*!!|cfjfi333233[/]_'':[22232<<4|~|||1c)~1^^((dd66xnvyAJIOOJIIIurjb55534:<<<<_/!&&=-=&&$$$-==---==1e551b9rtuuuwAAAKRSSSBs((((^^^^(^(&&&=----=---==&=--*--**''''>_'_<__>>///////_<]],#%%%", +"%#%;;;;;%%%%#@##@++##@@@@@@##+++@+**''''''{!}9ei33e5222/[//]/'=-&==!<<<2222:34|}17|~)1^(sxsddgxnoouAEIQOIIIIwof555332<:::_/~&$&~==$$$$=-====&&&~33177luuuvmuvyCNSSSB8d8((^^^^^^&&)&=======**--*-*--****''*'_''///'_/////,//2>]///[<22[/]]]]]//];%%%%%%", +";;%%%%%%%@#%%###@@##%%@@+@@@+++++**'''':}5e5e3::<[2<[[[//_>>*-==&===!<_<242444}c7c~)~^b(dxnddxLCymvvvFJQQOIEEu9b75344<'{__/!$&=)~=&$$$&-==&=&=&&~}1}5jommmvvmmvNSSSLss((((^^^)^^&&)=&==-*''___'**'!'*''_'''>_///_'__////[2[////]>>>],,,,,//<[[/[3[[]]];;];;;;;;;", +";%%#%%%#%%#%###@@#@@###@@++++++''{'':4ce3342<<<'<__/[[2ce2///>>#,>>>,,,,,,//2[22]//]]];;;;;;;;;;", +";;%%%%%##%%##%#@#%@@@@##@@@@+@@':|||44:4::<'_>>>>>>>>,,,,,,/3e2]];;;;]/]];;;;;;", +";;;;%%;%%%%%########@@@@@@@+'''{044|::!:<<'>////[<<::!!-~-{--===&&&&&&==!:::4eij3::!~)))^^^(xxvyAuvrmlrlrEJOKwtAj771||:::_2{===-~)))^&$$-=&&$&$&&&$&^99966gggovvnxLLLSB8((^(^^&^&^&~!:{'{!~!~-!~{'''_''''{'''<<<<<222522[[/''_>>>>>>>>>,>,,,][//]//;;;;;;]/];;;;", +";;;;;;;;;%;%#%########@@@@>>'':244:::<<<<'::::'!!-=--===&&&&&$&&&&&)::4eqc2<:!!~~)))^ds86ovwEEulllruDIJKwwAmjiccccc42{===--=&&&$$$=-&&&&$$$&$$^969bbbbggmngnLBBLLL8(((^^^^&^)~~{!!!!~'{!{{!{{_<'!'::'<<<<<<242<<<<>/_'_>>>,>>>/>,;,///;];;;;;;]]]]]", +"]]]];;;;;;;;%%%%#@@###@@>>_/__<<<:<<<<<_!!!:!!{'~=--!====&=&=&&&&&&&)|0qc2<<::!!|!))^dd((66guAEEwrruEIIJAtwu77c7eieci~)&)--==&&&&&===&&$$$$$$$(b996bbb6goqqdBBBBBLBs8(^^^^^&)~~~!!~!~{{'{!!!{''':<<<<<<<<<<__<_<<_<<<_<___///_//_>'>,#,,>]]]//]]]];;;;;;;;", +";;;;;]]];;;;;;;;%#%#%@+___/_]]>_'*!!:|!!!!~~~{!~==&===&&&&&&&&&(de::3<:::|!~~}7bb^(bbb9jrtuuutAIIIOurwf}}55335511c|||~))&&&$&)=&)1^^^^^$(b666bbbbgo8gdssssBBBBsd(^^)))~)~~!~~)~!!!~!~!:{!::<<<:<<<<::<<:_<<::':'______/__///_,,,,,%,,;;]]]]]]];];;;;", +"]];;;;;;;]//]]];;;;%;@____''_/<<<>''!!!:}}}::|~-!:~~)&&====&==&&&&(8():<<2<<:!}|}171b^^^^11b9jruljlzzDJFrtr7333533:}}11cicc1^^&$$&&&^^($(((((og66bbbbgonq8sssssssssspbb^))))~~~~~)~~!!!!~|4:::!'<<@>,,>,/>>,],]];;;;;;;;;;;", +";;]]/]]];;;;]]////]]/3///_<<<<<<<<[///>'>+*''!!:}:::|!!!||~~=)=====&=&&&&(d(&&&!<<2[+.@@@#,/,,///]]]]];;;;;;;", +";;;;;];]/][/];]]]][3e33222[[/<>>'*'*<44::!!!!:!~!~~))~)===&&&$(d8$$)&&$~<<222!|771771111177775hjllrutrJe35fljllj5~~==~~}~~)))^^^111^^&&^$$$$(og6666dgoqqqxssspsBBpppdkbb711)))~~~~||||||}c:2:4<<<:::{{:{::::<:::::{{{'::_''>@@@+@++@@@@>@>/<332[/]];;;;", +";;;;;;;;;;;]//[[/[422223eff33232//[_/__''*>''<2:<:!~!|:{!~~~~~)))==&&^(n8$&&=&&&==:<<20acc111111111177555hhjjruAr552[<<<''!!!~~}}}!~~))^&&^^11^(&^($&$66g66666ggddxsppppssssdkbbbb7b1111||~bb7c4|c044::::4:::{{~!:{:'::{*:':{::{'**+++@+++++@+@@@##>@>,;,//2[//]", +";;;;;;;;;;];;]]/[2e333333333eeee3324[//<'>@'<<<<<'!:!:{:!|!~~~~)~|11bkd(&&&&=&&&&&=!:4c4011111111111}1715efhlruEwf322*--~~!|}}1~~))&&&$(^^^^^^(($$(6gg66(6g6dsBspppppssssdpdb7717cccc7oyxCi0|}||:<||:_:<::{!!!|:{::{!:{::{'-**'+'++++.@++@+@@@##%#%%;;;;;;;;", +";%;;%;;;;;;]]]//2222233fhlhlfe33eehlfe532<>_/<<_'''::<'<:||!!|~~~)1171==&&===&&=&&&&7c04401111171111}}5115efhjrAte332[//***--!!!}}~~)))=)&&$$^)^^^((($(66gg666g6bnxppddppdpdpddpkiiecc7e77oi7bpcc||{|:||!:<{:::|{:{~{{::{::{*''**'*''.++++++@++@@@@#@###%;;;;;;;", +";;;;;%%%;;;;//[222[23e3ehhfflhheeeeehfhhjl53<<_'''{'{<<<:::!~||~))17)==--====&&&&$$11^14244}71111}51}}}5}55ffhrEuee32<<'*****!!!:!!~~}~))&&&$$)))^&$^^(666gggjggbnppppdddpdpdkpkkqkii7cc77j77cp7c||!|:{{{::::{::!|{!!:{|!!**'****''''.+++@+++.+@@+@#####%%;%;%%;", +";;;;;;;;;%,]]//<33333eef33eeeefefejjfjheejtuhh3::'!!'<:24:::!|||)11)---=-=-==&=&&&11^^^1c5e577751}}}}55}}}5ehhlEhfee32/'*+'**'!!!!~~~~====)=&&^&)&)&&&((oogjoogoggspppddddppppkkkppki7cc7ij7c1pkic1||:!|!::::{::::!!!::!*-*'{*-**'>'>++++++++++@@+@@#@#%%#%%;;%;", +";;;;;;;;;]],/23flffeeee3223333e3e3ee5fjljjrumhhjje554|::::{!|||cc~---=----!~==))11ki77777efjfeeee55}555}}}3flhrIe333e3<''.''*!!!!!~~!-===&&=)&^^&=)))=))brvvoggoggnnpppddddpppiikpkkkkieiiji77kiiccc||||!{:::|{::!{!{!**-!'!*{{{**'''@+++++@+.+@@@@##%%%###%%%%;", +";;%;;;;;/33efjhhfee33ee33322[[2233e3335efhrrmvjfffljjfe}|4:!:|0||!!---=---!!|}75c7eb7171117fffee7555eee533fljhzw33223[[<''***!!::!!~!~=~~====^^)1)~~154}~9momvmmmgnndddddddppp77kkkbkkk7i7k77dpkiccac0:|~||:|:{{{|~!'*''--!*'{'{{:::'@+++@@@+@+@@@@@###%%@#%%%;;", +";%#,;,:jjrrhrllje333e3333322[2[[23e5333cefeeefvujheffjomjee10c~~!{------!-!}33ccc17b5bbb7bberttrof55fe533hlllrEr3333[[//>''**!!!!!!!!~!!|}}}15ehjjlhe}~~^^9mvvmmmmnnqdddddkkppbiikbiikkpkbkbiqqjkii77|||||44:|||!!!!<:'-*!*-{'{***|:+@@+@@+@++@@@@@@###%###%#%;%", +";%,,}hrhfefhfhlhff33333[[22222[[22332[223jfeceeooojihifffomvj7}!!{!-!---!24c5cc3355ff99999hjjtEurlrrlfeehflllrJeehh3322/'''-.-'232", +"th322[22233e2[//2//]//[[22////[//<<<<[3eie22cecijecciic0ccc4|||||}eifjjoAroh555551}~19h55155ejjjjurrrruEDzzDJwhhfhhfhlhjfe5235fff5332:::!!!!-!~=~~~=))))))=))=&^gAGuyuoyvvvvvvxxqkkdddddddgoqdddgkkb^77111c}|0a||ac|))~-!:{----*---*---**.++++@@+@+@@##@@@#<323f", +"f3322[2/[2[2///////]][//[[[////<[2<<<<222ec4443ciooic33ceccc|}||ceeeeefolruvllf5}~~~~5ff5fefjhltwurruwEEzutDArlrrrlhhhlflfeee3333e33}}:!!!!!!!!!!}~~~=)))))=)&&&^GRNAAvvvCxvvyyxxpdddddgdggogddbbbdbb7717c11cc|||a1|1|a~~-----*'--****-'...+@@+.@@@+@###%>3223hu", +"3[////[/222///[/,//]]]///[/////<<2<<<<22<234:444ciiie44c0c0cc00ciieeefjffhojmuwj1:!!}}jheehjhrAwtuutrtEEwzwwrhffhhllllfefhhff3333333333:!:!!!!!~!~)~)))~))))))~))nGQRJEAmmyxxCCyvvqgdddddggogbbbdbbbb77777c7c11ccc1)|aaa~-==--*-*-*****''....@@@+@@#+@@#<323frll", +"/]/]]]/[[2/]]///]]]]]/],//[[////<<<<<3322434400cc0:4cicc40cc00ciiifefjhjjhffjofiff1}:3jlhlrrtAwtwwuruzwzEwuAhfe3353fhllllhhfhff33223::}2:}}::!}~!~)~))))))^~~~~~)oCyFQKEAvmHCyyGyvnggbkd6dgojkbbbbbbbb77777711cc71|||||a|{{-=--=--*--*******+@@@+@+@++@}233htle[", +"]];]]///[[;]/]]],]]/,>],/],/////2<[<43332224ccc}::24|0eicccciiiiiiifolroffehfcc5eifj55flurwEwuwwurrrzzzwrrAtjeefe3e3efhlrllhhhefe332<:335535}}}}}~}}~~~}~~}}~}}}}oGxowKQFAAvGCyyCGvnqbddgdqo9bg6dbdbbbb7b7b111ci1||||~)||~~~===-*=------'*+>@@>++++.+#533hrlf32[", +"2[[[/////]];]]]]]]/,,,/]/>,/////<:'>>++@+@/lfhwzrhee33", +"//233333[[/]]]]]/],]>,]>//]/>////:<234::44eof44!!{|:|00acikkiceiifvvoohf5hh444343fifotEJIIEDtrrrttDIElrlltujfhfeeffjlrfeffhfflllhjlhhffee3533}3}333}333}3}::::}1^6xndddguKOJEFQGGFGGymgggooogggg6gdddb777b1117o71)1~~~)~~~~|||~~=-------!'*'*_>+,,/3rhrwrhff3[22", +"//[22[22/2[[[[//]//,,,/>,>>////>/_<4444444ie344|{:||||0cccckojiiiovurojhjf34:333ei5hrEJJOJEturtttDEurljfjAhffeehhhhhllhhlhfflrrrrrrrljrhheeee3535353333}::}}}1^^^(xndgdd8gFOKEFQKKKKGCmoomogqggggd68dbbb^b777gd111))~)~~||~||||1)~---!---{**'>.@/2errrrhf3e322[]", +";]][//[[/];]]]///[[[[//////'_>>///<34::|434434|||||00||acciijovovuAFvjjlh33335eefhrwIIIJJJJEwtutDAlejlhhturtwwwzwwzwzDrrrrrwzzzzzzwtrrrhljfffeeeee3ee533c}1111^^((xndg66d66uKOJFOOKKKFyxmvooggggggggdddb^bbbbg^^1^11c11}1|11||c7||1~==-!!:':<>>[[errrhfee33[//];", +"]]]]]/]][[]];],]],]//////////>>//<34224334444344||0|||10cciffjouFEFAAuAve3eeeeehrwIIIIIIIIJJEwwArhloAEEDOIDDDIIDDDzDDIDDDDDIIIIIDDzwwruurlrljhjhfeefe5555b7^^^^^^dxnd6666666mFOJKOOKOKKCCCngogggg86ggddbbbbbgb11711111111}}11}17c1c1|~~~!:<_/<[/3wwlfffee[/]]]/;", +"]]/]/]]]]],]]]]]],,,],/]]////////222:c34:<44444400|||||ccejvvvvAEJJEFFAvvjjhfhltDIJJJJJJIIJEJEtruFJOJJJQOOJJIIIJJIJIJOJJJJJIIIIIDDzzztutttrurlllhhef55517999^^^^(6xndddd666666uFOOROOQOKFGvnogogonggggdbdbbgg^)^1111111)1111111111cc111}!:/4j3[2tzrlhffe3/]]]];]", +"]]]//]];;;]]]/]]]],/]]],,>>>///[[e33344::::4404c||||||0ioGGCyuFOQOEJJJJKKKFEEEJOQOOOORJJIEzEFEJKJIIIIIIOIIJOOQRSRRRQNQNMNNGKKOOQOOOJJJIIIIIDEAzwtrhhh999999^^^(((6npddd66dd6d66gyKQRQOOQQKGCvmnggooggg6dbddvb^^11111111111111111}1177cc1c7ehl35wztlfee3e[]]]]];]", +"]]//]]];;;,,]]]]]],]]]]/]>,>>///[335e2<<<<444cccc||00ciCGAvuurEJEwttAAFFJEJOOOOOOJJJJOIIEEEEJORJIIIIIIOOOOOQOKJEAzurrtlefe3eflrtrwwzDIDzwwtttwtutwtuwtrml69((^(66oyngg6gd(ddd6666mGQRROOROKKGymmmmmgg66bd6mgbbbb1^111111111111111111c77eovoujfwIIDzulle3/]]/]]]/", +"]//]]];;;]],//,//],,],/]]]/,>///2232222244424333c400cjFFvvuuAAIwAtuuvlAFJOQQRRQOJIIIIIIIIEEIIOJJEEIEDIQIIJEwturrllhlltte332333hhffffhjlruurrrhh9h99jjllgjjgj9gg66oynggg6d6666d66666mNRRQRRQKKKGvnmgg6gggggC6bb77^bb7711^1111111111177cjvyvFtuFwhflrtzrf3/]]]]]//", +"/[///,,;;],],,]]/]],]]///,,,///23322222<<<4223ieecccjEAvvAyuFEEEwuurjlwJOORSRRRQOJJIIIJJEEDIIEJJEIDIIOJzztrllfffflluuzDre33e5lrrllffeeehe5eehlhhh999999b999996696vGymmm66666d8666666nyMRQQRROKKGymgggooggymbbbbb7bbbb77b7)11)1111177iovvuAJEJEle2[2fuwuf/]]]]]//", +"[/]/];,]],>/>]],>,]]]///>/]>/[/e332<4222<<<[23hooi4fJwvuFAFAEEDElrrrrwIJQRQQOQQQQOOJOKEzEEIIJIJKOOJJIJttrjjhefhfjlruzEDIttwzwEzwrljfefe323335}115f9997711999999((6Cxmggoogg66666ddd6gqmGRRQQRRKOKymogggomGndbdbb7bbbb7^771111111^b9ovooeiAJIJwlh3<[[,,,>],]/,//>/////3e242<<22<<<2233eruhjJEtAJFAKFEJAllrtAJJQRJOJJJJOOOQRRJJJEIEIIIEEJROEEJwurjfefhflrrrwEDJOOOOOOQJDrlffe3333::}}}~}}~11151117^^^^^^^^6nnqg6g66b6gg6gg66666gxmGQQRRROJKCvmmvmCCgqggkbbb^bbbb1b^1779gjgfecc4cefjAJAuofi53,],>>,,/]>/////23i3[<<222[2<2233eeefrEIIJJIEFKFJFjlrAKJQRJIIIJJJIJJRROJOQJJEJIIIIJJOJEIEuullhhhjtIurzJJOJIDIIIIOQzrle5f23::::!!}}|~}~)~))^~^^^^^^^^^byqd66gg666666g6ggg66nnnnCGQQQOOOJFCvyyNxqggggdbbbdbkbbggoooq9i70|:4444ijFErooiiec52<[rwhe2[[[/", +"/[]]]]]],,,]>,,>>,,>>/////223e3<[[<2223222323333etIDIIIIIEKKJvuAJJQQJIIIIIIIIIOQFEJOOROOOJJJJJJEKOIJwuurrrrttzwEKJEIIDDDDDIJQthhf325c334|:}:}}}}~}~~=))=&&&&^1^^^gngb66666ggggg666g6ggmoxxnxyGQRRROJKKGGMynnoooymqgggomomomoogia000cicccioAFmojfjjcic[22utfe[//2", +"2[//_/]]]>/>>/>>>>>]>_/<2242e32<2<2222333243542elEEzEIIEJJJOKKKJQQJIIIDIDIIIJKEEAFFJOROOQQQOJEEEOQJJwzuttwEzEJJJIDDIDDEEJOQArffh523:c3}:44}:|}|}~)~=====)&)&&&&&^6ngbbbd6d66666gggggggonnCHCHGCKRRRROOKQRGCyyyxCHCGGCvnxnddb77ccccc0c00ijAvuAvooqvvqqqieiAtmf343", +"iccccc4424422<<<::<_|a44442352:2422233efe33e322fzEzAAIIIIIORRRRQJIIIIIEEIIJKAutwFEEJOQOQRRQQOKEKRRJDEzzIIIJOJDDDEDDIEEJEFwrffe3e333:}c3}||}|}!!!~)))==~==&&&&&&&^^kd^((dd(dd((68666666gggnxnnnyyCGQRSRQRSNQQNNQRRRNMMMLLLLCxxssssppppppxyAvvGGyyxqxCxxxoqvKAvoji", +"jiiiccc0c4c0cc4000iiiiiiiijjiceccciiiiiojfffeefuIzDtwEJJJQQRSROJIIIIIIIJOKurlrutwJJIJJJOOQQOQQQRSRJIIDDIOJJIDIEDDDDEwrurlllfe35e222:43c4|}}|!:!~}~~~)===)&&&&)))^^dd^((((((((66666666d666dnssdnnnmCGRRSSSSSSSSSSSSSSSMRSSMnppppqpppppppxCGvoyyyyyyxxxCxqxvyFFAyo", +"iii44444222444ac0a0a0ciicckc0ccciiiiqqooovyvyyAKJKJKJJKRSSSSSRQJJIIJJJJFAvmomvuwwEEIIJJFEJJOQRSSSRJIIJOOIIIIIDEzDzwwrrrlhhfe3333<:::::::}}::|!!!~~}~~~==))&&^&))^bdd(((((((((666((((((((666nnnnnnvvvAKRSSSSSRSRRSSSSRMRRRMCvoqkkki7cccikoooqqqoqqxxppqxCHCxGGyyo", +"kkkiccc00000c44442444444ce44:440cciiiiiijooovFOQOOJJORRSSSSSSSSOOOOOQKAAAvvyvyttAJJJJIEEIEEJQSSSSRRQROIIIEzzzDDzzttrlrrlfe332[2<'<:2:!::}}::|!!!~}!~)~~~~)=^))&)^bdg(^^((((((((((((((bd6666gnxvvvvvvvyCNRSSSRRMSMMMMRRRRRSGyvxvvoqjjieeijfiiiiiiiikkpkoxyxxyNGAy", +"occccc00iciic0044404444cc3442:4cc43cc4ciiiijjvKQOJQRSSRRRSSSSSSRRQRQKGGGGKNNKKKQQROOJJJJJIKRRRSSSSSSRQJIEDEEzEzzwrrlhfhhf33223[///':::!::}||:!!!!|!!~)~=&==&&)&)^bdg(((((((((((((((^(9999jjjovxvmmnxnnnxCCNSSSSRNGCGHNRRRRMyvvmnvvyvoojjfiii5eeiic00ccqxqqxCCNKG", +"Gxicc40cc4404440404ccccic34000ci00ccccciccijoAJJRRRSSRRRSSSSSSSSROKKOOOOQQQQQQQRRQQRQQQQRRSSRRSSSQRRRRRQJEzwzwwturhfffefee32[3///<::4::22::::}!!!:!~~~)&))^111^^^^d(b((((((((((((((99jf999966gnnn888psnssBLSSSSSRQKFGvNRRRQCvooooqnvCCuvjiie77iii0cceiiiiiiipCGG", +"CGoccckii000c424244c444cc0c0ciiqkkpkpqqxxxyGKRSSSSSSSRRRRSSSSSSSSRRRQRRQRRRSSSSSSSSSSSSSSSSSSSSSRJJORROQRQKFAwtwrlfeee5333e332[[2<<[:3}}}}:!}|!!!~))~~~)^^&&&))^&^b(^(((^(((^^^9999e9969b^^(((888d888pssBSLLLHGNRRRRQNQQRRQGmoooqqvvoCAAmifee7eiiceeeiiiiiiickyG", +"GGyqicc04cicicc44444c40cikpppxxxxxCHCyxxqxCNSSSSSRRRRRRRRRSSSSSSSSRQQOOORRRRQQRRRSRSSSSSSSSSSSSSQOOJOQKOOQQQKAtwuhffe33233e332[[[<22/<:!}!:!}}}}1}5}1~)&=)&=)))^^(bbb9b6^(99b77b9^^71^(($$$$$$(8d8dd88dsLLLLHxpqvFKQRRQRSSRSNGxoijjvvmFKuoee7eiceicikqckiicic0iC", +"yCKyoqc0424c4ccciickqxxxxxxppkkkppppqppxHNRSSSSSRRRRRRRRRQQSSSSSSSSSRQQOOOOOOOOOORSSSSSSSSSSSSSSROKFwuuvyGKKQQKFuffee3ee3ff2222[['!!!}5f91)$=&$$$$$$$$$$$$$$$$$$&&&&$$$$$$$$$$$&^k7bbbBsBBsxyvo7c11|17ikxHgmyAFFKKFKKQKGCqqqqqjvHn02<22[2224", +"2ccvKRRRNHGCCCxxqiiiiBMHyGNRSSSSSSRQOJFEJOQJIIJEFJJJJQOQRRRRSRRRRSSSSSSSSSSSSSSSSSSRSRRSSSSSSNRyfiefffffhjojjolifhhfe5eovGQRNGAmjhf333:[<<<:1oc<''>>//2551~&=$$$=$$$$$$$&$$$$$$$$$$&&&$$$$$$$$$$&&))&^kkb7dBBBsspyvo771117kbnNd7iomwJJJQRNKKCkkkjoHH7>-&&&&=$&&&$$$$$$$$$$$$$$$$&$$$$$$$$&$$$=)==)^pdbbsBspskkyvq77771i7kNp77c7jtFJOROOJCojovNvc2<<__<<<2[//", +"e3322floGNRRHCHMSMHHKNRSSSSSRJJFKKAvlolwORJJIJJJIJQRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRQNRSNNRGHGe35e5533e55fhmlvflvlofie52<2>,_-=$=$&&$$$$$$$$$$$ $$$$$&&&$$$$&&$&&=&===-=^pbbdLspsp7kCvk71^17bbyC7i7ceooAKOOJJKAAGK94:4c4:_//[[/24", +"ee3323jljvvoxHMSMMRSSSSSSSROOOGGGyoojjvJRROOJJOQRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRNNyojv533333efe35ehjljfficccc4<<:<::!:ciCMMCq}:::!!!!!-{!{***-*++*+>>*-&$$$&$$$$$$$$$$$$$$$&&&&&&&&$&=====&===&(pddsLssxk7jyvkxd1^i7gH7kioojjmruNOJJKKyjic444444_/_///2", +"c433c43jhfejjiiyMSSSSSSSSRSRNKQNyxvxvCKRSSOOQRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNQGCvffov55efeeeff5ee33323c_<<<44_4_2::||::|cxHMHqc|!:|!!!!{:--***'***+>>>@.&&$$&$$$$$$$$$$&$$&&&&&&&&&&====&&===&&^pddLBssp77jyvCGb1i77Gkkiijfmuj7jvHxm97ccicc044c42_///4", +"2e3444ciffhevoHRSRSRRSSSSSSSSSSMHHHHNORSSSRQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSMNCyAujiffjove5ef533<<2[[<][[<>____<44::::::::::{{|pxMHxb|~|!|!!!---*********+>,+-=$& $$$$$$$$$&$$&==&&&&)=&=&&&=&&==&&&bpdsLspxk7ioCKQm177iCgi7jooug777fj!|0440444ci000044223", +"e2222243fjuGRSRQQQQOJFGHMMSSSSSSSSSSRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSQNCqfhjuffffjfij2<2<<<<[/<<[[/[[>@*>@>>/<__/_:_:4:__|:{|7nHMCq7~~~!!!~-!*'**-*{**'++>@*=$$$$$$$$&&&$&&=&&&=&&&&&&&&=&&&&&&&&1kpLBsspii7vGNKg77kyoiijvto}}75j5~{{:444::440icciqooe", +"i33e323jyMSRQOOQOJJAwvjjjppxLMSSMLRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRKGvrjffhuhe5c3340c<<_/>__//<<<22<_*''*@@@>/_>>_____4_a____|~|pxMMxd1~~!~!!-!***---***'**+>*-&$$$$$&$&$&&=&===&=&&&&&&&&&&&&&&=&bksBBspkk7bCGQGbijmyiilwu7}11bj1'*{{'_:::<<4eiijjoyv", +"voiffvMSRQOOQRROEEAwlic44cjoqqxMMSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRSSSRNGAlolfe3je<<<<<::|:{<__'''>>//,//>@'*>+@>'+>>@+++_*_____4aaa__||bsHMHqb~!!~~~!!*----*****+++>'-=$$$$$&&&&&=====&&&&&&=&&=&&&&&&)&bdBBBsbi779AQQvjojHjjwwe7111f9:''''/>>'_4<<24ciivyy", +"vvyHMSROJJQRQJIIDFufc4|4443iovvoxyHRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQOQQNGvljjfii423f[_<<<::|0|:{'!'''>/////@+++++.+>@@'>#@++@+'>'''_{_|_aa_|{1pCMMyd~!!-----!-------'-*+''''=$$$&&&&===&==&&&&&$&&&&&&$&&&=&^bsBLBpk777vKQKojgGjuE971}579e''___/_>_'>>_2223ifvv", +"NMSRQOJORROIIIIEIAicc0004cecijvyCCGRSSSSSSSSSSSSSSSSSSRRRRRSSSSSSRRQKFArof35333442////++..@*@++@@+@>>@++@@'>++@+''____aa_aaabnHMHq1~!~=---~---=---.'**'>>*-=&&&=====&&$&&&&&&$&&&&$&&&=&&^bBBLxkk779AQRGjoGjFo}57}}555{*_///>_>_'>'__4i5efj", +"SQOJORRROJDIIAwuuueic004ciiiiijvFKRSSSSSSSSSSSSSSSSSROOJJJJJIJJOJFAvjjjee3222222>/'*.+*@@++@@@@@+@@>>>@+@@@+++.*''{__{{|aaa7dxMNnb1}~)===-!~!{---**-**'__*===&&=&&$&&&&&&&&&&&&&&&&=&)&^dBLLpik7ivQRQvgFmm1}77}}5e}'''>>'_>>>'>>>/23eyHM", +"OJORRQOIDIEurtlhejfcccciiiiiiifjmKSSSSSSSSSSSSSSSSRRQOOJOJIIIIIEwrheeie332@@@@@@@@+++++.+...**+*{{{||aaabsHNyk1~)))=---!||1---*'**_/>'*==&=&&&&&&&&&&&&&=&&==&)~~^bnBMBkki7oKSRGoKr7|}e55555~*+>>*'_/>>>>//3fyMSRR", +"SSSSSOIEErjojovjeeoeiiijjifiifijAQSSSSSSSSSSSRRRQJJJOOOOJIEJEwtrre323e24[///_//_/i<<':{:{!!~--~!*''!''<''.*....+.+@@@++'>@@@>@@>@++@+.+@++..++**{'{|||aa7pxNHob})=~=-~-~~|~----*'///<:*===&&&&$&&&&=&&&=&&)))~)))bxLSsiqiiyRSMvFf5|c7fe55e!'>''_>_/<[33fyMSSSRRR", +"RQOOOSJtliec4covofjofiifjjjiqjouQSSSSSSSSSSSSROJIIIIIJIJJJAtvjjfe32/2322[/__////c<_'{!!!{{!!={!--'!!''<'*.-..++.++++++@@@@@@@@@>>>@.++.@++.+....**-~{{|{)a7knHNyk1~~~~!!-))~---*''':<_''_'<<25oHSSRROOORR", +"KIDIORAlj3e44c5oojovyojjiiijjoAKSSSSSRRRSRRROJJIIIIIIAwtwvooojef54/[<2[[///___/5c{'{:{!~!-{!-!!--{-'''**..*+..@+@@@@@+++@#++#@#@>@>+++++..++++.....***--{|||7kpxMCq7}~~~~~))-!!!*{!:'__/>_--&&&===&&&&=&)&&))~~)))1sBSspxqoGRRNye7}}7ff5e:>>'_<<25jHRSROOJOJOQRO", +"zEIIIGeiiiicccefmvmmuyoqqfjjvAKSSSSRQOJJKQRQOJJIIIIIwurlfeeiiiif42//____<3:@+..++..+.........**-{{{aa7dxHHxg1}~~~~~!~!:!!{'{''_''_{-=&&=&&&&====)=)~~~)~~bBLMpyvoyRSSv7i}cefh5h<''<<3fyMRRQOJOOJJOQOKE", +"IIDEw32<<44eecccoAuvmvvovvvvAFQSSSROJJEFFJORQKJEEzttulfe52<3cecc42//<@+.++.++.+........-.---{{|1bksCHHmb71}}~~|:!!!!{{'''''__'*=&&=&=======~)~~~~~)xBSxxCvyRSSm7e}ifjhjh<<:5qHNRQOJOJJJJOQOEzwD", +"zrffe/:<[<2<4cefoAtrjrAAuvAFJQSSROOOJFAFFJJJKQQKAuullhe32<2444c42___<<__<<''_3}{~!-*!------~!~!!!'!!--**'**++++@++++++++#@++@@+@#@##@@@@++..++.+..........=-.-=-{{|1bsxHHyok71}}}}~~!!!'!!'{'____*==&&===)))~~~)~~~-^HLMqCvyNSSC7f5efljl5}qHNQOQOJJJIIORQJEEwDDI", +"3e33[/<<<[<<[<3ejoAAmovwuAEJOSSROJJJJJJFJJJAAFNRQAvjjf2#@+.....+..+.......-.*=----~|1bsBHNGvoi771}}}~!!!{!-!'<___/*-&&===~~|~)=~)~~-nxSCyCoCSRMefeejurAyMQJOQOJIIIJOROJwrjruzzr", +"222[<<<<<<[/[2ee5eoAAruAFEEJRSRQQOKKFJJJOOJFAuvCRRKof3<__<422<22<<<<:<<:|:_<3:{!!!:{**------~-~~!!!!!!!*'*'***+@'+++@@@@++@@+@@##@@+@@@#>>>@...+.++++...-....---==-==~)17pBMNGGv9757}}|!!!!!!!'**''_<'-==)))|!~=~~-!!)HLMCxqxSSM7oouEFNQOJQQJIIIJOQQJEtlhhrutth3", +"2[2<<<<[<[[<3332323ltrlvEIJQSROJJJKOKJJJOKFKGyvGGGMMC4<:<<:<<<<2<<<:::<:{!<3<:!!!!-{{*-===--=~)~115}}}5:'.'*+@@.+.++@@@@@@#@#@@#@@@+++@+#@@>++...+@...+...-.-..==-*----=)17dBHMGGvmf7c13}~!!:!!{{**'''/<~~))~!!~~~-~~~dBSxxqvRSMfFFNRRQOQOIIIIOQOJIErh5hhlffhre2", +"[32/<'<[//23ee333333rhfjtIOSROJJJJJFKOQQOKGGNKQKyyyRRxa||:<<<<_<<<:<<<<<:_3<'{{{-{:!-----~==~}77}}~!15!:'**+.++.+@@@@@@@+@+@+@+@#@#@@@@@@@@#>@....++.......-.--===---.--===~17sLMCvvuo917~}}}:!!''{-'''<_<~~--~~!{{{!~~HLBxxoMSRGSRRRRRJIIIJQKIIDzlfefef32233233", +"/2[><'@+@.+.+.........------*------=--=~akBMCoomvje71}}::<:!{{''{'/<'++.+@@@@++@@@######@#@@+@##+@@@@++#@+@@+..++.......*-----.----=-=.--=-==)|sLLCofjjhhhe5}}|:::<<@@@@++......*....--.**....--!!~!|}~-----)dBMMyoi755555efeifjjvAKJJQRNKOGMSRSSSSQREul97}}}~=-!'!!-{{<'<<<[[[/23", +"[////[f33e353333eeerOQQIwuDtrrDDtrutEzljhjmhfhfee553}4332444c3:<:::4c4<:{|c|||~!|}!!~~~!|}}|---***-''+.++++++++.+@@@@++@@@##%##%#%#@@#####@@@@@+@@##@@@@+**+*.****...**....**!!!-*!~!-----=-)(nMMCofjfeeeifjlAFKKFwEFFKJumHSSSSSSSKm91}}~~---!!!!--!!'<<@@@>+..+.******..*-..-*!!-!-*--!--**-----~bnLRGyoiifjrFJFFtAAFFJJwtwwySSSSSSRm1~~-==---'{!-----''''''<2[2eh", +"2[2[[2fehf32[[2eefrIRQItlhhAJuwAJJEAEEGyxnqvNGoojjfiec3c444<::4343i4440}||}}|||!!!{!!!}!!!-!*-**-.*.*..+.+@+..@@###@@@#@@###@####%###@@@@#@#+@#@+@+#@@+@+@+.+++'**++*+.-*'''!!-*-***!***''{{!~!~~^nMRNGyGKFArmmAFEJEwutEzEJMSSSSSC~~====---'------'''''{'<<22335", +"233333je332[[23eflEJSOItlouvFJEJEEEwwEJOvyoqvFAvfieiee5c444::::4ce4:2:}}}|:|~!!:!!~!!!!!''!-_'''+**++++@##@>%%;;;;;;;;];,,,,%%#%%%@@##@###@@@@+@@@@@@@++++>_+.*'**'''>>_/<<<'<'''''*'**-**{{{~!~~-~^xMSRQAutuAEFKJAuwAEEIIOSSSSSS)-===-==*'*=---**'''<':<<223333", +"3e3422fje2ceiiijvJORROJwuAvolKJEFEEAtwIRyvofjoAumjiffecc2232::4e54c44:}|}4!!:}!!}}:!:''''*-'>****++++++++#>,;%;;;;%%;;%;;,],;;;;;;;;;;,,;,,#+@+.@@@+@++.++++''@'_<<<<:<<<<2<<<<'/__<<<___'_:<:::!|7orvCMSRKNKJJJJwrrttAwAJRRSSSSH===-----------'*'>'<<42<<225333", +"yxppccoyyovoqjjjFJQROJIEtmlrAuGJAzEzAwEOOAmhjfgtulrojhfe534:ceoe44c44}4::::::||}3}:!*****--***-**..+*+@#,;%;;;%##%%%%%%%;%;;;;;;;;%;;;,%,;;],,,>>>,@@#++++@+''.+..-**-!'!!'!'!!!<<<::{<<<:<444cejuurommuNSSSSROJJFEAAFFJJQNGMSSSd-----------******'<:cca|0cijovC", +"qki77cqjovofoovAJJSOJIIErlurhhlFEztAEEJJJOwjjjf9ttrtwwrojefoule33cc33:::::!::!}}!:!-'*-*-*-**.*...++@>,;;;%#%##%#@#%###%%##%%%%%%%#;%%%%%;;%%,,,,,],,,,>>>@>@'''++++++.******-***********-*!!:5jj9b5eijmuFQSSRQQQKEAEJJJQGyxMSSSi:'**--!---'--*'*-!7xCHBLSMMHHHC", +"oiij7ivojottvruJJQQJIIIEutujefjjAJzzDIQJOOOAumjjjutwEAuvvvvjec5544}!!|:!!|!::}!!!-'!-****-.**+*+*.+>>>,%###@############%%#%%%%;%%#%%##%@#%%%#%@##,,%,,,,,@+*.+**''''****..**'--.*-!}}}}~~11119orwuyMSRRSSQKJJQNyyvxMSSM3332<<''*--***-~}bovoojjoGGCvvyy", +"ooojffrjhjluwwEJOROIIIIIIzrljrlhltJIIONKFKJKug99b9bjomoji71|}}}~~~~!!!!!|}}}!~!~!'*!********..*..+@>>>@##,,###@#@###%##@#%%%##%%%%%%#%%##%%%%%%%%%%%%,,,,>>>>>///''@>*''+''**+*''*---'<:|!~~~~^1bjojj9996yRRRSRQRRyvoHHMRSSM33333<'<<<<':}7jfjojfhjjoojyyvvv", +"olfbe9ljlllruIOORRJIIIJJDzwttrujhhjvAvrrrAAKKmbbb^^b^^^^^~)~)}|~~~!!~!~}}}!!!!!!**'!-**-.*...++*+>>>@@@#@,####@####@#######%%#%%%#%%%%%@##%%###%%#%%,,#,>>>>>>>>>/]//////<:/>+'*+''+'!!!:::!!!~~~~19holf5559fbmHRRQNHHGxqoxCxSSMnoe3332:}}7ijojluttullrrjejoCvmu", +"wwrllltrruuruEOOROJIIIIJztutulje5b5bbb966oovKNn(bd(bb^^^^)~~})~~)~~!~}~~}!:~!!!-*!*-***..*.*'+*>>@@@@@@@+@@#@#@@@+@###@#@######%;%%%%%#%%%%%%%%%%#%,%>@#,>>>>>>@#>>>,>,,>>>],>@'''--:::!!!!!!!~~~59fhh577eee579jCSSGmvvGHyCxxMSMCGAytwAAFEEEzwEEEEzwzzAwtllfvwAE", +"wujj9jjejjffjEJOOIIJIIIOvjhfe557717bb66(dggqnCMn(8dd(^^^^11)~~~-=~~}~~~~~!!-!!-!--**+'**.*.-'@>>>+*@@@+++@+@##@@@#@@###@####%%%%%%#%#%%%#%#@#%%##%#%,#>,>,,>>,>>,#>>#,,;,>>],@*''*!:!,#>>>@@@>,>@,>,]]>>,,'''''!:!!!~!!~=}}7ifff77}55eefjvvvoijqCSNGGAGRSRSSSROJJEEEIIDEzzEEzwuturjrrrllhflut", +"1~)&&^<<2455tEJQIArrrlrrutulojoruuuvrmmmmnCCLLLBd(^^1b71^^1)^~=)~1~~-~~~---------=---**..'-'*+++@+@+@@@@+@@@##@@@@%%###%##%%%###%%%#%#%%#%;%#%%##%#>,,,,,###>####,@>,,>;],]>>*'!''!!-!-!!!!~}55eee7}}5c}}5hoCv7ijojjnMRRKFFGRSSQQOJJEEztututrjfhhfh95555555}~bfh", +"!&$$$&<':<<3zEJJEujjhjjhhhjuwumgggmmogggggpsss8d((bbb111711~^11~~))~=--~~-=---!----*+-.-'-**..+@@@+@@*+@@@@@@#@+@#####%%%##%##@#%%;%;%%%%;%%%#%#@,,>##>;#>>>#,,###>>,]]]]/>>'''''!!!!!!-!~!}c3e5571}3c}3eioo7bikiiiekjHRRKAvCNSROJJJEFzwtwwEtrhhfhe}4<::'''*=&c3", +"$$$ &<':2####,###@##>@>>,,///'*{-'*-*'*!!!!-~}}c35}}:}533ceii5}|1iki7cejeioNRQFFFRNKJEtrurltwtrrrjhje2:<<::<* $(", +"$ &<<<23tDIQIzrjjffhhfh99googgggmnnxxnxnnggggoo9bb117^111~~))==~--------****!'--**-'*..**--...+@@@@++++@+++@###@@+##@%#%##%%;%###%##%%%%%%%,,%%%%,,%#%#@#,,,,@>,,,2h<>*'****---*'!!::|}:3}5}}}2244ce3}4cie5cccikivjiiekvKOKNSNAAEJJDtrrlrhhe32:'{!--=---& $(", +"$$$ &[/<2hzIIQIwrljhhjhffffgoooooggggqxxBBddgggoggbbbbb1^^^)~~=--!~-==-----.---*!!*****-**......++++@@@++@+@#@+###@+@####%###%;%%%%###%%%;;%%;###%##,,#,,##,##,,,,,25''@'''-'--'''<{:<<442334}444c4c4333c777cccc4cqvoiiiikyCAQSSNJJAEIzwwurf35322<'!-=-==-= (", +"$$ &2[23jDIIRDwrllhjhjjjjjoooooggoooqnBxnnxyvgg6dbbbbb11^))~~~-{----=-!----!!!*{!-*-****+.+...+++++++@++@@@@#@#@##@####%%##%%%;%;;%%%%%%%,,#;,%>#,########%%,,,,/2}>@'>''*****''<<<22433eeec3343fc3<:!|))1)))))}}7poiiiikxvFNSSSOJEAAAAtrljhf3322{!!!!-*'- $", +"$$ $4325lIIIRIztrrljjhljojjhjjogooovxCxoqovGmoj9bbbbb^^7^))))==--------=-!!!---'-{-*-*.***+..+...@+@++@@@@++#@@+#######%%#%#%%%%%%#%%;;%%,,%;%,,%;,>#%%;;,;,,>/[2++@+.**++.-***-!!:|:<<<* $", +"$ $:e23rIIIQIEturrlllloggjjmojjooqoxCggggjoqii9b1111^^11)))))==--**--~|~~!{**{***'*-**.*.+....+.++++++@@#++#@++@####%##%###%%%%%#%#,;;%%;%,%####%,##%#,%,>,,/2:@++++.++++*-''--!!<:::!-!~}7|~!---))))))))))))~~}}1bxppnxokgMSSRQOJJJEzEzwzulhfe522<* $", +"( >/2'@+@#@@++@@>'!-'':!!!!~}}1~~--=-===&&&))&)))))~~~)}~}cqxxyxqqqCMSSROJEEEDEEztwturjhee2<,* ", +"( 'eljuIIIOOIEztruuuurmmmogomonnxHx9jj996ljgjf7c111111)}~)~)-===)|---****-...*--..-.''***.+.++++@,@@@+#@@#@>####%#%###%%%%%%%#%%##%%######,%##@#@>####>,><:'+@@+@+#++@>_''''{'*-~c7~=--==&===&==&&&)==))))))))))11bxyxxdgdBMMSSRROJEEzDEEwuuurljf32[<[[! ", +"$ ~etEDIIIORJDzEtuuttuuvmoommxyyHHki77ijoug9ieb1111711~))=)=-~-~~=-***--**..-.*.+....-.'*..++++++@#@@+@++#@@@@@######%%%;%%%;%%%##%##%#######@####,%#>>/['@@@@+@@++++@>>/_''{*~71~----=-==&=&====)=&&&)))~))^))1c77dxMxpqnLLHQRQQQROJDDztwrrrrtuuhh3233! ", +"$ ~elwzDIIJOOIIDEwwwwwAuvmmmmmxnxpb7e7efeibbie777111|c}~~~~)-~!~~-=-----**'***.**.*....-'*-*++++.+@@@++++@@>@@@#@@#%%%%%;#%#;%%%%#%##%###@#######,,,>><<@@+++@@@@+++@@++_'''*{k|--{---=--====&)))&))~~))~~~~)~)1c17kqNHxqnMMGKOQOOJJOOOJEwtrrlhlrulh332{ ", +"$ *hjwDIIIIJQOIIDzzwwwwAAAAGKNMLHdbbbbbee71771771111|}1|~~~~~~~)~~~-***--.*.**.*.-.......+*'@++++@+@@+++@+@#@@#@##%###%%%%%%;###%%%,#%####@#####>,>>>::++@+@+++@#+@+#@++_'{{-{p~{{---==^^(^^11777bb999bc<::||~|1117kpGKynnLMHGFKJJJIIIIIDEIFwtuljhurh22| ", +"$ =hutDIIIIJJROIIJEEEFAAAFKQQRSSxgd66bb17cc5}c1c}1}~}}~~c}|||!|~~~{-{---****'*.........*++.....@+@@#@@+@+@@@@+@@@#%###%#@%#%%#%%%%%,#%#@,#>,%@>,>>'>>><<+@@++@+@@@+++.+..+.+..*''{{bxxk|~~~~}1cciiiic5c77c433<42444000cii7mGHxMNHyAKEJEIDIEDDEEttutttzDDJFt} ", +" 'uJIIIJJJOOQJORJIIIEJJKKKNNRSHqoggb(bbbb^)1|||{:::|~~~}~}|:::::::'*{{{'{'*''''*+.*+++++....+.+@@+.@#@++++@>@@######%%#%#%%%%##%##%%%,,,>#>@%>>'*'''*''+'*++.+++++@+++@##@@@@#>@#%##%%#%######%%%%;,,;;,%,,,,#;,>,@@@@@#@++@+@+#@+@@@++.++++@@.+'::1oFyAuoi5}422<::|0c|44cccccce7iiikkieijCSSSNQNQQQOJJIIIIIIEEzzwAzzEEwr! $", +"$ $GuuIEwEDIIIIIOOIOQRKJJFKKQMSSnpdd(^(((((^^&&===-~~:'!::'!!::::::{!{:':{'''*''''''''+*+>@**.*+*+++++@@##@##>@#%##%##,#%####%%#%%%,,,,,##,#>,/>@+@@@@@@.+@++.+#@@@+@++++++++.+.*|55jAEAAuvvjje}|::!~||||~)}1}111177a|cc7xSSSSRQQOJKJIIIDEztrljlhrrrrruf! $", +"$$ 8AleAwttwEIIIIIJOOIJQRQOKKGMMLss8(((^(((^(^&&&====~~{-'*''!<'{<':!!''~:{'{{{''_''''''''+'''@++++>+@@@#%;,,#,,%%###%%%@%%##%%#%%%%%,##%,>,,//,,@@++###@++++.+@@++++@@..+.++.+...*}57hwtrrolmuvvvmoogg6b1)}~))^^)^^1((8nxHSSSNQKKFEEEIEDEEtwtrllhfeefhj3' $&", +"$$ 8j33lJzzwAIEIIIJIJOOOJORRNNMLSB8((((^^(&&&$&&&&&&&====*-*'_<_'_<<<<'''///___**'''***'''''+''>>>>@@@##,#;%;%,>%;%%%%##%,#%%%%#%%%%%%#%%,,/,##%,%#@+#@@@+++.+@@++..+++++.....++****!}5frwrjffjfjoooovomomvmmomvyyHMMSSMLMSSSSSNKGEFFEzDDEEurrjrhjhffhef3'$$$&", +"^$$ &3342FEEIEEEwzEIIIIJOQRQKRSSSSB8(((^)&&$&&&&&&&&=&&&===---'{''_>>//'__'''_<<<<>>>##,###,%%,>,%%#%##@##%@%%%;%#%#,%%%,>],#%#####,@@@@+@+@+..+@++++.++......*.***-!!~|35julfhfee5}55ee9bibqooyGKQNQOKyxnxLSSSSRNFAttAzwwttrljjlfehfeeee['$$&=", +"1&$$ &_:24eAwwEEzAurwIIIIIJJKQRSSSSB8((($^&&&&&$&&&&&&=&&===-==---*+'''>>>,>/_>'''''{!::>>,#,#,,,##########%;;%#%%,,#,,],##%%#######@@@#%#@@++.+@+.+............**-!~!::::eree5e533c57c17iqnvvAAAFKyogoooyLSSSSSSNGuwwAwAtrljhhjfeeeffe3/'$$&=", +"1(&$$&_{!:4uwuztjjruAEEIJIJFFFKNSSSB88(((^^&&&)&&&&&&&=&=======-=---***'@>>>>>>_>>__2//>,],,,>,,],###%%%#%%#%%%%,,,,>/>>@######%#@#@@#@#@@##@@++++.+.........-*****{!!~:>>>>_>>>///____<_'<____<2@#%####%%%%######@#%@#@#@+##++.+++....-..*'****!!!!:_/>/_:jjjfjfjfjjoovvqkccc7bpdbbbd6nLMMSNQSSRRQuuururjjff55353332[[{$$&=", +"))$$$$!!--=-9twlhf9jorAEJJJKQNSSSSSB8((((^^^(^&==========-=-===-==.****.*+.*+@>,,,>//>/>'>/'''__<____/_<3<,,,,,,]],,,,%;,##,#,,],>#%####%###%@%#%#%%@###%#@##@+@@@@++++.++.+*******'!!!|<<<444c3fvjvuruvjfc0|||}117bb1^1((8nHxLRNKKRROOKFrlll999e5cc34322[[:&$$=", +"=)&$$$!---===9lfeefjjuzEEEFKKGGNSSSB8(((^^^^(^))&==--=-=-----=-=-=-*****'.++>''>>>]]]/////////,>,,],,],,;%,,,,>,#%%%##%%###########@#@@###@@##@@@+##.@++++++****''*{|}cc7c443eei3ehjlhf322<<||)|~~|77)1)^(((snnCMGGKJQRJIJErgo99fe5}}4322<<<|&&&=", +"=&&$$$~=----==9e55b99rtuuuAFAGQMSSSB8(((^^^^^^^^&&=-----=---=-==-----**''++'>'{'__,]///////_<+.+++'+*'*'**!:|7iffeee23322//<':[23242<<4|~||||71)1^^(((d66nxxyFJJOOJIIIur99555c44<<<<''//_'_/]///]//<///[//[[2[//,,]]]//],;%%%%%%##;;%;;%%%%####@@@@#@#@@@@@#@+++@+.++'''''!|15eccei33222[///>*-==-!,>/>,,,///<[[[22//]]]];;;;;;%;;;;;;;%%%%###%###@+@%%%@@+@@#@+++@+*'''':|}c7e7}}2<22<[>>-==&===!<<<24<444|17c})~)b(dsnddnHxmommvFJQQJIIEu9be5c442<::__'**--{'__>__'___>_'___/[/2232[//>>>,>>,,,,,,,/<2[['//2222ejc///>>>>>>>>>,,,,,,]2ce[];;;]]]];];;;];;;;%%%%%##%%###%@@##@@@###@@+@++'::{|44432::<@>_>>>>,,>,,]/[<[]/];;;;;][];;;;;;;;;%%;%%##%%#####%#@#@@@@@++>>{|044|:!:'<<'/////<<<:'{-{!{**-==&&==&&==!<<<4ceje:||~)^)^^^(nCvCAvvvmrrmmEJOQzwto71c||::://_=~&{", +"-=&&$$$&==&&&&$$$$$&1999bb96gmvnnxLBLLLn((((^^^&^^)~|:!!!~~{!~{!'''_<''':{'<<<<_<232<<<<___>>/>>,>>>/>,]][//;];;;;;;/]]];;;;;;;;;;%%%##@%##@##@@@#@>>'':<44:::<:<<'//]]/<::::!!{-=---==&&&=&&&&&&&~:::5ji4<:!!~)))&^(pdgovwFwulllrrDJJKwtAoq77c00042:====", +"===&&&&&=-&&$$$$$$$$^996bbbdggoggsBBBBLLB8(^^^^&&&))~!|!~~-{{!{{!:{_''{:<<<<<<<<<_[<<<<<<<<_<___//__//>>>>]>,%,]]]/]]]];;;;;;;;]]]];;;;;;;;;%%%##@@####@+>____<<4:<:<<<>'!~::!!'-==-{====&=&&$&&&&$&)|4ii4<<<:!~|~))^dd((66muEEAurrrzIIJFtAAb7cc7eecc|=&=~", +"~~=&&&&&&==&)^(^$$&$(9966bbbdgogddssBBBBBxpd(^)^))~)~~!~)~~!!!!~!!!{'<<<_<:<<<<::_<<__<<:'{___'__//_/>_/_>,,,,%,,,]]];]]]];;;;;;;;;]]]]];;;;;;;%%#####@>___/<<<<<:<<<_'!!|:!!!!~~~{!~~====&=&&&&&&&(^bq::3<<:!|!~~~1bb^(bbb9outwwttwIIIKwuwh7}c55c5ec1c|~", +"c111^&&$$&)&)((&^^(((g666bbbbqnngssssssBsBspkb^^)~~)~~~~~=~~~!!!!|4:::!{__24c7<<<2<:'{::'_'''<<'''____>>>,,,],,>,;;]]];;;;;;;;;;;;;;;;;;]]]]];];;%;%;@____<'>>''!!!}}}::|!~~!!!)=&&===&&&=&&&(8d):<<<<<:|}!~177b^^^^71b9lruljlEDIIGutr53535333~~11c", +"c1777b1^&&)=)&(&$&$$(mvmggbbbqoqpnsssssssssspkb11)))))~~~~~~|!||}||!:::c333ci00:::<::':{:'{{:_'*{'___+>++@@@,,/,///,]]]];;;;;;;;;];]]];;;;];/]//]]]]]2<_/_<<<<<<<<[////>>>*''!!:}:::!|!!!:~~))=====&=&&&&(d8$))!<<2<>@@+.@+@@@>>>>//[32[/]];;;;;;;;;]]]]]]]]];]]]//3c332[[[<<<<>>'>*'*':}:::!!|:!~{~~))~===&=&&&$(8($&&$$~<<222!|771771111177775jlrlrutuEo5fjuljjhf}~~)~~", +"~}~)~))&&^^111^(^^$$&(gg66666gggpsxsppppsssdkkbdbb7^1))}:|~}10}||c00::::<4::::||{:{:::{{{:''{::{'+'+++@+.@++@@@@#>@@@>>]//[3]//;;;;;;;;;];]]//[///[223233fe3222[//[@''<<<''::!:!:!|!~~~~))|1117kd$$&&==&&&&=!:**!~~~}", +"}}}})=)=&&&$&))^^^(($$(6ggg666g6bxxppddppdsspddpkciccc7e7eoi7gkcc||!|:||{<<{:::|{:{!{:::{:::{''**'*+++++.++@@+++#@##@###;;;;;;;;;%;;%;;;;;;]]]]/[322233effhhfe3efffjf332<'>'_<:_'''':<{<:!|!!|~~~)1^77^&&&===&&=&&&&)c044|1111171111}}51155hhlutFf333[//'*----!!", +"!!~~~~~)&=&&$&))^^((^^(666gg69ogbxpppppddppdpdkkpqii7ecc7bi77cp7c||||::{'::::{:{!|{!!:!|||***''****''.+.+@+++.+@@@@###@#%%%;;%;;;;;;;%%;;;;;]/[/[3[[233ellhfllhe3e3fhjhjff3[<<<''''{!:<<::|!!||~~)171&=--&===&&&&$$(b^14440|c111115}}}}5155efhlwFfe32<@.++@@++++@@@@###%%#@%%%%%;;;;%%%%;][[23hfllff33ee333[2223333e3333fhjuumrhf9hljfe7}|4:|||0c}-!---=----!~|77c7ii7711115fffee55555fe5c:5hlhrEf32232[<'''**!!!", +"!!!!!~~~}!~~115f9jghe}}})1omvmvmmmnngdddddkpppb7kkbiikkkbkkbbopki777c|||||4::~|!~!~!<'{-!{--{'{{{{a''@@+@@+@+@@+@@@#%######%#%;;;;%%;;,3hrrlrljhe3333e333322[[2223e52333eiiffjuujfefhooof75}|0c~!!------!--|43cccc7b51bb17bejtulh555eeec3ellllzA33332[/<_''**!!!", +"'-!!!!!:}:}55e5he1111))^&&(grmmmvynnngqppdppppbikikikkkdddkbbxqdbbb777ac0||::|~~{{{@++@@@++@++@@####@###%;%%%%%%%,>}rrffhhhhllff333332[2232[[[[23332422ffeceeovojffiifjooof7|!!!!-----!::3cccc3c7fiibbbb9jjuzurllljfe5fhllllzlefh32[[<_''-**'<", +"'332flrh32/]];]],/[/2]]/]]],,]],,],////////[<2<<33322244ccc|:<440eicacciciieiifjoloffifjec57iff53erlruzzttwwrrrtzzztuuAlffee333efhjrllffhff", +"fee2233333535c3}}~}}}}}}}}|}!}}}}vyogguQQJEAAGCCGGynggggggoo9bggbbbbbb77bb^1117b|}1|~~)~~|~{~~=----------'+>'>@@@@+@'fffrwlh3333[///////[]];]]]]]]]],,],/>,>////<2<[2343434ei7}||:|4400cpkic7kjiicefoouyvmfje4435efjoohtEzDztwwuurruzEwrruErhfeffeeffhffhlhllrff", +"fhhffffe53533}3}}}}}}33}}}::::}11nxgd86mFQJEEGNGGFGCmngggmoogkggggdddb177bb117qb1))~~~)~~~|||~~~=------*''*''/@+#>>3llrwtlfe3222[[233333[//]]]]/]],]>,/]////>///<:<<34:4433fjc4!|{::|00ackqkiceiiijvoojh5ej544333eihjvAJIIEDzuurtuzIEtlrlrAlfhfeeffhllheeehfflll", +"rrrllhlff5ee53355333333}:::}}1^^^dxqdddd6uKOJFGQGFKGCynoqmogqggggdddbbb7^b777qb11)))~)|~||)||||)~~=--!---'*-'>.@/[errrulfee322[///223233[22[[///]/],,,/>/>>////>/_<234:444ei544|{:{|||0acccjojiiijvvvojffj54:433eieelAJJJJDwuruttzIEtllhhArhffffhhhhllhhlhffhlll", +"wtturllhlhef55e5ee5e5333}}}1^^(^$dxn6g6dd6mFOJEFOKKOFGvmmmoggdgggg66ddbb^bb7bg^^1^1111)}}||}||c1||~--=-!!:-<<@><[3rruhhf3e3[//];;]]/[/[[/]]]////[[[////>]//__/>////32:::43343<4||||00||acceijovoovvAujhjle4343eeffhrEIIJJJJzttutzEufflhflwhlrrrututttzrlllrrtwzz", +"DDztwurrrlljhhjhf55ffe55551^1^^^^gxqg666g866uKOJKOOKOKGyCvgogg6gggggdddbbb7bgb1b71^11c111}111}17c1c}~~~~!<<_/>>///222<4334444344||||||1acciiffovAAFAAvvvf335eeefjrzIIIIIIIJJEwtEwlhfrzwzKIDDDIIDDzDDDIDzEDDDDDII", +"Dzwtwrrrrrhrlhhhffef55511999^^^^(gxgddd666666mFKOQQOOQOFGymgogogng6gg6dbdbbgg^^11111111111)111111cc11}~~!:_2i2<[wzrlhhee2/]]/;]]]]]]]]]]]]]]]]]]/,,,],/]////[/>//[2223334<4:44440|0||||00cijjoouAEJEFAFvofhfifhlzIJJJJJJIIIJJEArltFKQOOOROJIIIIIIIIIIIIIIIIIIIII", +"OOOJJJJJIDDDwtwtrrhff999999^^((^(gnddd(66d66666mFORQOOOQKFGvmmngogogggddbdgv^^1111^111111111111a}1777c11}}cjl33wwtlfef3e[]]/]];]]]]]/]]];;;,]]]]]],]/]],,>>>]/[/[3334:4::::440400||||||7ivCKHCKOQQJJJJJFKFAAwwFJOOJJQQJJIIEwEEAFJIIIIIIOIIIOOQRSSRRSSSSSRRQOOOOQ", +"AIDDIDDDwEwAFEzAzwuuurlgg69(^^(66mxq6666dd66d6666uKRRQOQROKGCmnmmmgg66bbb6ggbb^1111111111111}1)11111c7c7oojrhfwIIzwlhh32/]]]];]/]]][]]];;;,]]/]]]],]]]]//,>>>////3eee4<:<<442cccc|||00coGGuvrrwJJFtwAFFFKJKJJOOQOJJJJOJIDEEEEJROIIIIIIJOJOJQRQOKFEAwttthlhehhttA", +"3effrutwttlrrjh9h9jllrrmojj9g966gmyggg66(d66666666gGRRQQRROKKGymmogg6g66ggydbb77^b111^1^111111111177ccjvvvFtrAAlrwtwtle2]]]/]]/]]]//]]];,]],]/,/],],],]]/,/,>///<223222224422333c400c7vKuvvAAwEzAwutrvuFJJOQRRROJJJIIJIIIJEIIOOJIEIDIIOJJJJEzwttrllhltue333333hh", +"hlfeeefh5hfhllh9h999999999996669gvGvmmg66666dd666666yNRRQRRQKKKymngggogggymbbbbbbb^b7777111111111117iovyyAJEJAh32[5lwrr3/]]]]/////[]]];;;]]],,,,//,,,,///]>,>//[3232222<<24223eeeccceyFuvuAuAEEzwtrrlouFJORRSRRQOJIIIJIJEEEIIJJJJEIEIJOEEwullhfhfjhrrwEr33333fll", +"ljhfefe33333515b9f9995777999999(6gCmmmoog66668668dddqnCNRRQRRQKOGmgggggomG6bbbbb7bbbb1b77111^111bbiovoofjFJJJwje2/[[ewth2/]]]///////];,]],>]>]]],]]]]]//>/]/>//333222222<<<2[3fjji35AEurwAFAFEIEurtuluEJORRRRQQQQOOJJOEEEEIIJIJJOJJJIJztullhhfhfhjrrtEDIrlrurwzw", +"lffe5333::}}}}}}1117b5111b^^^^^^(6xngg6g669gg66666d66gnyCNRQRRRKKGvmmmxmCyggggbbbbbbbb11b1177b69qfi7e4eefrEJAroje32[]3ttf2////]][/]/]]]]],]]>]],>],]////>>////2e442<<22<:<<[23eluhitJttFEAFAFJEulrutFJJQQOOJJOOQOORROJEEEEIIIDEJQOJEEEuulhffhfhlrrtzEIJJOOOOOJIt", +"heee34::::!!}}}}}))~~)1^1^^^^(^^(6ygdgggg666666ggggg66nnnxGQQQQOOJKCvmyyMnqggqgbbbdbbb7bbdgggjji7c|:4433flKFrvoiie33[[5zrf3[/[/]/[[]],],,],,>>],>>,,//>//>//[2ee2<<222<2<22333eejlwJIEKJJFKFJJvoluFJOQOJIIJJJJJJORQOOQJJJEIIIIJJQJEEJtujlhfhhrEwruEJOOIIIIIIJRDr", +"e33e334:|:}:}}}}}~)~=~)=^^^^^1(^(gndb6666ggg66666666ggmnxnnyGNRRRQJKKGCGMmoqqonxodgddqoomovomgic0000ic0cevEFojjfjicc4[[eAlf3[/[2[//]],]],,,]>,,>>,,,>>/////22ee<2[<<223222322e333lEDIIIIIEFKJAmtFJOROJIIIIIIIIJQKJJOOROOJJIIIJJEKOJIFuurlrrrutzwEKKIIIDDIIIIOKll", +"323}}3}:43}:}}|}~)~)====&))&&&^^bgng6d(b6d6666gggnggqgonxHHCHGGQRRROOKKRMCyxxmnyyyCCyvmmqggbb7acacccc0cjjAvFuvooovoqqicclArj3222[[]]>,,]],>>>>>>>,,,>_//<2243e3<2<22223332423323fADAEIIEIJJOKFKJOROIIIIIDIIIIOKEAFFJOROOQOOOJEEEKQJJzwuurrwzzIJJIDDDIDDzDJOKwhff", +"333:cc3}:|}|~|~!~)))=~===&=&&$&&^^dd^bb(6d6d6d66666666gggnxnnCyCGNRRRRQRSNNQNNNQQNNMMLHBHxxxsppppkkkkkpvyAvyGyvoqqyxqqoqiyFuoiice4444022222_2________:<42442e22<442232eee53ee225uDwzwIJIIIJORRRROJIIIIEEIIJJFtAwFEFJORORQRRQOKEFQRJEEztEDDIJOJDDDEDIJIJJKFtlff35", +"22::43c4}|c|!:!~}~~~)====&&&&)))^(d(^((^((((((66666666668gns88nnnyFNRSRSSSRRRSSSSSSSSSSSSMnnxpxxxspppppxGCovCCHCyxxxHCxqxvGFFFvookkkiiccc0c0cc0400cikiiiiiijiccc4ccceeeffeee3cehEEDwwEJJIOQRSSQJIIIIIIIIJOGtlrutAEJJJJJOOQQOQQOQRROIDDEIIJOIDDEIIIDDzuttrllfe35f", +"::4::4}:}}:!!!!!!~}~~~=))&&&)))&^bd(((((((((6666(((((b((66gnnnnnnmvuFQSSSSSSSSSRSSSSMMRRRMxqkkeiiiccccjovoooooooxyxqqxCCCxxGyuvoicc424044222444000c00ciki0jicccciiiiqooovvCvvovFJFJFFEJQSRRSSRQJJIIIIIJJFtvomvuwwEEIIJJEEJJQQQRSSSJIIIIOOIIIIDDzDzzDrrrlhhff3233", +"<<::::::}}||}!!~~}!==~)~~)&^^^)&^bdd((((((((((((((((6bd(666gxxmvmvyyvAGRSSSRRRMSMMRMSSSRRSCvyvvmqkkkicifjfiiiijikkkkpkxxCxyHKGAvqpkiccc40444044aa44444c3cce44440ciciikiqjooovFKQOOJJJQRRSSSSSSSOOOOOOOFwyvvvvvutAEJIJJEEEJEJORSSSSROOQJIIDzEEDEzzttrrrrrffe3322[", +"/'<:::!:}}!!|!:!!}!~~~~===&&&^&^^dgo(((((((((((((((^(999699gvxyvvmmvmmnCHNRSSSSRNHCHGNRRRRHyvvvvvyvoojfjiiji5eiik400cioxqxxyHNGGoiiiic0cciiii044444440444c44<:44c4ccccciiifjjoKROJOQSRSRRSSSSSSRRQOQKGGGGGGGGKFGKOOJJJEEIIJQRRSSSRSSSOJIIDEzzDDzzuurjhlhe332222/", +"/'<2::!2:}:}|}!!}!!~~~~&)))^1)^^1bddb(((((((((((((^99j999996gqnnn6d8qnnxnxHSSSSRQKFGCCNRRRNvvoqqoovvyymmjiee7eiie00cciikiikpxNGKGvic044000400000400000cci34044ccc04cc4eiicijovJJQRRSSRQRSSSSSSSSRROKOOOQQQQQOQQRRQQRRROQRQRSRRSSSRRRRRRQJJEzzzwwurlfffefef32[3[]", +"2<<[23:}4}}|}}~!!!))~~)^1^))))&&^^b(^((^((((^^^99b9999999b^(((8888888psxBMLLMLNRRRQQKGQRQRQyoooooovovAAujiieceiiiceciiiiiiicioCGGGoicckii0440424244c04ccccc0ccciiikiikkqqpoyCQRRSSSSSRRRRSSSSSSSSRQQQQRQRRRRSSSSSSRSRRRRSSSSSSSSSJJORRQRRQKAAwtwtrffeeee33e323[[", +"[<2['::}}::!}}}~1}5111))=&&))))^^(bbbbb(^(9977b9991b1^((($$$$$(8d8d88ddsLLLLHxqvGKORRRQRSSRMHyoqijoxvvFFvfee7ei7eieikkikicii00oGGGyqi0cc0iiiic0444444444cckkkpxxxxCHCyyxxxyGRSSSSRRRRRRRRRSSSSSSSSRROOOOQRRRRRRRSSSSSSSSSSSSSSSSRJOOOQOOOQQQKAtwtrhfe53233e332[[", +"2<,]<:}551^&$$$)$$$$$$$&$$$$$$$$$$&&&$$$$$$$$$$&&&)&bkbbbsBBBspxyvkc1111ikkyH77ovuFJJOOQNKKxqkijjCGe>>>>*=&&=$&&$$$$$$$$$$$$$$$$$&&$$$$$&&$&&=====-&dpbbsBspsp7oAm77111kbdGo7ec7iovFOQOJJGvvGKq4243<:__>+>>'-=&$$$&$$$ $$$$$$$$$$&&&&&&$&&$&=====&===$dpbdBBpss77mCobnb117byy7iiqoojvwGQJIEKQCo704444:_//_///2ee3323jjouyyHHHMMMRRRSSSSSSQOOFGGGvojfoEOROJJJJOOQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRNRSNNNvove53355efe33ehjrojjjiiec42<<_<{{}i", +"|bpHMHx7|:':!!!-!{:-****'*++>>>>.=$&$$$$$$$$$$$$$&$$&&&&$&&&&=====&&===&&bkdsLssxp77oymNn11i7dH7kkkojmu9bvGGGug7ceicc444c2__][/ee433c33jjhijjipyMSSSSSSSSRSRQQKQHvovvvFORSOOOQRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQNGyoijve55e35effeef5e33352<:<44__22:::|:", +":{{|kxHMCk|!!!!:!!!---*'*****''+>>.&$$$ $$$$$$$$$&$$===&&&&)=&=&&&&&&==&&&kkdBBssq77kvCQKd1k7kGi77jjjwj77ej9}}c04040ccc400022/<32333444ifffejfxNSSSSSSSSSSSSSSRMHCCyGKQSSSQORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRMHyFvjifjovfeehe3332222[/<2[/__<_<44:::2::::", +"_::{{~7pCNHqc~|~~!!!--**********'@>>+=$$$$$$$$$&&&$&&==&&=&&=&&&&&=&&==&&&^kksBBpskii9CGQGb779Cbiilrto155ej7!{|4444::4ccic0iqif3c22222c3ihlvGMSRQORQJKNMSSSSSSSSSMRMRRSSSSSRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRNNyojhAfifjjjjo52242<<[//<[<<[[/@'>>>/_2____:__4", +"4_a__{_{|kxMNxb1~!!!~!!-***----****++@@*&$$$$$$&$&$&=&&===&=&&&$&&&=&&&&&&&^bkBBBpkk77oGNOvbioymiirwv5}11fj~'*{{'<4::<<3iiijkvyoi3433223jHRSRQOOOOJEztmooqxHSSSSMLMSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNNGvjifhruffec5cce:>>_//<[<[2[<@@'*@>@>>/>>_::__", +"___:a_a__:{7pHNHn1)|!~=~!-*--*-******+*@>*&&$$$&$&&&&&=====&&&&&&&&&=&&&=&&&^bsBLspki77vFQK9joqx9jAt55111he:''''>>':<44243effyyyvoii5iyMSRQOOQRQJEEtuji44ckokqCMSSSRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNAmorof5fl2<<<<::44:<_/>''>>//,///>'*>@+>>*>>+@@+_'_", +">____{{|a_aa|~dxMNHd)~!!-~-!!-------*'.*''>*-&$$$&&&&======&&&&&&&$&=&&&&&&=&1dBBLsdi77byOQCojoyjuF97}}7597''___//>_>___<223fovvvvovHSSROIORRQJIEEtre4|0443ioovoxHHSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSROQRRNGrrmjff342h2_<<<::|0|:<_''''>>////>+@+*+++@@@@>#@++++>", +">*+@''____|aaaa|7sHNHn7~~~==---~------**'**'>'=&&&&&=====&&$&&&&&&&&&&&&&&&=&)1dBLBsik77oFQQujmCjFj157}55e5**_//_>>>>>''<4ce5efvyHSSRQJJORROIIIJIJjcc0004ccciovyyCCNSSSSSSSSSSSSSSSSSSSRRRRSSSSSSSRRQKFCvjee5e3332>>@+@+'", +"@+@+++*'''___{aaaaadxMMyb1~~~~==--~--!--****'''_*-&==&&=&&$&&&&$&&&&&&&&&&&=&=&bnBMBbki7iFQRKjoFmm1}55}}55}''>,___>>>'>_>/4efmCMSRQOJORRRJIDIEEtwwfcicc4ceeiiejvGFQSSSSSSSSSSSSSSSSSSROOJJJOOOOOQKGCmoofi33222442<4e/<{{::{{~||!!**''>>>>>'+...@@+++@@@@@@@@@>@.", +"+@++++.+..*''{_{||aaabsHMCq7~~~==---!!||)---*'*'_>>*-====&&&&&&&&&&&&&&&&==&)~)^bxLMsikiivQSRvoFo7}5e75}55!*'>>*'_>>>_>//3eoMSSROJJORRQOJIEAtwujijjccccciiiiiifjvFSSSSSSSSSSSSSSSSSRQOOJJJJJIIIIztlfeff3322'.'-++++++++@@@@@@@@@@@", +"@++@+.@+....++*'{_{|aaa7pxHGnb1~)=-=~~-~||=-*--*_///<{====&&&&$&&&&&&&=&&))))~))1pBMLpkkijGSSGvFic|cfe5557-'>''>>_//<225oMMSSRQRRRSSSQIIEwvvvovjeeoieiijiiiiiiijvKSSSSSSSSSSSSSRROJOOQOOJJIEIEAtuje43e332////_/@@@@@@@", +">@+++.+@.+.+....**{{{||||7bpHMCq1)~~~~~~-)~~!--*>'<:2__'-=&&&&&&&=&=&&&==&&))~)))bxBSBkqiiyRRSCyic}}ejf5e5'>_'_/'<<<3jyMSRRQQQRRSRRQQROzuhii3covoijjfiifjjiijjjvGRSSSSSSSSSSSRQOJIJIIJJJJJEAwlohfe3/2322@>+++.@..+++.....-**--{~||77pxHHni1~~~~=~))-!!**'::'_//_'-=&&&=&=&&&&=&)&&))~))))kBLLpqqjoQRSNv77}}efe5e!_>>_'<23fyMSSQOOOOOQRQOJDIJRKro3e340cmojovyojjiiijjovFRSSSSRRSSRRSROOIIIIIIEAAAAvvojiie3>+...+++.+....-..**-*{{{~akppHNyg7})~))~~!-{!!!!'''__'''-=&=&==&&&===&=)~~~))~1sBMCqxvoGRSRo77}ceff5f'''<<25mHRSROJJOJJOQQOEzzDIJOlfjiiccceioooovCoqjiijoyFQSSSSRQOJKQRQOOJIIIIIEuurleiijiij32//<<<>@..++.++...........---{||a1ppxMHn971~~~~~::!{!{*'''''___*==&&&====)===~~~~)~~^BBMxyyvGSSMj77cefjfhe<<::fCSRROJOJJJIOQQJAtEIIIIIl2<24ciecccfAwvmvvoovvvvwKSSSRQJKJEEJQRRJIIDEzwtrjee32cecci42*+>@++++@+@@+++@@++", +"#@@@@+@+.+.+++.+.....+.-..=.-=={||1bpsHNCok77}}~||!!!!{'!{{'__/_*-&=&&=&))=)~~~~~|~)sBMCoyxyRSSo7i5ejlhr::5yNQOQOJJOIIJQQOJDzDIIIzlfh[22[<2<4ccijAtromtAyvyFKORSRROOJFAFAEJJKRQJAtulrjfe22<443c32<<_<<<_<<_'_#++..+.++.........-...=---{|a7pBHNGyqi7c1}~}!!!!!!!!'<____'-=&&===~~~~)=~)~~)BBMxHyoNSSyeieeorrumHROOQOJJIIIJQQJEtlrrzzuff333/{:<[[2<<4ijowtvovwutFEORSSOJJJJJFKEJJFFFNROAvljh52//<422244_/_<<<<<<{'_e<{!~--{------!!--!!'!!--*'**'*@++'@@++++@+@@@@@+@#", +"#@+++@#@>#@+.+.+.+++....--..-.-=====~~17pBHMNGvjbc71}||!!{!!!{'*'___'-=&=)~~|~==~)~!!dHLHCvqHSSCcjjrwFQROJOOOIIIIJOQOJzrhlltwzhe3222/<<<<<[/[2eeeeoAwmrAAzEEOSSRQOJJEJJJJOJFAAvCRRGvhi2_/<:42<<2<<<<:<<:::<<3:{!!!!{*-----~-~~~)!-!!!-!-*'+*++@@>++@@@@+@+@@++##", +"@@@+++@@>@>@.+...+@.......--...==------=117sHMNGCofb1c}}|~!!!!{{{**'__'{~~)~~{!~~~~~~~xBMxxqCSSCjAFQRRQJOQJIIIJOOOJDthehhllllr332[22<<[<[<2/2332333jwurvAIJKSRQOOKOKKKJJOOKKGyvyFNMGyc<<:<:<<<<2<<<<::<::!<24:{!!!!!!{-===-!--~~~1}}}}3:'.*'+@'++.+@@@@@@+#@#@@#", +"#@@+++@@@@@>>+...+++.......----==-------==~|7pHMHCvuof771}}:|:!!'{{{''_<@++...+.........-------------=-=~1kBLHvmmmof7}1}}:::{!!'''{{<_{~~~~!{::::|xLLCGySSRRSRRSSOQRRQJJIIAl55ee322[<[2[[33/[2/<'<'</'<<23ff533[2233fftIIROIDwrrwutwzzEuuujhjfifiiibkvCiccc0||444::::<4:e:<:::{{!!!||!:~||~~||!|:!!!!!**'''++.++@@+@+@#@#%######", +"@@@@@@@#@@+++@+++@@+.++......---=----------=--=--===-^dBMHxjibhjffe534::<::#@#@>+++@.+.....-*.*..--***-...=.!!!!}}---=-~^xLMCofi775e537eeijjjouEJJQRRNQNSSRSSSRQREtlj153}~=-!'!!-!'<'<'<<[[[3332////2f32ee32333fjfAJJOIIDtutzzttuwzwtlAwjee3ee335:2432:40c42:<<<::<23<::{!!!!!|~~~|}~::!}1-!{-!--*'+++*@++++++++#@@@#@@#%##@@#", +"#,@@@###%#@@@@@@@@@@#@@@+.+...***-.-*.*..*..*!!!!*!!------=)^nLRHofffeeeiffjjuAKOEFJKFFJwmMSSSSSSRKmg1}}!----!:!!--!'''***+.*-****.**-.-**!!!!-*-!*---!-----)nLRNyvfeeiflwFKFAwwFAJJAwuvHSSSSSSNm1}!-==---!!!----!'''<_'<[[2eh[////[h3eeee33[[eeerKROEultDttzDwwwEIErf3ioujhhf55771c3544444c444<233<44||||!~}~|!-!!!~|!:!:----.-.''*...++++++.+##@@+@@#@#@@@##", +"####@@@@@#@#+@@#@@@#>@@@@@*.+.+'*++++*.-*'*!!!**.**--***{{{{{~!~)8LRNGvvyFKAurvuFEJJAuuAzEFSSSSSSm~~-===---'!-----''''<''<2[23e3[[[[[/h3hfe3[[[3eelEORJwrjfwJwtzEJEEEIKvqpkoHGjjjjjfic55}44<4:4432e34:4}|||}|}}|!!!!!!|!-!!!****-.+.**.+.+@@..++@@@@@@@#@@##@###", +"#%@##@@##@#@@@@@++@#@@+++@>'+.*'**+''>>'_<<'''''*'*''***'*!{{-!~~~~8LRRROAtuvuFFKJAutwEEIIOSSSSSM1=-==-=-'**=-----''!<':<<22233322333[jfee2/[[4eifwIRQIwrjluFEEEJJEwwEJQHCxovFAvfiiie5534444:::44e5:24|}}|||~!::!!!!!!!!''!!''''*.*++*+@@#@@##%;;;;;;;,;%##%%##%", +";;;,;;,%,#%@+@+++@@+@++++++''>+':<<<<<<<<<<<_'''{::{|~|79myMSRNFGKJJJJtrutwwwEJRRSSSSx===-----*----***'''<:22<222533335532'''*''++@+++##,;;;;;;%;;;;;;]/];;;;", +";;%;;,,;,;,,,,%@#@#@@@+.++@+'@...**-!!:'!{:::{{'<<<:<{<<<<<:443cfruvlooGRSRSRQOJJAAwAAFEJRRNSSSM(-----------*'*'*''<:34::24efjoooqkkc0oyyqooqqjjuJOROJIEwvmoAwFEEAEzEtEOQAvfjfgwullojff5334::3ff34c43::::::::|||}3:!{**-**-*'*-**...+++@#;,;;;%%%%%%%%;%%;;;;;;;", +"%%%;%%%%;;;%,,]],/],,,>@@@@@'''+++++*+**.****-****-*{*'*'*!|||emoofffjmvuKRSSRQOOJzAEJJJQKyxSSSMc'*----!---'-**'**'cnxHBLLMMGGGHxqki7aioovjfjoolJJRRJJIIulrrljlGEwwzEwEOJOwojjf9uuruwtljf55imrj33354c}::::!::!|}}::!''**.*-**.**.*.+@@#,;;%#,#%%###%%##%%#%%%%%%", +"%##%%#%%##%%%###>,,,,,],]/'>>++**.'.''*'.***.*'**-..**!}}}}1}1111fluAAMSRRRSNKJJJQNCyxxSSSH233<'''*---*****~boyxokkvKNyvvyvvkii77oofouurrrEJOROIIIIrrwjffjlwJzwEDJOJOOtrmjjjutwAFwvvvvrje5544c|||::!|!:}4!~!!!{-*-*..--***+*..@>>,,%##@###%##@####%%%#%%%%;", +"%%%%%%%##%%%%%%%%%%%#>,>,>>>>>////>_''*+'+>*+''**+*''*-**'<:}!~~~^11bfojlg96nMRRSSRQQNHvvGHMSSSC23332<'<<{'''!1iijoiffjomovCvvvvoooofivmjomtAuwJJROJIIIIDzrjfjjhjtJIIJROKQJOAoj9999mvulofe9}c}}}~!~~!|!~!}}}|!!!!'*!!**-*'.*..+...+>>#@#####@#@%@@%#%#@##%%%##%%", +"%#%%%%%@##%%%###%%;,;#>,>>>>>>>>>/]//[///:<'*'**+*'+'-'!:::!!-~~~159jmlfb1b999ySRRORMNCoooyHHSSHie3333<:::}7fjjovuurojolfejvGvvuoofb57lhhjhjrDIJQROIIIIOIEwttutljhltKCuuuAFJKmbbb^^^^^b^^~)~~}||~~!|~!!|}}}!!!!!!{'-!-'-..**.++..>,>@@@##,,%#@@#@##@######%%%#%%", +";%%%%##%%#%%%#%%%#%%%>@#,>>>>>>>#>#>,,,,>/,]/@@*''*'::!:!!!~!~~~~19fjh977eee759mMSRymvHNyxyxxSSMNGyvvuuuuAAAwtAEEzAwwAttujffvutAtwuoofwururuuzQORQJIIIIJDttwwulfeb59eb99gvoyKQndbb(^bb^^^)~)}~~~)~~!~~~~}!|!-!--*{*-***.-*-**++>>>>@>@@@+@@#@###@@@@####@#%####%", +";%#%%%%%%%##%%,,#%%,,>>,>>>>>,##,#,>>,,;>>>],@***'!:::!~~!!}}~)15fhfe555ife55fhmGxSRGvovGMHCHRSMvvuuFJIIEIDEEDIDwtwtDDEwtuwlAJIDEwllofuhjljhlAJIRJIJIIIJAlhfe557577bb6(6d6ooxHMnd8dp(^)^^11~~)~~=~~~~~~~~!!~!!*---**'+**.**-*@>>>@*@@@@++@+@@#@@@@@###@###@###%%", +"%%%#%%%%%%##,%##%######,,>>>#@>>,#>>,,;]]>>;>''''!!!!!~~!!~~}~7eff971}55eefjovyo7knMRNyyyKRMNSSRQOJJEEDIDEzzEIEzztwwtlurrrujltwwrlb^^^3<333ehEIOOIIIJJJJulhffe999b7b96666d6gqxLLddbd^^(^71)))~~~)=~}}~~~-=~!*--!--***'******>>@@@@+++@+@+@++##@@#@#@######@###%%", +"%%%#%#%##;%%#;%##%#,,,,>#####>#@#,>>,>,],,]>'''''!!!!!~!!!!~15eeef71}555}efoCokijojoHSROJKQMSSSRQOJEEEzwttwtrljlhhlhe5fheff57foh71~)&&3<235erEDQIEwtrrruuwulljlmvummmgmgg6nnBBLLdd(^^b711^^})))~~11~~~~~=------------***.*'*'*+@++++@>+@+@@@#@@@@##%#######%%%##", +"%%;%%%%#%;%%%%,##,,>#,,,#>>>##,##,>>,]];]/>>'''''!'!!!!!!~~}cc55771}3c3}efjoqiikiiiijxMRKFuvGRSQOJJJEEzttutwrjffeh5}::::'''-&)c4|=$$$$2'::<2uEJQItljjjjlhllrtrmgmmmmmoomooxxBBs8((bbb71^1^11^1^~~)~~---==~=--------.*-.-*--***++@@@+@@+@+@@@@#@+@#####%%%##%##@#", +"%#%%%%%%%;%,%%;%#,,#>>####,#,#@##>>>>,]///'-'-''--'{!!!!-!}}335}}}}c3}ceiiec17kki7cijiqCRRKyFGSQOJEwuturwzwtrrjjlf:2<####,,,,>###,,,,23/'***''''-*{!!!|}3}5c55}}:55ceicc}}cc1cii7c7jeeivQQQKuRNAEEtrrrtrhhjjhje}:- $($$ $2'<22fEIOIEwrlhffhf999jggmmvuymggg6ggnnpd66j9bbb1^111}}1))~~)--------{--!!**-***'*''****++.++@++++++@+@@@@+@@@@@##%%@#%#@#", +"%##%%%#%,;%%%%,%%%%%,,%#,@@#,,,#@>,,,3h<'*'*'*--*--'!!::}}}}c5}}}22c4ce4::c55ccccikioiiiioGQKGRSGyAEEEEurljlhh52>,,2e'>'''*-*-*!{''!:<:::43}:}:<444c4333eeeeeecc0kqvoiiiioGGFRSRFJEEIEwwtulf5e32:{!!-=-==-& $($$$ $2/<,#,,#####%,#,,,/35@>>>''****-''<<<<2233eeee353ife3<:||1)})))~}|1ivoiiiijxAKRSSROEEAEEwullhfe322,/2'@@++*'+***-*'':::|:222>= $$$ $:323hEIIRIztrrlljhjjjjjhjjogooooxxCqqoxGyoo99bbbbb^11))))~=--*-=-----*!!---''{-*.*.***+..+...@+@++@@@+@+@#@@###%##%%%#%#%%", +"%%%%%%,;%%%;%%%#%#,%,#%%%;;,,,]/22@+++++++++-*'''-!!<:<= $$ |e23hEIIQIEturrljjlogjjjlojjooqoxCnooojookibb1^b1^^^1))))))=---*---~~~!!!*{***''=****-*+...+.++++++@+#@+@@++@#####%#%#@%%%", +"%####%##,%%#%######@#@###,,,@,/2'@+@##@++++''!*!!!:!!!!}~11}~-======))))&))))))~~)1|}7xxxxxqjqMSSSQOJEEEDEzzwwurjhf33<<<<_>= $( !ee5rDIIQJIEtrurtrrlmmojjojoovonCxgoog99bbb9k7c11^1^1^))))==)----~~!!*******-***'**.***......++@++++@##@###@@#%%;%%%%%##%%", +"##%##%#,######,%###@#,####,>><:'+@@+@@#++>__''*'''*~~}71~-=-=====&=&&&))&)))))~)~)))17dxCxndgqHMSSSROJEEDEDEwwrtrrjhe32[<[/= $( !3hhrEIIJQIIzuurtuurrmmoggmoooxCHp9j969gf9jjb7111111)~~)))=====~!---*-*-.*.*-*..****'**++.@+++@#@+@+@@##@>####%%%#%#%%%%#%", +";%%%#%###%#,###%#@#@##,%#>,/<<++@+@@@+@+@>>>//''{*~c7|----=-=====&=&=&=&&))))))^)))1c7bqCHndgnLLNRRQRQOJEEEztwurrutulfe2233~ $ =3rzzIIIJRJIzzwuuutuummooomvxxHMqiibb9juojiib7111111))))))-~--~~---*-***..----...-.-***..+++++@@#@@+@@+@@@@@@@##%###%%%%%%", +";%%%#%%##%########>>#%#>#>/<'#+++@@@@.+++@+>_'*'{{k)-----==-=====&==)&=))))))~~))))1c1ikyNyqqxSMGKQQOOJOOJJEzwrlrllrurjf232- $$ &5lwwDIIIOQIDDEtwtwtwummmmmmxnxxbbe7e9fj9bbe77711c}11~~~~~=~~~~~---*--**'.**.****.....**..++@+.+@#@++++@@#@@@##@#%%#%%;%%#", +";#%%%%%,,%#,########>%>>>2:++@+@+++@@+@+#@++_'**-a7{{{---===&&)))^11}1117b1|:|!~|~1111bkqKKxoxMMHGKKJJIIIIIIIEEwtrlhhrrl322- $$ =5jtDDIIIJOOIIDzzwwwAwAACGGGMLLpbbb5bie771777711}1|1c|~~~~~~~~~~----{--.*.**.**..-...-.+*'>++++++@@+++@+@@@@@@#@%###%%%#%%", +"%@%%%%;,#,#@,#>,##>,>,>>>[<@#+++@+@@+++++...+.+..'*{{~sxpc||~|}1777ijiiee575c3344424440aa7ikbCNCCMGyyGKJJEIDIDDEEzturrttEEJJtt) $ =}wwwIIIJIQJRQJJOOIJJJAFFKGMSSn666ddb^7111|||c||}~)}~|}111|||~!~!{-!!-*{*-'***.**-.+....+.++..++++##+@@+@+@@@@@@#@##%#@###", +",%##%##;#,%,###>##>> c #544F4E", +", c #5A5553", +"' c #5F5353", +") c #605B59", +"! c #655A59", +"~ c #666160", +"{ c #6A5F60", +"] c #6B635D", +"^ c #6F615D", +"/ c #6B6665", +"( c #706465", +"_ c #756A6A", +": c #736C65", +"< c #716C6B", +"[ c #786A66", +"} c #7B716B", +"| c #777271", +"1 c #7C7071", +"2 c #807771", +"3 c #7D7877", +"4 c #827677", +"5 c #827D7C", +"6 c #867D77", +"7 c #877C7C", +"8 c #8B837C", +"9 c #898482", +"0 c #8E8282", +"a c #90827D", +"b c #938983", +"c c #8F8A89", +"d c #948889", +"e c #978F89", +"f c #95908F", +"g c #9A8E8F", +"h c #9E908B", +"i c #9B9694", +"j c #9D968F", +"k c #A09495", +"l c #9F9A99", +"m c #A69A9A", +"n c #A49C95", +"o c #A39E9D", +"p c #A8A3A1", +"q c #ADA1A1", +"r c #ABA39C", +"s c #AFA7A1", +"t c #AEA9A8", +"u c #B4A7A8", +"v c #B9AAA5", +"w c #B4AFAD", +"x c #BAADAE", +"y c #B9B4B2", +"z c #C0B3B3", +"A c #BDB7B6", +"B c #C1BCBA", +"C c #C6BABA", +"D c #C4BCB5", +"E c #C6C0BF", +"F c #C9C1BA", +"G c #CCBFC0", +"H c #C9C4C2", +"I c #CDC7C6", +"J c #D2C5C6", +"K c #D2CCCB", +"L c #D7CBCB", +"M c #D6D0CF", +"N c #DAD4D3", +"O c #E0DAD9", +"P c #E6E0DF", +"Q c #ECE7E5", +"R c #F3EEEC", +"S c #F9F4F3", +"li93::|9ic|{>-%%%$+. .@%-*%*,),,>-%*>~3gquqmmikuupc3|3cg95coAIMMIKKKIEABEIIIKKKHEBEHIKMIEHEIMNMNNKKIHEEEHIKIEEEKKKIKNOOPQQPQQQRRQOOOOLLLKFFEzzxvvvssssmmmmmmmssssssssssvvvvvvzzzCFFILLLLOOOOPPPQPOOLLFFzvstqqllkgggddgdehquuuwyAAxzyyzAwwplf777225foolifffifcci", +"fi953}<3fl9<,>%#$#+. .#**%%-)),,>%$*,_0kqqqmkkqupi1(/|0c59itEKMKIIIHHEEIIIIHIIHBwwAAEIHEEEKNNNOOONMKHEBEIKIGEAAHEGHFKMMOOOPPQRRQOOOOLLKFIHBzzvvvvsrrrmmmmmmmrrrrrrrrrrrvvvvvzzzCDFHLLLMNNOOPPQQPONLLFDzvspmmjjkkggddddhehqquuyAyuxzwxywwpoi9576329ioliffffc99c", +"b0c955|<5ff3~>*###@+....@%*%%%>,,,,-%%-)_cmquqmkkuuo9<)~|9550iwEKKIIIHHEEIIKIHEEEBwwAwABEBBEIKKMOOOOONKHEEHKMIBBAEEEGEFKMNOOPPPRRQPOONMLKKIHzzvvvvsssrrmmmmmmmmrrrrrrrrrrvvvvvzzzCDFHLLLNNNOPPPQQPONLHFCzvrrmmjjkkkggddddeejquuuAyuuxwwyAwwpof950059iooifcifd098", +"799dc9|(/|99<,-%#@@#@+++@$**%%*>>,,,-%*>~3gmqumkkmuul3/!/35379iwEIIHEEEBBEHIHEEBBBAAAAyAAAAAABEHMNOOOONKIHIKNNKEHEIIIHKMNNOOOPPQRPPOONMMKKHEzzvvvsssssrmmmmmmmmmrrrrrrrrrrvvvvxxzDDFHLLMNNOOPPQQQPONLHFCzvrmmmedggkkkggddeeemquxxAxqutwwywwpolf00cdcciiiccffc988", +"99ccc9|(!)|95/>*$@#$$##@#$*-*%%*->>,,>->)/0kmqqkgluuuf1!)_7||39lAHHEEAwwtyABEBAyAAAABBywyyAywAABEKNNNNMKIIIIMONMKKIKKIIMMNNOOOPPQPPOOMNNKLFEzzvvvsssssrmmmmmmmmmhrrrrrrrrrvvvvxxzDDFHLLMNNOPPPQQQPONLHFzzvrmmeeddggffkggddeemmuxyxwqqxtwwywwpoif99cd999cccfff995", +"9955553_),~393)-%##%*--%%%->>-%%*->>)~)>,~|fmqumkkquxm7{)(3|<13ctBEEByppttwyyytolpwyAAwtppwwwyAAAEKKKKKHEEEEHKMKHHHIIEEHIKKMMNOPPPPOONNNMFFCzzvvssssssmmmmmhhmmmmmrrrrrrrrrvvvxxzDDFHLLNNOOPPQQQPPONLHFzzvrmmeeddddbhhkgggeeemqtAyutqqpwxzwwpoif9500d079cffiicc9", +"92||333|/),~39|,-%%*>,>-**>)),-%%*->)/~,,)/7imuqkmmuxug<){|3<_19mAEEEypoptwtttpidfltyAwpoioppttwwAHIHHHBAAAyBEHEzyAAEBCCEEFIKLNOPPPPONNMKIFCzxvvssssmmmmmmmmmmmmmmmmrrrrrrrvvvxxzDFHLLMNNOPPPQQQPPONLHDzzvrmmeeddddbbbgkkgjeemmuzAuqmqupwxwwwpif9569d0779fillif9", +"2|:::|||<~,,~35<,-->,>>-*%-,~~,-%%*->)~,>,~),->)~3gquqmqqtuqc_~{|4<~/5lAEEByoilpppppoicclwAwtollloomrqqwBBABAwswwyAEEBxuwwyAzzzEFFLLOOOOPOONMKFFzzyvtussmmmmmmmmmmhmhmmmmmmmrrrrvvvxxzDFHLLNNOOPPQQQQPPNNLHDzzvrmmmeeddd888dggkkjjjmquzzuqsmqptuwywtlfaaa507479lttoi9", +"221<**,)(9kuqmmqpuuo7/(<|1{{<5pBEBAtiiotpopppi9ftAAytoolooqqmqtyyyAAtpsttwABAyuqtxzzzzCEHILMOOOOOONMKHECzAyttsmmmmmmmmmmmkkkkkkhmmmmrrrrvvxxzDFHLLNOOPPQQQQQPONMLHDzzvrrmmeedddd88dddgknjjjquxxxuqmmqptuwwwpic8a634439iptof9", +"59553<(//<<<~))/|33<)*#+....+*~//,-%*->,-*>)~|fqumopuuuuk3_/<|/){_fyBCBypfgoolopqoifowBAwppqppttppwAywwyupoooqtAAwxuqtwxwzADFFILONNOOONMLIGCzzztusmmmmmmmmmhmkkkkkkkkhmmrrrruvxvzDFHLLNOOPPQQQQQPONMLHDzzvrrmmeeddddddddddgjjjjquxuuuqmmquutxwwtpica666859cilof9", +"9cff93|(~~/--,)(9kqqomquuuqc|((__~)<5oABCAwmcfigkooppllpyEAwwttuuwwyAywtwytlinllpxywxuqtxzwwzCBFFLLLNNOONMKFGCCzAttsmmmmmmhmmkeebbbkkkkkkmmrrrvvxxzDFHLMNOPPQQQQQQPONMLHDzzvrrmmeeeddddddddddjjjlouxuquuqmmqotuxwwtpfa6aa9cc99ciic", +"ffiic731/))~~/~/<|59<-$@. ...#>~<~,**->,,->,~|gmqmmquuuuk5<~/_({(5fpABAAtg9ccglmptpoouAABByyyyAEEAAwtwAwojjiiouwwsuqrtwxwxzABFILLNNOONMKIGCCAztutmmmmmmhmmeebbbbbbkkkkhmrrrvvxxzDFEJKMNPPPQQQQPPONMLHFCzvrrmmmeeddddddddddeejnopxuqquuqmmqptuxwttofc9ccc9575cff", +"filic541<~),,)~<<<39|,%#@.. .+%,~/~--*>,,>>>!/9kqqmmtuuuqc|/~///(49iwAAAypc90dioppwpolpwEEEEEBEHEBAytwAyplliinuwxtpqqttyxxzzAFFILLNNNNMLFGCCzztttmmmmmeeeeeebbbbbbbkkkkkrrrvvvxzDEJJMMNPPPPQQQPPONMLHFzzvvrrmmeeeddddddddeeeejoptuqqqqqqmquutuwwttplie98655379c", +"cilic5||>)~~<3|~-%$#@...+#-)~),---,,,>,)~|gmqolquuuuk7_((///<7ftyAyyti059floqppogioyEHIHEEHEBAyttwypooihjpttwpqqqtuzxyzDzFFILMNNMKFIHCCAzuttmmmmeeeeeeebbbbbbbbkkkkkrrvvxxDDEJJMMNPPPPPPQPPONMLHFDzvvrrmmmeeeedddddeeeeejnptxuqmqqqqmquttutwwwtlf866444426", +"3clic54<<<~'-**--,~||~,>--*$+++#*,)),,;-,,))))~{5kpmllquuuq0|<(((~/3gpyAywwpf70fiiiioplcfpyEIIEHHEBAwolptpookfeotttsommqtxxyxAzzFHKMLLMKKHHCzzAtttmmmmeeeeeeebbbbbbbbbhkkkrrvvxxDDEJJMNOOOPPPPPPPONMLHFDxvvrrrmmmeeeeeeeeeeeeeejotpuqqqqqqmmqutwwyBBypc662|11[}}", +"<3fif93|*%%%-~||/))),>*%#+@%>)),>,>,,)//~~~,,>,)/<-%%%>))>>,>,)~/%##$-))~//~/<|*-)~,>>>,)~{/<(~(7kmmfgmquuqi9995<{)|fpyAyppqpppof059cittrififiopttpiiptpllljifisttqomljmmrnqmssvCCHILLIIHEzzyytsmmmmjeeeedbdddddddbbbkkkrrvvxxADEJMMNNOOOOOOPOPNMNLLHFDzxxvvvrrrmmmmmmmmmmmmmmquqmmmqqqquuquxABywurpppic6|1(][", +"/~~(~~<5953<~),-$##%-->)~~<39c93/)>,),>->,~/<<||(~|gmmgckpquuog9997<~/5ityywpoppolic76acottpf9889fiiilouwtooleiiiottppjjhnmqrnmmstzCCIIKIIHGzzyxuvmmmmjeeeddddddadadbbbkkhrrvvxxADJJMMNNNOOOOOOOONMMMLLHFDAxxvvvrrrrmmmmmmmmmmmmquqmmmmqqloppppttttsqolpli86|_^[", +"{~~{{))<|55|/~),*$#%*%%*>)<3cff93<~)),>-->~/|353<~*%%*$##%>~|355955|>)/|3|/~)>**-%@+#*,///<39fc9|,~<|<~~),>>-$@@%>,,)/|9fiif93/>$$-/9ili5||0gmmg7dkquumg517c7;--->,~///~~)),%#@$*--,~<359cili9/-%%,|ioli515gmqk75gmquqmd1|5c3/{/3iwAytlgf9566862259dflptwwwwywtpicbc999fnppooihdehehebdjnuxzBGGEEFFzzvvvssmmmmheeeeeddddddbbbkkmrpvxxDDEJIMMMMMMMNNNOOOONNMMMJJJLHFFFDDAzxxxxvvvvvrrqswyqmmmmmqnoolnppkggmquqqific953}", +"3|1/{';-*--**;>)/////~>%#%***,~|||||3cooc/-*-~9lpoi59giqmg40mmppqi3<|00|{~19pyAytif9566762223099dimopppppolfcc988biooolihhhbgbabbgnrxzBCGGCBBzzvvvsrmmmmeeeeeeedddddbbbkmmrvvxxDDFIIIIMMMMMMNNNOONNNNMMMKJJLLFHFFDDDzzxxxxvvvvstwywmmmmquonjjjnmmkgkmqunjefd967}", +"253|_{';**-*&%*-,~<<||~>%*-->)/<33|)3lppof9fkqpi77fmqpumc|<5d3_/<5itAAypid76266|}1|1|4509d9cdgklkiif9669flomligbhbbhb8bbkrszzzCCBBBBzvvvvrrmmkheeeeeeddddbbbemmrrvvxxDDIJJJJIIMMMMMMNNONNNNNMMMMJJLLLHHFFFDDDzxxxxvvvyyywummqquujeehjmmmkkkqppoieb963|", +"}55531/)>--*=%&%*-~<35|~>>,,)~/|5995|/|9fc|~))|iptpidflqqmd7dkouuum9|7dc3<~|dowAAwoi9311||1__(__37777750ciillf9268cjlollihcabaa86ejmqxzzzCCBBDzvxvvrrrkkhheeeeeeddbbbbkmmqrvvvzDEJIJJJJJIMMMMMMNNNNNNNNNMMMMKLLLLKHHFFFDDzzxxxvyBAwtsqquuqheeedgmmmkkipppmiida31", +"2359993<~,>-=***%*>)|99|~)~/<<|59fff9|<|59|~))-=*&%%%%>)|c9|<|335cfc9cfic5|373~,>~3pwwtpllqqpmicgkquuuof0cif9=%$####%%,|95559cfllifffilf9355<,--)9ptwtppuutpmgilqquuulddiif5<_|0qwAytplf91^]^^^[::(]]!{!{{(159a2}26abfgiiigbaaa2226hhlruxzxzzADBDwuuvvrrrkkkhhhheeeeeehhhrrvvxxDDFJJJJJJJHJJIMMMMMMNNNOOOOOOONNNNNNNNMLLLLHHFFDCzCEEAAAuqmeeeeddddgklonoppppomif0", +"d56359cfc9|<~,=%$####%>/||9flpttpoollllf5593/>*-~9opttuuxxwumikmmqqpplfioic3<<4ipyyytog92[{!!^^]::^]!!!{{(|462}}228cffiiifc9aa2}}68hnouxxyzzCADDAuuvvsrrrkkhhhhheeeekmmmrrvvvzDDEJJJJJHJJHJJIMMMMMMNOOOOOOOOOOOONNONNNNLLLLHFFFCCHIHEAqmmeeedddddgklooompppomiii", +"pigfccfiifcc5|/)>*%%%$*,))/5lwyywttttpoid955|~>-,<9iotutxzywtmmmmmqqpploqof951|9lwyywoi93[^^!!!^](^]]^{{(_1||2}2268bffkgigc0082}}6ablnrtxzyzCABADxuuvvvrrrkkhhhhhmmmkmmrrrvxxDDEJHDEDEEHJJHJJMMMMMMNNOOOOOPOOOOOPPOOOONNNLLLHFFECIIIAwmmmeeeddddggkinonmptwwttpt", +"tpllc99cccffc03<~))>>->,),,/9oyAAyyAywtpli953<)>,/39copqtxxzxuomqqmmqqopqplg9547fpwAytlc6}:^^!!!]]^]^(____||<}22270dfiiiifc9071}}28bhnqsxzxzzCADDyxuuvsrrrrkkhhhhmmmmmmrquvxxDDEEEEEEEEEJJJHJIMMMMMNOOOOOPPPPPPPOPPPPOOONNLKHFFFCJIHztmmmeeeddgggggeiopptABAAywt", +"tolic57555555953,~~<3copttofflpABEEAywpi933999fpwuuyAAyuppqppqppuwyywoigfdflwEEEAwoic93<<:[::::<__11|23559ccfilifdc954_(_128bhgmrqsuxzzCGADAvxuuvvvvsvrvvvqqssvvwxxADDEDDDDDDDDDDDEJJJJKKLMMOOOPPPPQQQQQQQQQPPPPOONNLLIFFBzxvrrmmmjjggkmpppqnoooooptyyto", +"ifgd52_~!!,,>;>--->,)),,,))~<5fqttogccfltAEEBAypic99fiiptwuwzAzxpqpuqqppppwywpiffifgpAHHEAwoif954}|}<<<|1_|__}|3659cfgiiffc951_({}47bhhjnruuwxACCAzADvwuvvvvvvvrvvvqsvvvvxzDDDDBDDDDDDDDDEDEJJJIKKMMOOOPPPPPQQQQQQPPPPPPPOONLLIFFFzzvvpmmqjjgkmpqpqmlnlollilpwwp", +"lfdd961(!!';;=*&%&%*->>,,)~)~|clppofc99cfpwABBAytlfcfllltwwxzCzyuqpputpppptyywojfifcitBHHEAplfc953}:<<__<_<<}123559cfiiifgc95}_{{_47ahhjmnrpsxwACCzAAyvwuvuuvvvvvvvvvvvvvxzDDDDDDDDDDDDDDDEDJJJIKKMMOOOPPPPOOOOPPPPPPPPPPOONNLKIFFAzvvsuqqjjoqppqmmmmiiiiifhipwt", +"oifdd94_{!'>;-*&$$$$$$%*-,~~/|ciopi953359fptwAAyytoilpolpwyyCGCzwtputppppoqwyywmmlifflwEHHBypiffc93|}:<_||||2355599cfiifgff92:^{{(120hhhjnrrstxvAzCAADyvvtvuxxvvvuuvvvvvvzDDEDADDDDDDDDDDDEEJJJJKKMMNOOOOOOOOOOOOOOOPPPPPPOONKLHFECzvvstqqqppqqqmmmmkeeehhebhltt", +"tlgdd56_~!'';=**&$$$#####%>)/|clpoi5|<<<|9iptwwwtollottttyAABEHEAwtttupmqpptyAytoiiffipAEHHEAtoiikf953|1||4355555cccffiigfd52[^!![1700hejnnrrstvzAACAzADvywzxxxxvvuvvvxxzzBDEDDDDDzzDDDDDDDEEJJJKKMMNOOOONONNNNNNOOOPPPPPOOONNKLHFEzzytuqquttqqmmmkkggbbbfebbfot", +"poid055_/!'';;*%&%$$##@@@@%->/5lppi9|/~)~<5ipwwwti9cipwwwyABEHIIGAywwwuopxwwyAAyumifilotBEHHEEypppolf905755599090cccfifffc96}[^!!(1400behjnrrstvyyzAAzAADADDAzxxxxwxxxxxADDEDDDzzzxzzyDDDDDDEJJJKKKMNONMMMNNMMMMMNNNOOOOOOOONNLLHFECzzvtwuxtpmmmmkggggdbbbhbbafo", +"polfd071_{'';;%&%&$####@+@#$%>|gifc93<),,)/3itzAtg3|5foppotyBJKKHEEAAzywACEEEBBBAtooppttyBEHHHEBAAwtppoliiffcc95559cd990962}[^!!^_1700eejjjrrssswyDzACCCAAADAAzyvxvxzADBFDDDzzxxxxxxxzDDDDDEJJJIMKMMMMMMLJJJJJJJIJKMMNOOOOOONOMLHFFBzAyAxxuookgggddeddddbbeehae", +"flligd541({!';;%&$$####@@@@#$$*!59953|<~~~~~<5itxxtf430floiitxAEJEEBAAAAtwAEEEBBBAytpoopptABEEEEEBAwtpoolifffc9955550d050762}[^!!]_1700deejjnrrssvwyAAACGGACBDADAzzzzADBFDDDzzxxxxxxxxxyDDDDEIJJIKMMLMMKJJJJJJEEJIJJLLLNNLLNOOOMLKFFCCBEAAuunjjgddddeedddddbhhbb", +"biiiid061/{!''-=%&%$$####@@@#$%'|95;%&$$&$$$##@##$%;_57_!>-=-,)~/<3ftxBAuifiomigipwABGBzwtttmfimwyywtppoic5590cipwwwwywttoiifdc957590cfiifc9d95|[[]!!^^176adeejjnnrqsxwvyADACGGGGEEDDDDDDBDDDBzzzzvxxxxxxxxwDDDDEEIJJMKMIJJJEEDDDDDDDDFFFHLKLNNNNNNNKMIIIEGCyyqqmjheeeeeeeeeedddgkhe", +"eciiid999|>,,)/3iwACAwptttpoiluyBECywtppmg0dipuupmomkc953459iutttttttpoliigc9009cffffcccc9531[^!!^^1470abeehhnhqqsxDvAAAzCGGHJEEBDDDDBDADzxxzzzxxxxxxxxxzDDDEEJIJMIJIIEEDDDDzzxyzAzDDEFHKKNNNNNNMMMKIIGCAxummmeeeeeeemmeeeedggkk", +"kehffd99971({!'';&%&$$$%$###$&&&,|77(;*-,,;--;;)|fwABAwwyAywpmpxAEEAxwtpok05cimliiiiigc05337doutpptttttpppoifcccccc99599905531:]]]_177a0behhhhhmqsxDvyADzGGHHJHEEBDDDDDAAxxxxzvvvvuxxxxxzDDDEEJJIJJIJEEDDDzxxxvxxxvxzDFHHLLMNNNNOMMKKICCAtummmmeeeeemmmmmeeejgkk", +"mhccffd5903_({!,;***$%&&$$$#$%**>/77<,;,{,*%%%%*>|iwAAtptyAAywtwCGJCzzwtpog59fkkkgikgfffc959cipttppppttpppplifd9995537535433||1}:}|45799aeehhhhmqvuyDyAACBHJHGGGEEEDDADzzxxxxvvvvvuvxxxxzDDDEFJJJJJJEDDDzxvxvsvvsvvvvzCDFHLLMNNOOLMMLIECyyusmmmmeeemmmmmmmhjhjnm", +"mlfdgfd06873<{!',;**&%%&&$$$%%---)104),~_!*$$&$$*,|owAwlltyCBAwyACJJEzAwwtoc0dkmqmiiiffkifcccfmptwtpolooppolifcc955333|||1<__<<}}35509dbeehhhhhmqvuyDDyDCEHGHGGEEEBDDAzxxxxxvvvvvvvuxxxxzDDDDEJJJJFEDDDzvxvvvvvvvsvvxzzzDFHLKMOOONNNKIEzvvspmmmmmmmmmmmmmmqqqnno", +"policfd02505|_{'';--*=%%&&&%%=;;-,<75()~<_'=%$$$%*{5pwxofityAAyzAAGHEAAAwtui75gquumkkfccffgcd0diopppliiilooliiffc95531_<>{45<~~(||~>=&**%>{9pxtifowyyyyyABEEAyzwtum0|5gquqggd73570d0579fiilllilloolliifc995|1|>!|7|/~~_33(),>-%=;/cuuiffotxwxxzBGGzwxwttti415iomdd051<14507770ddgfiilolollliiic953||<_{~)!'';'{:|0dcfjnlolnnqqvuxyDABDABBBDDAADAxwvuuvvuuvvvvvvvvvxxxxzDBDEEEFDDDxxvvvrrrkkhhmmmmrsswvzxDFIMMOOONKFFCzvvrrsmmmqqqxwyCAABAxuuu", +"xupoffiikccgc541_)'-;--;>=%%*=;'>>,/44_~!{390|<{>;=*,|lpofciuwutwzABGBxttuutp9<<39c90901_(_|3777590099cfilllooooolif953|<(~~)';;;'^[400eejllqmruquuxyzBAAABDADDAADwuuvvvvvuuvvvvvvvvvuxxxzDDBDEDDDDzxxvvrrrmmkkhhmmmmmptvvzzFFIMNOOMMIFDzzvvspstqqqwwwwABEEBAAxx", +"wtpooiiiliiiif997,,,>*%%&=;>>'{451~~/7mpi9|)>**>(9opkdfpwtutwyAEGAuppptuo5,!|7|/~|dqtpoc|!;->{3kppfciutttxwzAEBypooptug4{~_47007|_({(_1359000077670cfiiffffffffcc93|/),';!{_}70bbejnnnmqvxxzCCCBBBBADyywtuuuuvvvuvvrvvvssvvvvvxxxxDDDBDDDzxxvsvrrmmkeeeeeeeeemmmpsxwzAHKKNMMLIFFCzzvvuuwwwwwwuACHHIHEAAA", +"qlkllicfkmiiiigccc95|!<9ouodfotwwxxwyCEAwpommpqf|~/<3555|_{{!{<|35999d97243230995595555599995|/~){{<}20beejnjjmqvuuzCCCDBBDAyxtvuuuvvrvvurrrrvvqsvvvvvuxxzzDDBDDyxxxvvrrmmkeeeebdddeeemmmptyyzEIFKMKKHFFEzzzyzwutttwxABEIIHEECyw", +"qqomloiffilkifgc9553|-*&&%%*-'~|3<~<3dlf09d9|~!!~|dpukciptwxxwwzCCywpmioppc|<_|1353_]~)){_|359cdd06||2122|3||||<||||459553|||||60dejnnnmmmquuxzzzCDDAzxuvuuvrvvvvnnrqrrrvvssvvvvvxxxyDDDDzxxxvvrrhhmkeebbbbddddeeemmttyAEEHIIKLLHHFAzzzAyststwCEHJIJGCAzAw", +"wqomolifffkifdfd0743|;=%%*->!/4|~/<507||499|{!)(3mtpfdltwwxuwxzCAwtpiiopm91____471(~]))~/<159dgd967321|||<<<_((/(((<<|3359999d9dfhjnnnqqquwwzzAAADzxuuuurvqqqqnnnnmrrrvvvsqvvvvxxxzzDDzxxxvuvrrhhheedbbbbbddddeeemmstzCEEFFLLLHFFCzCzAvvwvzCEHHHGECzzzzA", +"wqomlilfc9dggddfd0333|-;'')<|/~/|4|7d03354<{~_5muukdiqutuutxyzwtpollqupf3,~|5cflopppprrrqvuuxwxxxxuuvuvssssnnnnnnnnnmrrrvvvqvvvvvxxxzzxxxxvvqqrkhheeddd88888888ddeeqquyyAyzzFFHJHFEEzzxyvzBEHECCzCFFBzzzz", +"Awqnkhb9aa3589575093|||||||||<<~~)',))/||~~|449mqf5573_/_4gtwpgflpututuxyxupomlqppoc|<<|75|/)'>>''''~_|0900765342||||<_/~~)),>;=->)<|5clopttttppqvxuxwxuuvvvvqvqrornnnnnnnnnrrrvvvqqvvvsxxvvxxxxvvvqqmkkeeddd8886666888ddhjquuywywxDFEEFHFEzzzvABEHEBCCzCFFFBzzC", +"Axqqkhab9644307||774_//<_|||3||///({{{/|4>'>'!{_3a9006332}<<<_<<<>-==>'~_25dioptwwvwuutuuuuuvvqqqrrnnjlnnnnkkhhknrrrvvvqvvvsxxxvvxxssvrrqmmkeedd888666666688dgjnuusstwxxDDEHHFDCzzzGEHHGCCzCHFFFFCCC", +"zzwqjkhb88634704|4751~~~~~/<|33||<>')/:77657633|}__<(<<<-*=>,](<|7cfiostywyxxwxxussqqqqnjnjjjjghhkkkkkkrqrqvvqvvvvsxxvvxxvsvrrmmmeeddd886666666668bggopwuqurvxzDEFEFDEAzCGHHHGCCBCFFFIFFBC", +"CAwsnkie999535873|703_)),)))/_1333-->,)/<|35bginpswwyzxxztvuvqqjjjjjjhhghhhkkhmmmrrrrqvvvvvsxxxvvvvvrrrmmmeedd8886666666666bbgmppummpvvxzACFDDDCCCGHGGCCzCFFFKFFHEE", +"GEAwxtqijfd0539d73799|~),,,,),{_|53,'!{_|22322|4|__//{),,>>>>>--'']/<|25dcfinnpttwxxzzxusvnnnjjjhhghgghkhhhmnrrqrrrvvvvvvuuxvvvvrrrmmmeedd886666666666a8bhmqpommhrvvzzzzzDFHHHGGCCzzCEFFFKKIFII", +"NMMKIBzytpolgccfd97905<~,'>,,>'')<||<<<|0iic00dfiikmtpi9900imuxwpfcgkmptqqqqupoi539iqppoikmmk9_{',',,',{:|42732|1<_(]{~),>-;*=&%*>'~_<|279cfijjoppqsxxzzwwsnnjjghgghhgghkkmnnnutpsurvvvvuvvuvvvvrrrmmmeeedd886666666666688ilomnjmmppvzzzzzAFIIIECzzzBEIIIFKMMMMN", +"POPPONIIHEAwtoillidcc93/~',>,,;;>>)/||<<3clkfgiif95cimoicddioptwtmfcfmppqooqqqold3|9fmppppmqmg9;;=&&$$*;)(<3359ffginnoporvuxwtupppohgghgghghhhkhjknrputttutttvvvvvvvrrrrmmmeeddd886666666666688ellmgjemmstwwvxzzBIIIHBACBEIIILMNOOOOO", +"PPQQOMIIIIEBAtooppliifd3<{'>,,,;--->)<1||5fliilol9459gmolmklmquxwulggippuqomqqoom91|0imqpppupof7|~~!)!]{][:}652641_(]]'>,>;==%$##%=,)]<35cfffilnoonmnrsrrspppmmkkggggggghghkhkrrqtuutwwvvvvvvvvrrrmmmmeedd88666666666666aafiifhgehmmtwvvvzzCHIIHECEEIIFMNOOPPPPP", +"QPOOKEAzAAwttpiiloolilof5<~',,)''-*--)/|359fiiotpi9339fmppppommtwxtidfkoqqqmmmmomm0|40gmquttupi97|//~!!]]]:}473a71|:]]''>--=%%$##%=;,]/|29cijlloonnqqqqnqnnojmmmmmkkgggkkjkjkhrrrusuwywvvvuvvvqrrrmmmmeedd886666666}}}}68bfihebddejmmsvvvyzCGHHFFFFFFKMNOOPQQQQQ", +"POMKEzAwuppligf9cfiiilptl9|/),)))'-**>)/|55cfiotwpf5459iptutqplqxwwqgdgmqqpmmmmlmmk5159imptuupmg77|<(({{{[_[}26672}:({]'>-*=%$$##%=->!~_170dijlororoqrrnmjjjgkkmmommmmmlmnmmmkrqrrptwyywxvuvvurrrrmmmeeedd886666666}}}}28biih8b8dgjmmrprvAACGCHFFFFFKMNNOOQQQQQP", +"NNMIHEAwtpoifiid9cgiilptpi9|(~~~/{,;;->)/|5cfikpxwofc09cmtttqqolqwwui9dfopppmmmkkmmc||5cgoqputqic5311<_((_:[1a5a731<]{{''>-*&$#@#%=;,!~::479hfioprrrpqqnnjhhhggkkmmqpppoomqqmrrrrrpvxwwvvwvvvrrrrkmmmeeeddb8666666}}}22268iiba68bggjmmrptzCCCzAFFIIKNNNNOPQQQQPO", +"NNNKIHBAxwtoooooliiopoppplc5||//<>-*&#@@$=;>!]_<435dbgilnnrprrnjjihhggggklmpppqpqpprrpqrrsuvwtvvvvvrrrrqmmmmeeeddbb666666}}}2226bccc8666bggemmstwyBAzzEFKMNNNOOOPPPPPOO", +"OOONNMMKIHEEAywwwttttwtppof053|||33|{'')~/_3cillotutpommmuwtqptpqtxxumd9ckmpqqmligki91|7ddgkoppoi97733377742}2677a311_{!'>--*%$#$%==>'{/:4750cbginnnmnnniijggggggkkkklmqqutttrqprruvwutvvvvvrrrqmmmnmeeeddbbb666662}}226acc9666668egehmnwwyzyyzBFMMNNOOOOPPOOPPP", +"QQPPOONMMKMKIHHEEAwtwyxtppl0533|3553|////(<<3flloptwwtpquwzxppuuttxwxqf90dkpqqmmkgggd7<|0dgglmolic077|335066aa65723|1<({)'>-*%$#$%=>>'~~_4790bbgginnihnnjihhggggggggggkmmptttprprpsvvsvvvuvrrrrrmmmmmeeeddbbb6666622}22aacc862}6a8hbdemqquwwvyzCIMMMNOPOPOOPQQQQ", +"QQQPOONMKIKKIIIIIIEAABAywwtl53||3|33|<<<||,')]_1359dddfhjjkhjhhjgggkgggggggggkmqqtttttprxuvvvvvvrrqrrmmmmmeedddb888a6222}2}}}26cc662}2688bdgjquuwtsyCGIKMNOOOOOOPPQRQQ", +"QQQQPOONKIIIIIIIKIIIHHHEAAAyo9333<;;=%&&&->''{/_1457bhbggijikhjejdfgkgggggkkkgkkmpprtstswvvvuvvvrrrrqqmmmmeeggbb888222}}}[[[[}26bc62}[22866bgjnuuqstzBJHKNOOONOPPPQQQQQ", +"PQQQQOONMKIIIHKMKKKKKKKIHEEEAtig9|/{~<|353>==&&&*--']~(_1375abcfikjhhejefddgggggkkmkkkkkrrnrrrwwwvwxvvvrrrrrrkkkmeeddb88aa2}}}}}}_____16b96}}}}22666bkoouqmsyEEHKNOOOOPPPPQQQQQ", +"PPQQPOONKIHEEEHIKMKMMKKMKIIIIEypi5-*&$%*-;,)](<1357acdgfinhjhjgfddddggggkkkkkkkmooopstxwxyywxrrrrqqmkkkeeddb888222}}___(((((([79562[[}2226aekmooqquABEIKOOOOPPPPPPQQQQ", +"PPPPPONKIIEBAAAAEIIIIIKKMKKKKIEApg5|/~{_|7974|<19gltyAyplltEEEHHHGEzyxywqc3379mqqqmmg05731147dcgfcc03790d05a7888ab07241_{~,;;*%$$%->,)(/1|350ddcgfinjjnnfgddddddddggkkkkoonnnssvvwvyywtttpprmmmmeedbb88a2222__(({^^^!^^(|774_[[}}2}28bimonqquAAEIMNNOPPPPOPQQQQQ", +"QPPPOOMMIEAzwtppwwwtyEHIKKKKKMKHBpic3({!(<7907770diowBBwoipyHIIHHHHEzzyxum0445cmqqqmkd033113500diiic5750d998008a8aa722*&&&&->,{(_11550cbbgfgjhnnqiigddddd0ddggkkooonovsvvuvvvttutttsmmmmmeeddb6622}}___^^^^^^^^^[}32|(_[}}}}26bflmniuwxAEKKMNOPPOOPQQQQQQ", +"PPPONMKIHEAwwttpplikipwEHIKKKMMKIEwoc|(!!{_7999ccfiipAAypootBIIHHHHECAyzwug7345gqqqqmk0744|43570diif97570dcdcdc8bac0522_({!'>-*%%=-'']{_|450acbggghjhjlmllgggddd0dddggmonmnrvsssttvsussttqmmmmmghggb882}}}_((^^^''''''!]12}:{{_:}}}26bfimklpxwBIKKKOOOOOPQQQQQQP", +"PPPOOMIIEBEyywwtpogc9flpwEIIIKKMMIEwl93/{)~<59cfilllowAwpoopwEIIIJHGEBAAAxqd3439mqqpqmg74414409779cfcc090dhcfegbb0a857}}({{'';*%%=;'!{{_<159abcggiijhhfiiilggdddddddgiljnlqvrsstusrsspummqmqqmmjegbb886}}_(^^]!!''','''{<||]^!(::_[269eeikmpwxBIKKMNNNOPQQQQPQPP", +"PPPOONKIIHEAzywppolf09ccflyEIIKKKKHApi93<{{/<39ciopptyAAtollpwEHIHHEEAAAzAum0775cmqqqqld741347007359dgddddd9figgbbb8a53}:({!';;===;'!{{_<1789cfggggjhhggfiigggddddddikiljnrqrsvvrrrusmmmmmmmqqmjggb88622_(^^{'','''''''{_|_{]^^(:__26c9fimqtpzEIHKMMMNOPQQQPPPPP", +"QPPPONMHHEAyxwttpllfd99999iwBHIKKIIEwplf92:::269ciptwAABypiiopwEHHHHECAAzAzumc075iqqqqpkc743479093379fffidbdhejkjhhbaa7|[[{]'';;;;''!{(_12a8a9ggiijjhgggfggigggdddgiilkinmmqvvsrrqrmmmmmmmmmmmjjggb88621_^^{!''';>;;>;'!<_/]'^^((__<69cfciqptBHIIKKIMNOPQPPPPPPP", +"QPPONKFCCAuwttppollicdccdcfmtyEHIIIEAtpoic5}:}268clpwyABAukfiopwEEHJJECzAzAzukd57dmqqqqqm0333570d07359fgighgbejkkjehbaa74[[(!';;;;'!{(__22669dgggfjhhgggggffddddggkkmlnmnmmrrrnrqrmmmmmmmmmmmmjjgea8622_(^^!'';;--;;--,)<<('''^]({(1688chnqqwBHEIKIIMOPPPPPPPPPQ", +"QPPOMLFBzwqqnmlloiiffcccfiilptwAEIIIEAywtpi9714370fltwyABymfflptyBEEHHEAzAAAxpfd00goqqqqqk055670dd95770gflkggeejkmjjhbaa74[[^'';;''{([[}2260cdfggjjhjgggffgfgfhhhiilloqnnnrrvnnokkmmmqmqmmmmmmjkkebba21_^]!!'''--===*;>)/,]<~';'){{!{[3389cnnqAEHHIHHMNONNOPPPPPQQ", +"QPOOOLIFzvsmedgbab989cfiifiilptwwAEKMKIEBAAwoi9550dfimwAEEyqiiotwAAAEHIHEAyAAwtlcddgmppquumkcd999dggd00dggomnmjjjkmmjjjb864<_^^!!^^^:<13779cdgiheeehhggggffdhheijjjnrrqrvrrrnnhhkkmejnrprppqppqqmkidaa4[:{''';;--=&&&=;,/<~>;''!^^^_|388fllpAEEIEEIMOONMOPPPPPQQ", +"QPPOOLHEzvsmmedb886868cfffiiilptwyAHKMMKHEAwtplfbbcffiqwBHEytppptyAAAEHHHBAAzzwuifgilqqquuupigd9dddgggddhhomqpnknkmmmljeb8621(({{((_|17790cfhhghheeheeehjjeheeheihjnonmrqppnnhkkkejjorpspppppppqoikfb05}_/!,>;--==%%%%;'{<{>;''!!^^:<158cfltBEHIGEKNNMMMNOPPPQPQ", +"QPPONLHFzvssmed8a662a689bccfiilptyABIKMNMIBywwtpibdfiiipyEKEAwpppwAAzAEHHGBAAAzwuiiilopuuuuupkcddcdgggggjkmmmqnnnnmmmmnjea662__((__14479acefffhhfeehhhehhheehhehjjnnnmmqrrorkhkhhhjnqqqqppprpppmokjgcd06|<~!,--=%%%%$%*>{/);-;,''^^[:159cfltBEEHBHMNMIKMNNOPQPPQ", +"QPPPNLLFzzvsmeeda666268b988fiiilpwyAEKMMMKHByyywplfffiiowAEIHBwpopyAAyAEEHGAAAACytolmmpuxtxxtuidddgggggjjloomnqnnnmmmmmjefa622}[[}2266a8cbffffhhhehhghehehehhhhjhjnnnmmnqnnhmmmjjknmqqmmmmpprppmmijcc0763|<~,>=*%%%&&%*>)()-->'''!^[[:40cciwBEEECINNKHIKNNOOPPPQ", +"QPPPNMLHCzvsmmedbb66886a9668fppptwyAEIMMNNMIEAAytplifiilowAEHHBwttyAAyyAEEHBAAACBzwqlmqxxxwxxxpkgggiggkkgilljmmloommmnmmjhbba6}[[}22a6abcfffffhhheehhghhhehhehjjjhmnqnnnjnkhkjjkmmooollllmmnnlnmifea90221||<~'>*%&&&&&&-)~'-=-''''{:::40c9iyEEByBIMMHGIKMMOOPPPQ", +"RQPPOMLFFzvsmmeddb6668abbbadiptwwyAABHKMMNNMIEAwtpoiiiijiptyEHHEAyAAAyyyAEHECAyABBAyuqquxzyxxzxumkkkijkkkjjjkkmjnommmmmmmhbbba2}}226a89bhffhffheeeehhhheeehhhjjjjnnrrmmmlnhheegklpolijhhjjkkknnkhhh8a3}1___(/{,>*&&&&&&-)~'-=;''''{_:1250clABEAwEKKKEGIKKLOOPPQQ", +"RQQPONLIFzvssmeedbb6666a88bciopwyAAABEKNNNNNNKBytpillllifipwAEEEEEBAAywwyAEHHAAzABCAxpmpxAAzAzzxxqmmkjjkkkjjjhmmnnpmmnmmmmhha886688bbhfjieffhffeeehhhhheeehehjjjjhmmmnrlnhhbhdbiiolliieeehhkkkjkeb666|[_(({{~{~,>-&$$&&;)~!=*-'''){(_}250coyAAzyHKIIEGFFKMOOPPQQ", +"RQQPONLIEzvssmmhddbbb666889jloopwyyAABIMNNNNONKEypoiopoiffipwyABEHEEAwtwwABGIHAAAzCCzwuquyzACzAzzxuqnmmllljnhhkmhnrmmmmmmmkkeb86688bbbejiffefhheeejhhhhhhhheehhjjmmqmrnnghhbdbbhiiffc9ahbbbeegggeb6661[{{!)!)!)),'-%$$&;)~);*=-;''{/(}437cpyAAwAIIIIEGGIILNOOPQR", +"RQQPONLHFzvvsmmeeddb88bbbbhimmmmqttyAABHMNNNOONKEypplptoiffotwAAAABBAwttwABEIIGBAAAzzzxtwwyACAzzzAyuqpqoonkjkkhmjnnmmmmmmmkkggb88bbehhfhifhehfehehhfhhhhhehhhhhhhmqqmmnnhhba88bebcbd8aaa8bbbeghgebb62_[{!'''>,,,',>-*&%-'~);*=>''')//_227cpwywwBKIEHEGGFILNOOPQR", +"RQQPONKIFzzvummhjgdddbbbbhgkmmkjnpptwyyyEMNNNOONMEytppttpigjowyyyyAAywtptyBEEIIHEBBAAAzAyyAABAAAzzzzxtppppmmnmmqqnnnmmmmmmkkjggddgggechfjihfhgeehehhhhhheehhjhhmmrqmnjjhhba888bc9098aa66aa8bbhkgebb62_^{!',>;--->>,,-**;'~);-;;'''!((<227ftwtttBKHEEEGEIILNOOPQR", +"RQQPOOLIFBCAwwqqjjgggdddddgknnijjqptwwwuwBKMNNOONKHBwwwwwoifotwwwwwwwttttwABEEIKIEEBAAAAAzBBBCCzzzAAAytppmqqqqqqqnnnmmmmmmkkjjjedgggejeehihfhhheeehehhhhhhhjhhmmnmqnnjhgba8aa8aa8aa4316666a8cbekhba62[^{!'';;**==;>>>>->,~)>-;>'''!~/<126fpwttwEIEEEEGHIIMNOOPQR", +"RQQPOOMKKHCByyuuornkkgggddfjnjmmmqpttwwwuxAHKMNNONMIEBABAwolmptAAAwttpttttyAEEHKKIHEBBBAAACCEGGEECAAAAwttpqpqqononnnonmmmkkkjjjeehggejeejhhhfeheeeghhhhehhhhhhmmmmmnjjgb0a68a8a86531_111266aabbheba62}^{!'>;-=%%&%*->>,'~/~'-->'''!{(<<26ittppwEHEEHEGGFILNOOPQR", +"RQQQPONMKECAwyuuuppprmmnjjhjqqnmmqupwwwywtuABIKMNONMKIHEBAtolnpyAAwwtppttptyBBEHKKIHEEEBAAABEEHIIEECBAywuuptuprprnnnrmmmmkknjjjeehggejhehihhfefhehhhhhhhhhhhhjmmmmmnjhgb086266873}[[:[__112aa8bhebb861^^!'>;-=*&&&%%=>,)/,''!{((|39ittptwHHEEHECEFIMNOOPQR", +"RRQQPONKFCzzwwuuqnnnnnooonqqqqmmmmqppttwAwutyAEIMNNNMKKIEBAtoopyABAwtpooppptyABEHIIIEEEBAAAAEHIIKIHEEAAAxutuptttpprnrnmmmkknjjjedggghhbhehieffehehehhhhhhhhhjhkhhnnljhba8662aa53}:[]^^^^__12aa8bbhbaa1_^{!';-=*%&&$$%=;)(||)>;>'''!{(/|39iptppAIEAyBEGIFILNOOPQR", +"RRQQPOLIFCzyzwyqqqjjjjnnouuquqtmmmqloppwxAyttwABHMNNMIHHEEByppptAAAywtpooppptwAEEHIIGEBAyAABEHIKKIIHEBEBywwttttttuqmmmmmmmknjjgddgbebbbhhehheheechhhhhhhhhhhkhkhhjnjhhba6622634}[:^]^^^^^(_12288bhba64_[{!'>-=*%&&&$$%*'~|3(,>>'''!{{(<39lppppAIEwxAEGIIILOOOPQR", +"RRQQOOLIFFzyAyyqqmmmmmmmqquuyywqmmqnlotwwyywttwABIKMMIBABEEBwpoptyABAytpnoppptwBHHIIIEBAyyAEEHIKIIIIIEEAAAAwtttutuqqpqqmmmkkgggd8b88bbbhaabbbbcbbhhhdhhhhhhhhhhjjhjjhba8662244}[[{!]!]{^^^(_1228bbbaa41[{!';-=*%&$&##$&=,<3<~,,'''){((<49lppopAHAwxAEGIIILOOOPQR", +"RRQPOOLLFFzzzwwqrnmmmmmmmmqtwyyuqqqqnpwyxyAyvtwABBEIKKHAAAAEAwpoppyABAytppoppptAEIIIKIHCAyyBEIIIKIIIIHHEECAywttutuqquupqqmmkkbb8668aa888aaa8bbbbbdddddddddddgghkjkjggb8662224}[[]]!!!!!!{^^(_122abba64|[{!'>-=%%$&&###&&>~|_/))!''!~((<39lpploAEAtxABGIIIMOOOPQR", +"RQQPONLLFFEGCCAyqqqrqqqmmmpuuwyuuupupwyAAAAAAwwwABBEKKKEywwyBytpootyBEAytpqppptwAHKKKKIHEByABHHHIHIIKIIHHEBAxwttuqpopoppnoljhe8666a6aaaaaa880999dc9000aa0dddggggghhh8a862}221[[({,,',,'!!{]^__222ab8631:{!'>-=%%$&&###$%*)/~/~{/(~'){(_|5coppooAAwtxyCCEIKMNOPQRR", +"QQPPOOONMMKIEEAAAAzywuwttpqwvwttquwyABywyyyAABAwwyEEEIKKIytptttppoopxAAAAtpmpptwAABHKMNNMKIEBABEBGHHHIHIHEEEEBAyvwpponijjiffefb66222264434244226aaaaaaaaaaaaaaabddda066}}2}:::(]'''>;''','!^^(_}22aa6|1:{!',>-*%%$&###$&&>){)'~(/{~~(_|5coppooAywtxyCCCIKMNOPQRR", +"QQQQQOPOMMLHHEEAAABBAAyywtxwvxptmqtyBEAwuttwAEEBwwBEHHIKKHytppopppopuwAAAytpoptwyyABHKMOONMKIEBBEEHHEEEEEEBBEEEBAywtppllijgeb8886626|14111}}}}222644477770aaaaab800a722}2}_[_<]!'>>>;;>''''!^^(_}26a24_[{!',>=*%&&$####$&-){)',{/((((/|5copplpwwptxuyABFKMOOPQQQ", +"QQQQPPPONNMKKIIIEEEEBAAyyAAywwqttmqwAEEypolptwEEBAAEHHIKKKHAtppopporpuwzAAypprtwwwyAEHKMNOONMIHEEEHEBBAABAAABBEEEBAwwtpniec8662226434||::[}}}1|11111444377770008aa67a2}[}[[[:({'';;;;;;;;','^^^[}}2221:[{]!'--*%&&$$###$&=,)'->){{(___|3coppopttpsxuyABFIMOPQQQQ", +"QQQPPPPOPOOOOOONMKKIHEBEBBACywpttmmuzEEyplfilpwBHEBBEIIKMMMIBwtptrpopqtwABzwsqppwwwyAEHKNOOONMMKHEEEBAzAAyyAAAABEEBBAtpoljca662}2|3||}}}}____<|:_1111}42277700067a622}}[_[:_:(!''-;;=-;;;;''!]^(_}2221_[{{''-=*%&&$$$##$&=>),>>''!(_11|39oppoptpoqxuyzzFIMOPQQQQ", +"RRQQQPQPQQQQQQPPPOOONNKIEEBCAAytttqqwBBAtofcffowEHHEEHKKMNNMKEywttppputwAEEAyuqutwtwyEEIMNOOONNNKHEEEEAAAyyxywyyAEEEAywtolfc862<_((:[}21<:<((_______11144777776777a2}}[[[^[([{!,---===-;;;;''^^^[}2}21^[{!''-=*&%&$$$$#$$%>),>;>''!_34350ltppoppoqxuyzzFIMNPQRRR", +"RRRQQQQQQQQQQPPPOOOPPOOMKIECCAAwwwwtwAAAwpjiccfltBHHBEIKMMNNNKEAwwtptuwwCEEBAwtuutwtwAEKMNOOOONMKKIHHHEEBAAwxwttwAAAAAywtpoib531_(^^[_<|<<___(((__::[1}1227777767342}[[[^][(({'>;;===**=;;;''^^^__}}}_^{!!,;>;*%&$$$$$$#&%-,)>;>'''{1459dotpppppppxuyAzFKNOQQRRR", +"RRRRRRRRRQQPONMMKMMNNNNOONKHEAABAAAyyBAAwtpoifffltAEEAEIKMNNNMIBywtptwwwABEHHEzwvwyywyEKMNOOOONMMKKKIIHEHEEAAwtttwtwwwyyywtpic53::^(]{{/___<<__///____<1}}244734733}}[[(^^((^{'>-=====*=;;;;''^^][}}}[^{!'';;**&%$$$$$$#&%-,),;;'''!_|59iptpppttpuxuyAzFKNOQQRRR", +"RRRRRSSRQQONMIGGGEHIIIKMNONMIEEEBBBAAEBAwtptpliffltAEBBEKMNNNMKEAwwtstwwyACEHHEAyAABBBBIKMMNNOONNMMMMKIIIIIHEBAwwtppppttwywtpic5|}_/(~{{{{(/<<<<((((__<:1}}24421144}1[^(^^]{]!,;===%=====;;;''^^{_}}}_^!!''>;**%%$$$####&&*,{);>,''!(_|9ipwtpptttttuyAzFKOOQQQQR", +"RRRRSRRQQPNKIHBCCCCGGGHIKNOOMKHEEEEEBEEAtppttpoifiipAEEBEKNNNNKHAwywwwttxAEHIKHEEBEEEHEIMNNNNNOONNNNNNKKKKKMKKHEBytpooooptttpoif95|<_((~~)~~((_<<<(/<_<<<:111|}1}12|:[[{^^{({!';==*%%==*=;;;;'!^{[}}__^!''>-=**&%$$######&=>~)>>'''!{<|5ipywppttswtuyAzHFOOQQPQQ", +"RRSSRRQPPONMKFFBCCCCCCGGIKNNNNMKIIIIHHHEAtptwwwplifipAEBBEKNNNMIBwyyyzutuyABEIIHHHEEEHIIMNONNNNOONONNONNNMNNONNMKIBytollilopppoolf933|__~~~~~~/))>>''''~/<3coyytptttwwuwzzFKOOPPPPQ", +"QRSRRQQPOOOMMKKHEGGGGGGEHKKMMNOONNMKKIIIEwpwAEEAwoiiltBEEEIKMNNKEAAwAAwtuyyEEHHIHHEEEHHIMNOOONNNNNNNNNOOOOOOOONONNMHBwpiffiiloppplif953|<<<'!^{[[[^^!',;-=%&&$$$######&&-)),;;''')(<|9lwAwtwwwywxyAzFLOOPPPPQ", +"QRRRQQPOOOOONNMMKIKIIIHHIILKKMOPPPOMKIIIIBwyBHEBAwpllpyEHHHIKMNMKEAyyyxtwyABEEEHHEEEHEHIMNOONNNNMMMMMMNNOQQPONMMNONKIBwoic9cffiiiillifc53||'!!^[[^^{''>;-*%&&$$########&*,));>'''!(/19ftyywAywywxyACIKMOPOOOP", +"QRRQQPOOOOOOOOOOOOONNMKKIKIIKKNOPQPOMIEIMIBBEEBBEBAtppyEIKIIKMNNNKEAAAyyzAABEBEEEEEEEHIKKMNNNNNNMMMMMKMKNOPQPNMKKMMKKHBtlf63333359ciiiic953|/~)))))~{/<<<<<_<__](:::]]!!!!(_:{';**%%%%%&%==;;>'!!^{^^^''>;-=*%&$$#########&&>))'>'''!((|6cpwwwBAAAwxyACFKMONNNOP", +"RRRQPPOOPPPQQQQQQQQPPOONMKKKKMMMNPPPOKIIMMHEEEEIKIHBwtyEIMMKIKNOONMEBAyyAAyACCCBEEEEGEHIKMMNNMMMNNNNMKKKIMNOOONMKIIKKIEAtlc6}/~~(<|59fffc953<~))!!!!!!{((<|<<(_(:::(]^!'!'{(:~'--**%%%%&&%=;;>'!!^^^^^'';;-=%&%$########$#$&-)~'>,''!(_}29ottwABBByxyCGFKNONNOPQ", +"RRQQPOOOPQQRRQQQQQQQQPOOONNMMMMKKNOPOMIHIIHEEEHIKIIIEBBBHMMMIIMOPPONHBAyABABACzzEEEEEHEHKMMMMNMNOOOONNKKIKKMNNNONMKKIHEBAwof9<~)')~/|599c9953!!{^{^^'';=*=%&&$#########$&&*)),;'',!//}29ltttyBHHAxyCGKKNONMOPQ", +"QQQOOOPQQQRRRQQQQQQQQQPPOPOOONNMKKMNNOMHEHHEEEEHEBEHIIIEHKNNMIKNOQQPNHBABEEHEEBCBEEEEHHIKMMNNNNNPPPPOOMMKIKIIIKNNNNMIEAAABAti9<{',,))/|3599995|!!{^!!!';-=*%%&$$#########$&&*,))>''')~_}29lttpwBIIByACHKLNNNOOPQ", +"QQONNNOQQRRQQQQQQQQQQQQQPPPPPOONMKIIKMMKHEHHEHHEAwwAHKMKKKNOOMKMOPPPONIEHHIIKIIHEEEEHIIKMNOOOOPPPPPPPOONNMMKEEEIIIMMKIBwwABByo9|/~))!)~(<|59cc953|;;*&%$&$##########$$%*>))'>''){_}29ltwtwAEHBAAEGKKNNNOOOP", +"PPNKKMOPQQQQQQQQPPPQQQPQQQQQPPOONKHEHHIMKIHEEHIHBwwAEKNNOOOOONKKMOPPPPOKKIKMNMKKIIHEHHIKMOOPPPPPPPPPPPPOOONMIEBAAAEEIKIAtptAAwpf5|/~~~!)~/|59ccc93|''!!!!!!';;=*&%$$#####@##@@@$$&%>)~'>'')![:}5iwwtwyEEBABEJKLMNNNNNO", +"ONKKKNOPQQQQQQQQPPOOOOOOOPQQPPOONKHBBABIKKIHHHIIIEBBEKMNOOOOONMIINOPQQQPOKKNNONNMKKIIIIKNOOOOOOOONONOPPPOONMKHBywtwAAEEAwppptwywl9|/~~!)))~<39ccc953|'']]!!!!';;=*&$$##@####@#@##@#&&-,~)'''!{::}0itywwwBBAzAEIKKKNNMKLN", +"OMHCHMOPPOPQQQPQQOOOOOOOOOPPPPOONKIBAyBEHKMKIHIMMKIEHIKMOONNNMKIEINOPQQQQOOOPPPPOOONMMMNNNNONNONNNNNNOOPOONNMKHBywtttwwyyywtpptwwo9|/~)),,,)~<39ccc995|->,~<|59ccc53|-**%%%%&%%=;;;'!!]^!'';-*&%$$#@###@@@@@@@@#$&%>~{)'''!]::4dpwwwwBEAzAEHKIIKKHEIM", +"NKHEHMNPOOPQQPOONOOOMMMNNOOOOOONNNMKHHEHIIKMNMMKKIEwpptAEIKMKKKKKEBHKNOOOOPPPQQQRRRQQPOONNNNNMNNNNNNNMMMMMNNMMMKHEBwtolootwBEApfciolc3<~),,-;=-,)/|5999953|<<<<(]~]]/_/^''''!)'>---***&%%===;;''!!!',;;-*=*&%$###@@+@@@@#@#$$%;)~~'''!^[:39ltwwwBHBAyBGIHIKIEEIM", +"MIEIKNOOOOPQPONMMNOONNNNNOOOOOOOONNNKKIIKMMMNNMIEAwpliotwAHKKKKKMKEEIMOOOOOPPPPQQQRRQQPPOONNONNNNNNMNNMKMMMKMKKKIHEBAwpooptAHIEtiilifc9|~)',-==;-,)<3599953|<<<_/~]{]//]!)!!)]'-*********=*;;;,',!'';;;=*&%&$$####@@@@#####$$%='~~!'']^^|39ipwwwBHEAACGGGHKIEEEK", +"MKIHINOOOOPPONMMMMNNNNNNNOOOPPOOOOOOONMMMMMMMMMIEytpliklopwEIIIIKKKKKNOOPOOOOOOPPPPQQQQQQPPPOONONNNNNONMKKKKIKIKIIIHEEAAwptyEKMKHApf9cc9|(~)>-**=*>,~<3599971|<<)/{!!!^]|39ipwywAHHBACCCAEKIBAEI", +"KKEHIKNNMMNNMKMMMMKMMMNNNOOOPPOOOOOOONNNMMKKIIKKIEwpoikiilpwEIIHIIIIKMNOPPOOOOOOOOOOOOOOPPPPPPPOOOOONOONMKKIIEHHIIIIIIIIEBABEHKOPOEl539c93;==**->)~|359953||<]]]](/!!'!)~~)'-*%%%%&*=;;;;'!]!'';;=*%$$###@@@@+@@@##$$$%%&**;~--****->)/|559553|//]](/{!'',)~),-**%%&%&%*=;''!]]'',;-*%&###@+++++++++@###%&%**;)<<_/([:|79fowAyAEHEBBBAwAEHzAEK", +"OMEABHNNIHEGGHEHKKKKMKKMNNOOOOPONNNNOOONMMKIEBEIKMKEwpttppootAEHIIIHHHIKKKMMKMMNNONNMMNNNNOOOPQQQQQQPQPPOONNMKKHEEBEEEHHHHHEEAAAEKONEpf5|3599|~,>-****->,~<359905|<]{(/]!'''))!'-**%%&&%===-;',!'''';-=*&$#@@++++++++++@##$$%%*;,(<_//::179flwBAAEIHEAAyyAEBAAGM", +"NKAwAEKKHAzCBGCCEIKMKMKMMNNOOOOONNNNNNNNMKIHEBBEIKMKEywwwwtppwAIIIIHEEEEEEEHEEEIKMMMNNONOOOPPPPPPQQQQQQQQQQPONMIIEEBBEEBEAAAAywyyBKNNHwi5||5cc5<),>----->,)<|599933<(//]{''')!)'>*%%&&**==;;>'''''>;;-=&%$$#@@@++++++++@@@##$%%=-)<_(~:[_|5cipwAABHIBBAyyxzzyzAI", +"KIAwwAIIEAzABCzzCHIKMNNMMNOOOOOONNNNMMMNMKIHHEEBEIKMKBywwywtttwEIKIHBAAAAAAAAABBEIKKMNNOOOOPPPPQPQQQQQQQRRRRQPONKKIHEEEBBAABAywyABEHKMHwi5<|3cfc3/),>>>>>>,~<|599993<',)),>-=*&&%%==;;;','';;;=*%&$#$#@@#@@@++@+@#@@##$%%=-,/_({]^_|38cltyyzEIBxuuuuyzrrwE", +"IIBwwAEIAAyBBCCCGHIKNOOOOOOOOOOOONONMKKMMKKIIHHHHIKMMKEAwtwwtpwAHKKIEAwyyAyAABBBBEEIKNNOOOPPQQQQQQQRQQRRRRSSSRQPOOOMMKKKKKIIKIEEIKIEEKNKAo9|<|9ff5<~,,>>>>,)~/|599953||<],'>>,),,>--***%*==;-''';;;;=%$$###@+@@+++@@@###$#&&%%==-,{_>>>,,)(|3599555|:),';',,,>>>;>---;;>;'''>;;=%&$$##@@++++++@@@@###$%==-->>)/11_::_1379fpyyAzEBtpruuttqmuA", +"EEByAEHIAyxAAAHEEGGHKMNOPQPPOOOPPPPONMKHHIIKKKMMMKKKMMMIypoopoolotBEHHEAwtwwAAABBBEBEIKMNOOPPQPPPQQRRRRRRSSSSSRRRRRRQQQQQQQQQRRQQQOHAEOPPOKAti99fopi9|/~)),,!!~<|3555953|~,,>,,,>--->>>,;>>>'','>-==%&$$##@@++++@@@+++@###$&&*;>')(|33}::|35cfoyyAAAAtpprpttqqpy", +"ABAwyEIIAxuyABEBEEHIKKMNPQQQQPPPPPPOOONIIEEIIKKMKKKIIKKKEtllloliiotABEEBwtptwyyAABEHHHIIKMNOOOPPPQQRRRRRRSSSSSSSRRRRRRRRQRRRRRRQQPOIBEIOPPOKBwl9cflppi9|,,,>****->,,,,,'!!,;;;=%$$#@#@++++@##@+@++@##$&%*;-;,{<|72[[||59clwAAzAzwqqmpqtpnpw", +"yBAwwBKKEwxwzEEEEIIIHKMNOOPQQQQQQPPPPONKHAyABHIIIIIIHHIKIApolooolopwABEBAtpptwwwwyEKKIIKKMNNOOOOPQQQQQRRRSSSSSSSSRRRRRRRRRSSSSSRQQQOMHHIOQQOHAti999iptoc5|<<<<||||33599995|/)))),>****->,,,){]]!'>;=&$$##@+++++@#@@+++@###%*->',,)/_3952}|159cityAAAywrqqqutpoot", +"yBEAyAIMIBwAzAyEEEEECEIKMOPPPQQQQPPOOONKEAwtwyAEHIKKIHHIKIAtoopoooptyBEBAywttttttwAHIKKMMNNNNNNOOOPQQQQQRRRSSSSSSSSRSSRRSSSSSSSSRRRQQPNNOQQQMBwti955fotof5|<<<<||<|||355c95|>-;;;'',))]]{),;-*%$###@++++++++++++##$%-,~)){/|35fc94335bcipyAAAytppppwwtrot", +"yABAwyBIIByAAyzAEAyAABEIKNNOOPQQQPPPOOMKEBytttwyBIIKKIIIIIHAtpooooopwBEEBAwtttppopwyBEIKMNNNNMMMMNOOOOPPQQQRRSSSSSSSSSSSSSSSSSSSSRRQQQQQQQRQOHAAwof99fptpi93<<<<|<<<<1||555||<>>>'')!{{]))),>>-=$##@++++......+++@$&=>!)~/<|35ff953799fiowABBAwtpppwytppt", +"tyBAwwAEEAAywyAzyywAACzEFKMOOPQQQQPPPPNMHBAwwwwwwBHIKKIIIIHEAtpooollpwAEEByttpolloptyABEIKMMMMMMMMNNNNNNOPPQQQQQRRRRRRRSSSSSSSSSSRQPOQQQQQQONEwAEyof99fpwwof53||11<,>'',){]])'',,'>-*=*%###@++....++++#$&*->,)/(_|5cc52459fiopyAAywtppptwwppp", +"twBAwwABEBzyyyBAwuyyzyzAEKMMOPQQQQQQPPNKIBBAwtppptAEHIKIHHHEBypoopoilptABBAwpolffilptwyAABHIIKKKKMMMNMMMMNOOPPPPQPPPPPQRRRSRRRRRRQPOKMNPQPOIyoipBBti933cowwpf95|33||<(/~/<|||<<<;',,)!{]),',>--;*=**%%%$##@@+++@@+#$$$&*;;,'!/|7952|70filpwBBAAwpoptwwtop", +"ptyAwtyABBAxzBEAzxwywyzzFKMNOPQQQQPPPOMIHAAywpoiilptBHIHHEEEBAtppttoiiopwAAytpliffilptwyyABEHIIIIMNNMNNMMNNOOOOOPOOOOOOPPQQQQQQQPPPOMKKMNNKAoc9iyHyi5<<|5fpplc53333|<(~))~/<<<<|||/),',''''',){)''>--*=%%%%$%%%%$$########$$%&*=;;''!{122}:457filtABBBAtolowwoop", +"opwAwttyBEBAzAEAwxxuwwzBEKMNOOPPQQPPPOMIHAAwupokiilptAEHHEEEEBAwtwwtoiiloptwwtplifdgioptwyBEEHHIIMMNNNNOOOOOOOOOOOOOONNNNOOOPPQQQQPONMMMNNMIAoioAIAi9|/~/|9ili933||<<~)>;'))~~/<|||/)),,,'',,,,'',>-*&%%$####$$$$$$$$%$$%%&***---;'!!!{13}[_1|85cipwAywpiijopoll", +"iopwwtptyABwtwzywtwuqwAAEKKNMOOPPPPPPONMIEAyutpolllootAHHHHHHEEBAAAytpliiilptttplifdfilotwABEEEHIKMMNOPPQPPOOOOOOOOONONMMMMKNOPQRQQPOMKMNNNNNHAwAAti93/~~~<9iiic53|>,)~/<;*&$$$##@@@@@@@@#$$$$*=*->->,''!!{){<43:^_1|439iptppifccgiifi", +"filpwpootyAtppwxptpuqwxABEIKMOOPPQPPPOOMKICAywtqpppppptBIKIIIIIIHEBAwtpoiiilptwtpolifiilmpwABEEHIKKKMNPQQQQPPPPPOONMMMMMMMNMKKMOPQQQOMIKMKIKNNHApof993**%**=->)////)),>;;;;>>';;>-*&%$##@+@@@++++@@@##$%*->>,)~{//~(/<|52:<<__|29looli9589cfcc", +"cfiottllpwAtlltpqqpoqqwAyzEIKMNOOPPPOONMKKEBywttqpppoppwEIIHEHIIIIEAwwwtplilotwAAywwtppoopwyBEHHIHKKKMOQQQQPQQQQQPONMMMKMNNNNKIKMNOPPONMMHBBEHEypf953|||/~))/5iolc5|/~)>**%%*&*->)///~),>>-;;;>>;;--*&&$###@+++++++++++##$$%*->,'{{////||5832}:}269ioolic977cc99", +"fiiowwpoopAwpopplmmlqqwuxzBFKKMNOPOOOONKKKHEyttpppooolotwBEEBBEEHHEBwtttpoiilowAEEEEAAyyyyABEHIIKKIIKKNPRQQPPQRRRRQQONMKKMMNNMMMMMMNOOOOOKEAyyAwtof5|<<|3<),~<9lpi9|-*%%*&%*-,~//~~),,>>;;;>;;*=%%&$##@+++++++++++@###$&&*-;''''!!~~_|593321359fptpoic90dcfc", +"illpwAwpotwywtpolikinuuwxzAEIKNNOOOOOONKKIEBytuoolololooptwBBAABBBAAwpllllifcflpwyAAAAABBABEEIIKMMMMKMNPQRQQPQQRSSSSRQPONNMMNMMMNNMKKKNOOONKEAwtttpi93|353/))/3cilf5|<~,-=*%%&%&*-,~///~)),,>;;;;;-*%%%$##@@+++++.++++@@##$&*=-;'';''''')/|3|<<<<|39ipppoic9cfif", +"iilpyEBwttyEEywpiikgjquwtxzFIKMNOOONONMKHEBAytplkilllollloptyAywwwywwtoifiif999cilptttttwwwAABEIIKKMKKNOQQRQQQQRSSSSSSSRQPPONKKKMMMIIEEHINOPPNHyttwwpi9995|///|39ilf5|/)-*%%*%$$$%-,~~~)~)),,>>;;;-*%%%%$#@@@++++...++@###$&%=*;;;;;;;''''/<<~~!){/|5ioolifc9cff", +"cciltAEAwtwEIHAyoiigjiqqtwzDEKKMMONNNNKIEBAxwtqplkllllliililpwwwtptttpplififc55599floooppppwyyAABEEEIIIMNOQQQQQQSSSSSSSSSSRQQONMKKIHHHBBABIMOPOIBAABAwoc53|<<<<|39ilc3<~,*%%%%$###%*,,)))))),'>--;-*=%&%%$$#@@+++++++@@###&%%*;;;;;;;;;;;')/({''''!{_5fifc95599c", +"59cciwBBwptAIIEAtligdemmtwzAEIIMMMNNNNKIEAyuuppqollifeffiiiiiptwtppppppoliffc955555cilloppptwwyAyyAAAEEHIKMOPPPPQSSSSSSSSSSSRRQPOMKHHIEEBABEIMMMMIHHEBwoc5|<<<<|35fiic|/)>%$%*%####&=>>>,)))),,>>--*=%&%$$$##@+++..+@@####&%&*;;;;;;;;;;;;'!~{';;;''{<0cc953|359", +"95359lyBypptBIEAtiebdemmquxAEHIMMMMMMMKIEAAuqomqpomiicccfffgilpttppopppooifffc9553359filooppptvwywyyyABEHHIMOPPPPQRRRSSSSSSSSSRRQPNKIIHIIEEEEEEHIKMMKIEyoc53|||5559fol9|/)-%%%%$#@@#%*-->,,))),,>>>-*%&$#####@+++..+++##@#&%&*;*;;;;;;;;;;;')),---->,~|9995||||5", +"95259fpAypopyEBypicedeempvuAEHIKMMKMKMKIECAwuqmmoppoifccccffiilpttppoooooiifffc9533599fillopptwwwwwwxwyAAEEHKNOOOPQQQQQQQPPPPQQRRQPNIHEHHEEEEBAyAEIMNMMKApic5339c95cotl9|/,-%%*%#@@##%***-,)))),,>>-*%$########+++++++@#@$&%*******;=;;;;;;->),;===->,~39995||<3", +"35359flwytolpwwppifeggjmpqvxDHIIKKKKKKKIECAysrnjoppuplfccccfilllppppooollliifffc9555559cilopttwwwwwwwxwwyyCEIIMNOOPQQQQPONMMMNNOPPPOMIIEBAwAAywwttyEKMNNNIAtlc9cfc9cltti5<)>*%%*%#@@#$%%%*-,))),,,;=*%%$###@###@+@+@+@###$%&***=*&%&**==;=*==',>-*%*=>)<5c905||3", +"5559ccfowwoifooppofffgjmmrsuDFHIIIKKKIIICCAvurnkmnpppolfcccfloolloppplllliiifffcc9557550cfipptttwwwwwyywwyABBHIMNNPPQQQPOMKKKKKKNNNONNMKHAwwttttpoopwBIMNNNMHAtppoolotwo9|~,-***%$#@@#%%%%*>,,,,,,>=*%%$$###@##@@@@@@##@#$%&***%%%%%%&*=**&%%-,,>****->{3cc99953", +"5555599fopofdilptpihhgjmmruuDDEEIIIIIIIHCByvqqmnmolilllifccfioooooooooliiiffffcc9955333599fiopppptttwwyyyyyAAEEIKMOPPPPPONMKKIHEHEHIMNOONKEAytpoliiffipBKMOOOOMIHEAywAytf5/)>>**%%##@#$%$$%*->,,,,>-*%&%$$$#@@@#@@@@+###$&%&****%%%%%%**%&%%&&;'>==&&->,<9ffffc5", +"333||425fomgc9ipwtibegemmrtuxDBFEIIHHHIHEAyvuqqnmoifgiiifffffioppolooooliifffcc95595533335afilooooppppwwxwyAAAEHIKNOPPPPONNMKKHEBAAABHMOOONKIEwoifcc99cltBINOOONMKIHBBAyo9|~),-*%%$###$%$$$%*->,,,,>-*&%%$$#@@@@##@@####&&%%******%%%**&%%%&&=*>,,-;;->)<5iiiif9", +"1<<|_<139ipld0fowwocfgjmmrsuuxDBEEEHHHIHHBDvtqropomfddgfifcccfiopololloliifcc9955555553337adfjilllllppptwwwwzzBBEIINOOOOOONMKIIIBAwwwyAIMNOOOMHwof999599flpwEKNMKIHHBBAyti5|/~)>-*%%$$%%%%$%*->,)),,>=*%%$#@@@@########$&%%****%******&%%&==***>)~),>,'!/|ciffc5", +"_(<<<<122cloidcitypffhhmmrvvsuxDBEEEHHHIIEDyuusppmlfc0cdfffc99cioooolllliifc99553355557735a0behiikilooooputwAyAAEEJMNNNOOONMKIKICytqpptABHIKMMKEwof953599ccfowBEEAwwwwwwti953-*%%%%**%%%*=->))),>-;*%$$####$##$$$$$$&%&****===*===**=;--**->)//)>>>,)/|9c995", +"<((<-%%%%***%%%=->,))),,>-*%&$$$%%%$$&&&$%%*=*--*=--=-;-*=;--*=**=-,)'-*-->,~|9995", +"|_(__<(_}39loifciopifkljmmponrruuABBBBEHHHEBywxttpoofb99cffifc9059cffffififfc955333599990999ddcchgeiijonlrqptxxzECCHIMNNNNNOMKIHAuqjjkhinloooptyBBypf5||35559clpwwplifc99|<|3|/~~)>-*%****%%$&*=>>,,,,>>-*%%%%%%%$$&&&%%&*****=*==*=**&&*%%&&%%&%=>';%%**>)/3999", +"5|_(<*%%*-*=&%%%**->>>>---=&$$$$$$$#$$$$%&%&*%%&&&&&&%$$$$$#$&$###$*;;*&%%=;,<599", +"93<_<<-*%*---*&%%%**---;-***&$#######$###$$$%%%%$$$&&$$#@####$####@@#%=*%$#$&>)<55", +"953:_<|<}}}5fooic9c9bcijmolqmmppuwxAABABEEEEAyywwwttpoieccdcc999997333599ffffffcc99535599ccc88a99cdhfilonorqpxxAACEHIKMMMNMMNNMMKEAuqjjg8664}||59fiopyBBytl93||39iwBBtlf953|3|/),,,>-*%%=>,>-*******--**=%%$############&%&%%%$$$$#$###@#######@@@@#%=&$#$&=>)|5", +"5954||3|22239ipoicc9acfiooolqpqttwwyAABABEEEAyywwttpplkicccfc99999553|3559ccffiiiffc99cccjiiffcccdchiklooorqtxwyyBCEKKNNMMNMMNNMKIEAuqjg8a24:<<<|359ipyBEEAti93339ipwtplic533|>-**%*-,,>=*-*==**=***=%$$##########$$%&%&%$$$$###@@#####@@@+++@@$&=%$$&&->~|", +"35553|3352226fotoifccciioooolpmmttwyAABEEEEEAyxtttqoooiiifcfc995999955559cffiloooooliiiiilloliiifiilloopppttwyxAABCHIKNNNNMNMMMNMKKEwuigaa21:_(///<|9ipwAEIHAof5535ciptpoic533|>--*%&=>,,---*=***=*****%$##@@######$$%%%%%&$$####@@@####@+++..+@#$==&$$&*-'<", +"|599955555559cittoieciilioomlnmopttwyABEEEEBAwtprrppoookggf9c999999cccfcciiiilppppppoollliiiiiiiiillooopttwyyAAEEEHIFMNNONMMNMMNMMMIExuke861[_(~////|9fowAEIHAtf95559ipttpif953||~)>-*****-,,,-*=&%%%=***--*%$$#@@#######$&=&%%$$###@@@#####@@++..+@@#%;*%%&*-'~", +"<59ff99999599cfowtlfffiiilooonlomttpxwAAEBBBAytpqqpqplllgccdfcccffiiioliiiiilillloooolllliicddccfgiillloppswyAAEEIIKMNOOPPONNNMMNKMMIEymib64_[]{//(/||5iptyBEHBtic999cipttpiffc95|/)>**%%%*-,,>**%%%$&%**---**%$#######$#$&**=%&$###@@@@@##@@@@++++++#$=;-*==-')", +"/39fifcc999599cipwplfifffilooolimmoouutwyADAAAywtrrmmmiiiggdgiiilpptpppliiiiiiifiilllllooolic9099cfigiiknopuwzzBEHIKMNOOPPPPOONNMKKMMKEwoia61[]/<||||||9fiopyBEBwoicccflppoiffffc95<)--***=-,),-*%%$$&%%**----*%$###$####$&%%**%$$#@@@@#@#####@+++++@#$*;,>>;>,)", +"~|5fiifc9999559fottpliiffcilllkikkglnrpuuyAAAAywwpqrnliiiilikllmopwAywtplliifififiilllloooolic0899dffiijnlrutxxAEEGKMMNOPPPPPOOOONKMMKIBwof94}<_|33|>>>>>,~~>-=%%&$$%%*->->--*%$$&%$$$$$%****%&&####@###$$###@@@@@$$=>)))>,,)", +")<3ciiiifccc999ciottoifc988fffgdhgggmlrquwAAABAwturpqomoploollllopwyyttptplliiffffffiiillliiifd99999fiijnloqtxwABEGILMNNOPPPPPOPOONMMMKIEtic62<_|33>>,,>,)~)>-*%&%%%%-->>>>>-;**&**&&%%*;**=*&&%%$&$$$%%%%$######$%%=,~{),,,", +"~/|0ioooiiffc95559iolfc986a9cfegfbggijmmquyAAAAwuqquuttttpoooiiiilopttttttpplic99999ccfiiifcfccdc800cffilloqtxxACBCIKKNOOPPPOPOOONMKKKMMKEtl92__<|3->,,,,,)~,-**&%%%%*->->>>>>------=*=--*****&%%&&$%$%**%%$#####$%&&-)//),)", +"/<|5cioolic995|||19fic999626bcfgdbgggiinmqwyAyyytpquttwttuppllifffiloopttwttplf955599ccffffc9c9cc990dccfjjmqsuuyCEEHFMMOOPPQPOPOONMKJHHIKIEyoc3|/_|<-&&%%$$%**;->>>>>-----------***==%%&&$$$%***%%$$$$$%*=*-,/-==%%%&&&*-->>>>>--->>>>>>-;--=*%%&$%$$%*---=%%%%%*--->,)<<>,~~,>==*%%%%*-->>,,,,,>>>;,,>>>>>---***%*%%*-->--**&%%**=**->,~/~", +")'''')/|9993|<<<((/(<7c9056266dcfghgkkooqrqtwyABBAAywtpommlkiiiiffcc99ccfiiiiopwyytlfccfccc99ccccccfiiiiloqppxAEEGFFIMMNOOPPPPOONMKKHEAywwwyAywoc53353|<|553|3359fflliiltBHHEyo933333||=&%%%%%%*-->>,,,,,,,>>>>>>>---**=*%%%$$%**%%%%####$&&%%&-,)~", +"!!''>,){|553|<<<_({~(|9c90566689ffgfkknlqrqtyBEEBBAywwpolkkfggccfcfccc9cffffffipwAAwpiffc9999c9cccfgifilloqpxwBHHHIFILNNOPPPQPOOOLIFCBAxtpptwAAtl9533533599533359fiiliiopyAEEBApc99993||,,>&$######$%**-->-----;--*=-***&%%%&$$#####$$#$###@##$$$&&*;>!", +"!!';-;''~|553|<<__{{{(|9cc0866889fgikklinnqtABEEEEAAywtrllidd90999cfiiifffcc9cffiotwwtoif9999c9ccccfiiilinmpuwAEIIKKMMONOPPPQPPOOLIFAAyurmmoptAytof5||||59fccc99cciiloopptABAABApifff53||<~),>**-,,>*$$#@@####%%**=------=*%**%%%&$##$###@@@#######@@#####&%%&*>", +"'!!>;;;-,~|553|<__({]{_49cc066aa0fkifkglnrptyABEEBBBAAwpolif9999099ccffffffc99c9ccfiotttoi999c9dccffiiilnnmruuAEHIMMNMOOOPPQQPPOOLLFBvwqrmieiiptwwplc5|||39fiopppiiiloopppwBAAABAplii9533|/))>--;>>>-&#@#@@@@@#$%**-----;=&%%&%%%$######@++++@@##@@++@@#@#$$&%%-", +";'!,';--;,~|5531<_>-->>-&#@@+++++@#$$%*----*=&%$$&$##@@@@@@@.+++++@@@@+@@##@##$&%==", +";;'),'-=->,~|553|<|<_(~][20cc969afgkimioptuuwwwyzAAAAAwwtpoifffc995573559cfiiifc955599flppoliccccgfiiiooopqppuyyBGFKNNOOPPPQQQPOOOLIFzvtqkeb96259iopoic99599ftINIAwwtpoollowBEHEEAtlf955993>-*$#@@@++++@##$%******&&$$$####@+++++....+++@@@++@##@##$&%==", +";;;,',>--=;,(|5353|1<_]/_}29cc98ccfiommpptuuwwwxwyxwxwwwttpolifcc9533333559ciilic953599cfloollicccfiiiiolpqqpuuyACHKNNOOPPQQQQPPOOMKFzzwqkij96}||5ciif93359cipEKEtooppttpoopwAEEEBwpif99cf93|<>--&$#@@@++++@##%%*****=&$$#$$##@@++++++.+.++@@@@#@##@$#$%%=;", +";;;;,,,>===;,(|35533|1_/(:}5cffccbfipppupsuuwwwywwwwtpptttppolifc99533333559cfilli955559cfiilooliiiiiiillloqrwuyCCEKMNOPQPQQQQPPOONMKCByumjjc9}<_|39cc9|<<39flAIBpc9cipwwtppttwyAAytoifffi93|<--*&##@@+++++@#$$%**%%%*&$$$$##@@++++.+++++++@@@#####$$&%==;", +";;;=>>,,-==*-,~|35577|1,';***-,~|555733||}:15ciilfffltutppqptvwwttttttpppoomoliiiifc955333355559fillif9909ccflottpoolnlmlloqqpuyyACFKMNOPQRQQQQPPOOOKHBAupojeb52<(/<<399|<~/|9iwEAl9599cilptwwtliiottpifc95||,'-***-,/|55557552}|38dfllikipqqppqpttttttttttppppollliiiiiffc953333353359filiic9009cflpttpppppppoooppxuyBCFLNNOOQQRQQQPQOONMICwurmjeb564|(]{<355|/~~3fpABtfcffiiilopwwtiffiptoic93-****$#@++++++#$$%%%%%%&&%$$##@@@@++++++++++++#####&%$%==;;", +";;===**->>>-***-,/|59599c96|458ciloooqmpoqqpsttttttttttpppooliiiffiiifcc955333333559fiilic909cloptwtwwwwtpppptwwABGHKMNOPQQQRQQQPOONMICzqlkfa85434_~{~<355|~~/5iwAwicfltwpolipwwtlffiptpof5|/~/~,,)~)>*&**%##@+++.+@#$$%%%%%%&&%$##@@@@+++++++++++@@@#$$&%&&=;;;", +";;;===**=->>-***-,~|5599cfc556a8flpttpmooqqpppputttttttpppooomiffccfffiic995553335599cflolifcdiotwABEEEAwwtwwwAABEHIMMOPPQQQRRRQQOONMICAwqkbb67}<1|>--*-;,/|599cfid9a66cipwwwppopqqprpuuttttpttpppoollifcccccffiiffc955755999cfloppollotyBHIKIEAywwyAEBHIIIMNOPPQQQRRRQQPOONLEztqjhb64[_/(/>>-*;;,(|599cfifc66bfopwwtttuqmopppoppttptttppoooliiifcccfffiillfc99999cccfilppttpppwAEIIIHEAyyyAAEHHIKNNOOQQRRRRRRQQPOOMIBxqjhb62_[{{{~//~~/|53|<<|5cooiipyEIKIHAywywwtpllpttof3/~)),>,))>*%%*%#@++..+@#$$$$%***&**%$#@###@++.+++++@@@###&*=-;;;;;", +";;;;;-=**&==->>>;;>>)/|55ccggf99ccimpwwywtpmmmponoppptpttpppoooiiiifffiiiiloolifcdf9ccffiiilpttttwwABEEEEEBAAyAEHHIKNNOOQQRRRRSSRQQPONMJAulkb861[({'!)~~~~<|33|<||5fiiilwBHHBAAAAAywwtplllopoc|/~/~,,'~)>*%%%&@++..++#$$#$%%*=&***%#@@##@@@+++++@@@####&%=-;';';", +";;;;;-=***===->,';-;''(|59ccgffcfehklptywtppopmmnnoooppttpppppolliiiiiiilllooooliiiffcdcff9bfltwyyyyyAABBEEEECAEBHKKMNOOQQRRRRSSRRQPOONKHzrmf861[({!,,,)))~<3553|||5cfiltAAwppttyBAywwwplilptpf3|',';-''!{|99cfefilifgjmqttwtppoomlnoopopppttppppoooooliiiiiiopppooolifc999d99ciotwAAywyAAAEEIIHEGBEIIIMNOPPQRRRSSSRQQOOOMKHAulia7}_({),,,,))~<3995|||39fopwyplillpwBAyyyypliowwtic53|//~/~,-&%&%#@++@@@####$%**=****%#@@##@@@+++@@@@##@#$%*;;''!!", +"!'';;;=;;***===;',,',''{_26cifiopplkiimoppppololkinoopoppppttpppppoliifffffoptpopmlic97759a99cfiotyyyywwyABBEEHHEEHEHKMNOPPQQRRSSRRQQONMKIBysric0a|_~)',',,,)<3995|||3clptwtoiffiptwAyyAytllpwywpi953|*%&%%#@@@@@@##$$%*-*****&&####@@@@++@@@###@$%%*=;''^^", +"^!'';;;;;****--;>,,!'''!{:29fiipptpojiiimmopooiiikiolooppppptttttpoliififfiottplifcc99079909099dioptwttttyAABEEIHHHEGKKNNOPQQRRRRRQQPONMKIEywpolfc93|(~))',),~<3999|||5fllopplc99foptwwyAytpopwwwtof99|<<<)-%$$%$#@@@++@##$$%*=-***=&$@##@@@@@@@@@####$%&*=;;'^^", +"^^!,';;;;;;**----;,!{!!)^]16bflppwwplkifhfllmlliiggilloppppttwwwtpoiiiiiiilpwtlfc055999c05508888cfilpppptwAABEEIIKIIHKMMNOPQQQRRRRQPPOMLIIEAwtolffc953|<~))))){<59c93<|9fffillc559fioptwyAywwwwwwwwpic53||/,*%$$%$#@@++@##$$%==--=*=*$####@@@@@@@@####$%&*=;;'!]", +"!^^!''';;;;;*----;>'{]{{^]_16cipptwtpokddccfililfffgfilmopttwwwttpoliiiiloottoic933375599009d909ccfflopttwyABEHHIKKMKKMMNOOPQQRRRRQQONMFGEEAwppigcdc9953!!", +"{!]^!'''';;;;;;;;;;'!~]:^(:228ioopptpplgcd09ciiiiffddfilmptwwwtttpolliilppptpic9553|433599ccccccccfcilptwyyAEHKIKKNNNMMNOOPPQRRRRRQQPONLEBAxtplfifcc99554|<%&%%%$@++@##$%%&*---*&=%$###@@@@@@@@@####$%&*=;;!!", +"{!!^{{!!''';;;;;;;'',!{[::_}26biopppppolgd00a9fffiffddfilpttwwtttpooolopttttoic9554|}1|35dfcfffeffgilopwAEEEIMNOOOOPOOPOOPQQRQRRRRRQPONMHCAxtnied9999555543||||<--&&%%###@@@@@@@+@@####$%*=;;'!", +"!{{!^^{!)''''';;'''''']^:11}26bbeiloooooifd0786ddgfffddiiopppptttppppopttttpofc95511<|13559cfilliloptwyBEKMNOPQQQQQRQQQQQQQQRRRSSRRQQPNMKECxsqib8967575555533333|<<|59fc53599ciof5|||5cfiffioyEEEEBywtpoli9**%$$$#@@#$$&&**----=&%%$##@@@@++++@@@###$%&%=;;!", +"!!{{{]^^!!!''''''''''!^^_162668abcfilllliic9776500dfifgillliopptttttpptppttplfc953|||3543559ilptttttwAAEIKNOPQQQQQQRRRRRRRQRRRRSSSRRQQOONIHBytpkb85633755555337553|<|3cc9559ccili93<|5cfili99itAEHIBAwtplic5|~,--%%$$$###$$&&**-;--=&%%&##@@@+++++++@@###$%&==;;", +"'!!{{(^^^{!{{!)'''''^^^(_}2aaab888bffiiiiiic9725500cfiiiiifiiloppttwwwtppppoic9555333555559fiottwttwyBEHIKKNOPPPPOPPPPQQQQQQQRRRSSRRRQPONKIEAywplf9a4773334333335553||599559cfiiic3<<3ciilic59fowBEEAywtoic95<~,;*%$%%%%$$&$%%*----==%%%$#@@+++++++++@@#@#$%%=;;", +";!!{{{({^^^^({{!!'!^^^^(_}}26cba8aa99cfjffffc9732357ciiiiifffiilpptwywtpptplf995555595999ffiiloptwwyAEHHEEEEIKMMMKMNOOPPQQQQQQRRSSRRQQQOONKHBAAwtoi995573||||33||3555359c95559fiif9|<3ciloif9559fpyBBAwtplc95|/~,>*%%***%&&$%%*=----=%%%$##++++++.++++@@#@#%&%=;", +";;!!{{((({^^^[[[^^^{^{(_}}}28bb98aa868accffccc9743570ciifffffiiloppwwttttwpic953559999cfiiiffioptABBBBAywyyyAEHKKMKNOPPPQQRQQQRRSSRRQQQPONKKEAywytqlf9053<<_<<||||335359cc95359fiif9339ciolic54|39ltAAyytpi95|*%*->>*&%%***-->>==%%&#@++++....++++@##@#$&%=", +"=;;!{{((_(((^^^^^[^_[(__}}2268ca698a6a6689cccfc976357ccccfffffiilptttpptwwpic95359cffiiifccciotwAAAywwwwtwyABEIMNOOPPQQQRRSSSRSSSSSSRRQQPOMMIBwwtttplc997|<<(//<<|||33359ffc5339ilif9559ciiif951<|9ityyywtpi93**->>-*%%%***;>>;=%$$#++++.+.....+++@##@#$%=", +"=;;'!{{(____(((__1111122}}}66866a6aa2}}}65999cc9d959999999cfffiilptpooptwwpic9559cfilifc99flpwyAywtppwyAAABEHIMNOPQQQQQQRSSSSSSSSSSSSSSRQPONKHAwpppoifd0554|_/(/~/<||33359fic535cilifc959cccfc9|<<|5fptywtplf93--;>>-****=*->>;=%#$#@++..+++....+++@#@@#$%", +"%=;'!!{___}}__[___1122222266a22226662}[:[2355999cc99d95559ccffiioppollpttplifc9ccfiiic999ipwAytppppttyEHIIHEEEIKMOOPQQPQQRSSSSSSSSSSSSSSRQPONKHBwtpoifc9577553<<{//<||33|39iif959fiiffc99959cc93<;-;>>>-;;***->>;%$#@@@...++++....++++@@#$&", +"&%=;'!{___}}}}}}}}}2226a686a222222662}}:[:}225799cccd9955799cfilopplilpppliifffiillc535clwAAypllotwyyBEIIHEAAyBEKMNOPPPPQRRSSSSSSSSSSSSSRQQQPONKHEAyplifd5559553|>>--;-->>>>*=*;>>;%$#@@+............+.++@@#$", +"$&%=;'!(__}}}}2}}}}}}2268aa86622}22222}[:[[}}32399dff99555599cflppolilopliffffiopof5|3fpABBytooptyAAyAAyAABAAAEIMNOOPPPPPQQRSSSSSSSSRRRRRQQQQQQPPNKKEAwtlf95555953||<-->>>->,,>**->>;*$#@@@+..............+@@@#", +"#$&=;>'!(}}}}2222222226866626662222}1}}}1::}}[}|300c9999955999fipolliiooiffffiiooi935cpAEAywtttwwyyytppptAEHIIMMNNNNNOPPPPQQRRSSSSSSRRQQQQQQQQQQQQPOOMIEypic53|33|33||<|3|||39ilfc9cfiiffc553553|<<->>>>>>),,--->>-*&#@@+++..............+@+@", +"@#$%=;'!^:}}22886666666666626662222}}}}:_:::__::|3795999c9999cfloliiilooiffifillf999coAEBwtwwwwwwwtoiiopAEKMNNNMKIIIKKNOOPPQQQRRRRRRRQQPPPPPPQQQQQQQPOOMIEwpic53|<<|33335955|39fifccfiliic93|333|<,,'>,,),,--;>-*%#@@+++...............++@", +"@@#$%=;']{_}}2866666666666}222222222}}::::<:}[::}|3335799999cciiiiifiioliiiiiiic559coAHEAttwwwttpliffotAHKMNNMMIHBEEEHKMNOPPPQQRRQQQQQPOONNNMNNOPPPPOOOOOMIEAwpi9|/<||3335993335cfccfiooli953|<|--;-=%#@+++.................++", +"+@#$&*=;'^]_}}866666666666}}22222221}1[_::_:}}:_||11|439999cffiliiiffilliiilllf559ciwEHBwwwtttplfcciowBHIKKIHEHEBABAAEEIMNOPPQQQQQQQQQPNNMKKIHIKMMMKMKMOONNMKKIApc3<<<|||35555335cfccflopoic9|//~~~)))~//<39iif9335995|/~~{)){!)),>---*%$@++++.......... .. ...+", +"++@#$&*;;'](_}266666666666}}222}22}}[:[::[[/}||:|}1<<||55999filliifffilifiloplc59fltAEAwtwtpptlc79itAHKHHEByyABABABAABEIKMOPPQQQQQQPPPONNMKIIHHHHIEBBABIMMMMNNNMEti93;--%$#++++...... . . . ..+", +"++@@#%*;;'!^(_}26666666666}}222}22}[::::]]]:<<||334_|||33559filliifcfiiifioppicciopAAyttptpttof50fpBIMKEEAwptwyyAACBABBHIKNOPQQQQPPOOOMMMKKIIHHEEHEAAwtwABBEIMNNMHyoc5|////<<||||59cfffloppoi93/!,,)),,)<<<<|59c953||5cc93|<-*$#++++...... . . ...", +".+@@@$%*;;'^^(}}2666666662}}222}}2}[::^^]]]::::}363||||1|355cilliifffiiiilopiccipwAEytppppptpi99itBHKMKHAwpoppwwyAEEBEBEHHKNOPPQOOOONKKIIHEEBBCBAEBAAwttppptwBHKKIEwpi93|///<<|3359ffffiloppoi9|/))))),,)/(//<35995335cffc95|,)~~~/<|595559fiifc93-',))))~<359999fllif93*%@@++... ", +" ..+@##&%=;''!^(_[}66666666226222a642}}}<<::_::}|1_<:|1|3557cfiiffffioopptplffoAHIHypollppi95fpEHBywtpolproppwywttuzEHIECCFFKNOOOONMHIIEBxxppmlhjffffgfloomlliffiotwAABAAwtpf53||350ciopifcfiiiic5|---,,),,)/|59555fioif93>-;->,,,,)~|55559fillf95_/!)),>>-$#++... ..", +" ....+#@#%=*;''^^_}}}6a6a99899889b99652|}1:_:]:<<_(//<_|||359fffcc99flopppliltEMMKApifipti95iwHIAtpopptwwwwAzwpnnquAEAEEJHIFKNNOMMMIHEEEAAAtqqlgeba87976809cgiifffiffilpwBEBAtplic95439cfc99cfioolc5|>>---,,,,)/|3559cfiolic5<{~),>--*$@+.... ", +" ...+@##&%=;;''^(_[26a688aa99cccfg99522|||<:<:||<__/__|<||59cfc9999floppoiioAKNMEwlfclto939oAIEwpppwBBBAABAwppnquwEBAABGKKKKLNMKIHHHHBBAAwtpooiica8774263779ccccfcffccfltAABAwtof9533|599ccciiopoi95|>>>>',)),)/|399cfioooic5|<~,>--*%$@+++... ", +" ..++@##$&%*;;'^^{[}}6689aaabbcfif9956333|||||4|||<|_<|<||79ccc9959flopoiilpEMNIApiffpti53fpAHEwppwEIIEBAytuprrtxAEACzCCKMMNMMKKICEHHBByAwwqroolfda573}24347759999cc989ciowyAAwplf957||359ciiloooic93||/),>>,>>>>,)))/<59cilooolic93<),>-**%$@++.. ", +" ..+@+@##$%=*;',^{_[26688a98999cif995532533}||||<|<1__|||359ccc9959flopoiiowHMIBtliflwwf90ltwBEAttAEEEAywtpqtttwyABAAAzBFLMNNKFFECBEEEAyywtupoooigca74}}1|14335355999999dgltwyAwpoif973359cffilooic9533<~!,>,,>-->,))~/|9cflllliiif9|/'>-*%%%#@+.. ", +" ...++#@##&%*;;,!](}}2aaa66809a9fic9966333}:1<|1:<___||||3599999559flopliotBIIBwoffipAtf9foptABAywwywttttptpttwuuAAEBCCGHKMOOMKIBCCCBEAAwwuupppplifc77}}211114|33369909999ciptyAywtoof95599999filif9533|-->)///<39ciiiiifffc5<),>*%$$##@+.. ", +" ...++##$$&=-;'!^[_[266622aa86dcec9965334|1_<|}:<___|<||3399995559flopllpAEIEypifflwApcclooptyywtpojnoptttpspuuxyAEEGEIKMOOOONKCCBEBEBEAywwwtppoiie97322|1||1|||||7589999cfiotyAAAwtpic55555359ffc53||||<<~~),>>->)/<||359fiiffcccc9|<~,>%$#$###+... ", +" ..+@@$%%=-;','^^(_}6662269989bb900077574|||||<|1__|<||1399995559fopplowBIIEwofcfowwlcflolloopligceiopptqttwxuAAEHIJIKMMOOOOOMIJEEEHEIHEAAAwwtpollc9722|1|11<||_<|2695099cfiopyABAytof953333|39c953||||||>--,~/|35999cfcc9955553<~,-*%$#$$$#@@.. ", +" ..+@#$&&**=;-;>'!{[[26622a8888dd0076777734333341|<||<|14599995555flooiowEIIEwl99fpwti9fiiiififcc9cellopqqpzyzBBEEEHHKMMNOONOONMKKKKIKMMKIEEBAwtppplic96733|11<|_<<|||23350ccilpwyAAwpic53|33|||5553|<<<|||->,)~<399999c99953||555|/,>*%$$$%%$@+. ", +" ..++@@###$&%=*-;;,!!([[226aa88d00d077424633333574||||||||4599955339flolipyEHHBti99fpwoc5cff999ccdccffijoomptAAABBEBCCILLMNOONNOOOOONMKKMMNMIEBAypppppolie0955|1|||||<<:<<|379dggilpwAAwpi933353|<|33||>>,)~<|59c99c99553||3595|/,>-%$####@+. ", +"....+++@@+##$%*=*;'!!([[286660dd000a666224233355531|3||3||3999975359flolipAEEBAoc59fpwoc59c03439cddchfiloqqpxwyBAEEGCEFFKNNNONOONOONKIHHIIMNKHAAypolloollfe9090334|||<<_<::|25ciiifiptyAytlc55995|<|||<<~~~<|33|/),>>,)/<|3599c995553|||555|/)-%$#@@@@+.. ..", +".......+++@##$&*-;>'!([[286000ddbbca6622}}}43435311|||3|||3999995359flolltABAyti959itwl939c931409999cfiioqrpwwBEHEEHIKKMNOOOPOOONNNMHEAAABHKMKEBAwpoiliiifc999099953||<|<<|<}39fifffiptyAAyof9ccc9|>,,{<|||-*%$$##@+. ", +" ...+++@##$%&*;'^{[[260088bbggkkgd07744411355||<|||_<|3599995335flolpBEytoi955coAwf3|3|||<||279fiigikopxAEHIIHIKMMOOPPPONKIHCGEIIKIHHEEHIKMOOOONIBywttolfc909999cccc963||2|433||||359ipwABAwpoi9|{]~)'>,>>,~/|3||*%$#++++.. ", +" ....++@##$&&*;']{([28088bbkggkkgd07a46662553|||||<<_|3599995333clolwEEwpif535coAtc||31_<13769fffffjmpwAEBEBBEHIKNOOPPOONIFECGEHEIHIHEEEIIMOPPPPOMHEAwwtpliilifcccffcc86532||4|<_<<||3dotABBAtoic|~!)),,,,>,)/|33||%$#@+..... ", +". ....++@##$&%*;;!{^[280b8ggkgggklifd98676265334||||_<|3599995333clllyIEwlfc5|3coyt9||3|--'/|3331|<||39c97|555553|<<~,>->)<||~>%$#@+.....", +"........+++@##$&%==;!!([28abghggggmlligfd866533952||||1_||3599995333ciloyIEwlc9||3coyp93334-=;,/|35533559cgf953333||-%*,~||/,*$#++....", +".++.....+++@##$&%==;!!([280hhggglljmliffd9668a6952||||1|||35999953339ioowEEwic9||5cpyp93334|<<|769fillpxwwutwvxzDFIMNPPPPPOOONOONKIIHIMNOOOOONNNOPQQQQQQPPPPPNIHEBywtpollf99999553|1|_/_<|3|359ipwywtpic|/~~),>;-=-)<39c9c99cfffc72|<<;*%%-)/|<)-%#@+...", +"..+++...+++@###&%*=;'!(:2a0ghhgllllmliffcd95607055|4|1||||3599c953339ioowBBtic9||5cpwo931|4555099filopttuqsrvxzDHILNPPPOOOONONOOKIIIKMNNOPPPONMKKMNOOOOPOPPQPPPOMKEBAtpoolif97565533|<<<<<|353|5citwwtpl93>>>,/|59ccccc9c99931>-%%*>~<|/,*%#@+.", +"+..++++++++@###&%*=;!!([280gghilllplmifdcd997868554|1|||||3599c953|39ioptAApfc5|39ftwo93||49filliiiottuommrtvxCFILMOPOOONOONOOONKKKNNNONOOOONMIEEEEEHHHIKMMOOPPPPONMIEwpppoic85555753|1<<<|5333|49iptwwtlc5|<~,,,>>>)~|359cc9999053|<_())!~~~),>>-*%%*,/||~>*$@+", +"@+..+@##@+@####&%*;;!!(:2abkgjjjopqlmkfcd90870600541||||||35999953339ioopywoc95||5fpwoc53|4cioppoioptpmhmqrvxBEFKKNOOOONNOONONNMKMOPPOOOOONMKEAywwwwAAAABBEEHIKNONNOONIEywtoic9975355573|||33|33435cotwwtof9|/,>>>>->)~<359dcc999572_(/),',,!)),,>>-%$%-~<|<)-%#", +"##@+@@#########&&*;;!!([28bknjjnrrrmlifcb90990850541||3|3|35999953|39foopwwi953||5fpwofc535copppoopwpmjmmrswzEHILKNOOOOOOOOOONMMNOPQPPPPONIHEAwwpppttAAAAAAABABEIIIKNNNMKEAtpiiif955559053|||||333339lpttoif5<)>>>>>-')/||7ccfcc99721<(~]!'>,')),,,>-%$$%>/||/>%", +"-%$##@@@##$$$#$&&*;'!{[[26bknmjmrrrmllggc9009d09055533333|35999953335flopwti953<|5ftypic9|3clppootwpnkjmrpxzBHHLKNOOOOOOOOOOOMMNOPQPPPQPNKHBAAAwpooptyEHEEEEBBBBEHEEEHIKMMKEAtoolf995590953|||1437|||9ilpoli93/,>>>>;;,):<359iifcc964|,',)),,>-*%$%-~|3|)", +"~,*%$##@@#$%%$&%&;;'!{[[2abknlrmqrqmllkgc9089dddd055553333359ccc53335floptti553<<3ftytif9330lpplpwtlhghmrwyzFEILMNOOOOOOPOOOOMMOPQPPPQPOMIEAAABAwptttyEIKKKIIHHHIKKEBAAEHIKKIEytplf953335555||11273||35ciooif5|/)'>>';'']_|30fiigc95241<~!)',>;'',),,>--%$$*,/||", +"|<~>*%%$$#$&%%=*=;;'!{[}20bkorqrqrrrlmifgc988cgfcd59555553559fff95559floptwl553/<3ftAwoif530lppotwpfggmmszzBFEIKNOOOOOOPPOOOONOPQQPPQQPOKHEABBEBAywwywAEKMMNMMKMNOONKEAAAyABHIEBwpic953||35553345993||35ciiif95|/)>;',,!]/|26bcfiff9631|;>,,,,,,>>=%$%-)/", +"/||<~>-*%&&$%%*->;''!{[}60bkosrquusromliifc9cdggigc999955599ciiic9559foptwyo993/<3ftAytpi95cmoopwpihgemmtAzDEIIMNOPOOPPPPPPOOOOQQPPQQPNMIEEBBAEEEAywyyAEKNOPPPOOOPQQPNIBytpppwBEBytlf953|1|35555dfg9933359fifc95|/),,))]!(}269ccecfc9534|_(~!,>>>;>'>,,,,,>-**-,", +">)<||/)>-=&%%=*;;''!^_[}a0bhutsuussuooolifd9dddfkigc99999599fiilic999fptwABpcc5||5iwAAAwofciooowtlhhgemqwzzBCHIMNPPPPPPPQPPOOOPQQPPQPNKHEABBAACEEAyyAAEKOPPPPPPOOOPQQQPMEypliiowABAtoic931||359ccfiic953339cfc953|/!))~]{([}0accbcc999053|<<~!',>>>--;''!),,>-**", +";>)/|||(!'>-*=-;>'){]<}a6dkovtuuuusuroolifcccccdgiicc9995999filiic999fptwBEtic5||5iyBBBBwliopptwplehgjmqwyzDCHILOPPPPPPPQPPOOPQQPOOPOKHBEAzzwyAAyyABEHKNOOPPOONMMMNOQQQPNKBtlffiotyAwplf931||359dfiif9993||5ccc93||>;;;-',,),,;;", +"'',,~<1|>>,'!]_126adknvtxuuusqqqoiifgc900ddiifc9955559cfiif9959clptAEtic5||5iwByAByoopptwwolfegjqwwyzBEJIMOPPPPPPPQPPOPPQQPOONKHBBzwxptwxwwAEHKMNMMMMKIIHHIIIMNPPPPONKApiccfltyywoic73|359cgiliic953|35ccc5|||||:<_}}}6bbebc8a5269977||-=*;->,)))'", +"~~),,)/<|||(!)),'!!^_228bbknruuuuuuqpqpokgga90009iifc95555559cfff95359iptyBti95|<3ftytpppopppwwpolhhknuywzzDEJKMOPPPPPQPPPPOPQQPONMIHBBywuurpttutyEKNOMIIKIHEBBEEEEHMOPPPPOONIyoiccfltwwtlf055559dillifcc93|55ccc53333|1|21668bheca97424375541<<({),>>-==%*->,)!", +"~~~~))~/<|3|;=*=%&&=;", +"->)~{(<|55||<|34||}|4268dbhnvuuttuqqqnlnkhdda0999ccc9995353359ccc93335citBHyi93/~<9iooooofcilifggeeknrtwwyyEEINOPOOPPPPPPPOPPQPOMKHEHEAxprnnmpmkiopAKNMMNMHAABHHHHEBABEKOPONOOOOOONHwoifiotwtoicc990ciid3|355335cffc909c99dchgggghb8877}2__<|35554|<((),--==&&&%", +"*=>,)~/<|7|<<|14376786bbhhknquvtvvqqqqmmmkgd09b9cccc8995353359ccc953359itEHAi95/~<5floooicflifddfchkruqtwxzDEINOOOOOPPPOOPOPQQOOMIEHHHApprnkmqmhkjltEKKKKIByyAEHIHEAyyyBHKKIIMNOOOONMEtlffipttpifc9599fc9|<355559cfcfc9cccffkllkkeeb985321_<__|7555||_~)'>;==&&%", +"*=>;','{/<<(_<|436509cffgjmnrvvtvwwtuqmmmkfdccbccccc9599553359ccc953359itEHAoc5<~/3fiopliiloicabbbhknqqptxzDILNNOOOOPPOOPOPPQPOONIIKKHtppnkkmqmkkjiotBHKKHBAyyAEHIEBAwwwAEEEBEHKMNNNONHwoicflppoifc955cfc3<<|3595cfiiiiffcfimppnmmffb953}}1_<(__|333|_,,,,)~(/__|36709cfgiknnstssuwvvvttqmmmiifcbbcccc9999995599cffc9555citEHEpf5>''',,'!{((<|589cfcfiloqttxtutvvwvwwuppoliifbcbccc9999cd999cfiiic999fltEKIwi9|<<5fipwABAtlcb88bcimlmprsuDDJIMMONNOOONONOOPQOOPNMMOMEvqqmkkkmmmmhefhiopyAAyyyAAEHIIEAwtwyAytpptwABEINNMIAof09cilliffc9cfc92||359ccilllliiiiloopppqiif9953}}<__/({(/(<_1<;>''{<<11<", +"1|44322}[[[[:_12|226bekopuwyyyyABBAyvwywtttrliffccccc8990999999fiifc99cioBMMEp9;;->;'{_<|", +"|35599652}[1142a6268abhiottwzyyyAABAyyAywwwpolifeccfcc990509999cffc9559ciyKMIwc|>,~<", +"~|49cccdd0755766aa8abhhjmpuxxxxwyAAAAABBAAywpoiifffffcc90999999ccfc93335ftHMIwc3|<|9959fgb968bbcioomkoruyDGGIKMNNNNNMMKKIIKNOKCEMOONHtoioonilnoptuuptttpollpttpoffccfiolfcccfiotwtpooic99cffmtyAwtpoppwAytpooifcccc9cfjioptwtuuuqqqnnmmjiliifc0|[:!'';;------->,", +"'!_49ciifdefc898abbbbgehmptxwxxxxyAAAABEEBBAwpolieffiffcc909999cffc95335coBKIyf|>;;>>,,)~~/<<<<;>;;->->>,,)~/<|||||<<<11375cfiiowABHIKKMKIHHKKIHHECGEHGEHIIKIKIIIFIKKMMKKMLKKMOOOOOOMKKIIJKMMMKKMKNNNNNNO", +"ONNNMIJEDzxvvnnnhggbbbaa7744411111112}411423599cc52200adiptwywzAzzzAEEBAABCBECCCGMMMMJCzCEEHEBFGIIMNNOOOONMKIEAzwwwttstttxwwwwttmhgghbiec8833|_[^{)!',>>;>>>>>>>,!!~/<|||33111|3779cioopwAEIKMMIHHIIIHHHEGEGGGGHHIKKKIIIFIIIKKKIKLLKKMNNNNNNMKKIJIKLMLLLLLLLMMNO", +"LMNNLIEEDxxvvnnkhgbbb0a7774441}[[[}111}11134459cc5220dadjpwwzwywzzAAzEBBAAEEECCCHMNNMIGBBEEEEDFGIJMMNNOOONMKFFzxzvwvssssuwwwwtummegbcfb906|1_(^^^!!',;>;;>->->>>,'!~~/_||3373||376acglpttzEIKMKIIHHHGEEHHHGGCCHHIIKKMKIFFHFIFKKKIIKKKKMNNNNNMMKKIJJKMMLKLLLLLLLL", +"LLLLLJEEDvuvrnkggaaba0aa222}}}}[[:}}[1_:1112239995345badiowwyzwwwzAAzBBEEEEHGGCGIMNNMKHCCGBEDDFEIJMMNNOOONMIFDzxzxwxsssstxwwussmedgebe8622_(((]]{'''>;>;-*-=---->>,))~/__1137337aa9dilptwzAHKKKKIHEEGEGHIHEECCHHIKIKMMKIHHHFFFKIHIIIIIKMMKKMKKIHHEEHIIIIHHHHLLLL", +"ILLLLHDDzvvvrnghbab00a6a6}}[[[[[[::[[_1_:11211|441247adhhmtwyzwwwvzzAzBBEEEHHGEIIMNNMKIFCCEEEDEEIIKMMMNOOOMLHFDzzwwxssstwwwtsummegecba62}__({^^^'''>;--=**======->',)){(__<|4508600chkptyACEKKKKIECCEECHIIHEEEHHKKIKLMMKFHFFFFFHHHFFIIIKMKKLKKIFFFDFFHFHHFEFHHHI", +"FFHHHHDDwvvvrkghba0066622}}[[[::[::[:[[__[11|1|111135a0henpwyxwwxwwzzzBBEEHJHHIFKMNONMIHFHEEDDDEEIIMMMNNOOMKHFDzxzvvvsstwwwtmmmeggccaa2}_({{!!^^'';-=*=***&=====->>,,!){_<_|4609ddhbflowyAzEHIKKIECCCBzBHIHEEGHHIKKKKMMKFFFFFFHHFFFHHHHIKKIKKKHEEDBBBFFFFDDDFFFF", +"FDFFEFDDxvvrnkgbb00662222}}[[]]^]^^][[::__[1111111112a0hhjrwywxuwwwwzzBBEEGJIKFFKMOONNKHEHFEFBFEEIIMKKNNOOMKHEDDxzxvvsstwwwsmmmeghfb62}[(^{!!!^!';;-=*&%%&&&=====->',!){(<1}2269cfhehjruABAEBHIKIECzAzzAEHHHHIIIIKKIKMMKFFHEEEBEFEEEEEEEIIIIIIIFBCAAzzAACCCzDDDF", +"CCDDDDDzxvvrnkgbb00a22222:[[[]^]^^]^^^:^[__:|111111124abhjqwyyxuuxwwyyzBEEJIKKKFKNOOONKIHHHFEFFEHJKKKIKMMMKKJHFDzzzvvwtwwwttmmegkbb62}[(({{!!!!'';;-**&%%%&&&====->','){(_}}2770bhfinjnqyCBBEEHIIHCAzyAzBEEHIKKIIKKIKIKKIIHECCCCCBBFEEEEHIIEHHEBzzzxxzzzzzzzzzzz", +"zzxxxzzxxvvrhkgb006a2222[[:[:]]]^]]]^^^]^:_[:1111114277bhjnuwwxuuuwwwzzBBEJIKMKKMNOOONKIHEFHEFFEHKKKKIKMMMMKIEDDzzzvvvtwwwummmjkicb2}[(({{!!!!!'';-=*&&%%&&&&====->','){(_}}7559bchlmrqszCECAAEHIIEAAzAAzAEHIKKKKKKHJIKKIHCCCCCCCzAzBEEEBEECCECCzzzzxxwzyyvzzzzz", +"vvvxxvxxxvrrhkbb00a2222}}:::]]^^^!^]]^{]]^:_[111[[124770hhnptwvuuuutwzzBBEGIKMMMMNOPONMIHFFHFEEEHKKKKKLMMMMKIJEFDzzzvwywwusmmjgkeb6}[[({{!!!!!'';;==*&%%&%&%%%===--;,'){(_}270aabhjnpqtxzEECAzzEHHEEAAAzzzAGIKKKKKIJJHIIHGCCGGCCCzzzzCCCCCGCCCCCAzyxwvwwyvwvvvvv", +"vvxvvvvvvvrrhhbba66222}}[[[:]]{!!!!!^]^{^]]__:_[_:}}47a0hhnpuwwtuuuwwzyzBEEJKMNMMOOOOOMKHFHFEFDHHKKKHHHKKKIHHEFEFBzzvxzwwtsmejkjb82}[(({!!!!!''';;==*&%%&$%$%%===*-;,'){(_}27aaabjhnqqtxAEEBBxzCEEHEBAzAyAzEIKKIIKIJGEHHEGCGEEEBAzzzzCCCCCCGCACBCzyzwwwvsttsssvv", +"srrrrrvvvvrrhkb0a6222}[}[[[:{{{!!!''!!^^^^]]_[[[[:}}26aahhhnttwtpuuuttzzBEEJLMLMNOOPOOOKIIHEEFEHHKHIHHHIKIFEFEFDFFzzzvAAttmmhkjcb2}[[({!!!!!''';;;==%&%%$&&$$%&==*-;,'!{(<}478bbhjjmmqxxABBBBCzzBEEEEEAzyyzEHIIIIKIIHEFECCCEEEEEAAzzxzBGCzCBBzCBCAAutusstuusssss", +"srrrrrrrrrrkhbb0a6222[::[:(^]{!!!''''!!^^{^^:_}[:}}}466ahhjiputspuuuttxzBAEGKMMMOOOPPOONIIIFEFEHHHFHHFFFFIFDBDDCAzzzvvAwtmmejkhc82:[({!!!!!'''';;;=%%&%$$$$$$%&==*-;,'!{(_}45abhhjmmruxzAEBBBCCzBEHIIHBzyAAEEHIIIKIIHEECCCCBEEEEBBzxwwzBBABBBCAAyywtttsspmmmmmmm", +"mmmmmmmkkkkkhbb08622[[[[:((^{{!!''',''!!^^^^[_1__}}4a666hheipputrrruutxzBAEGIMMNOOPPPPONMIIHHHEHIHFFHEEHIIHEBAACCzvvvtwtmmjjkic92}[[({!!!!''>'';;==%&&$$$$&$&%%&=*-;,'){(_}47abhjmmruuyzAEEBCCAAAEHIIIEBAAACEEHIKKIIHFEAzzzCBBEEEBBzwwyBEBCBBByyyywwtqmmmmmmmmmm", +"mmmmmmmkkkhkkbb08222}[[:::(^{!!!''','''!^^^^^:111}}47666bghhlptpppquuttxxAEGIMMNOOPPPPONMLIHHGHHHHFHEEFHIIEAzzCCBzvvtwwqmjjgkjb82[[({!!!!'''''';==&%&&$$$$&$$$%&=*-;,'){(_}47abhjmruuwxzABEBCAAADBEHIIHEBAABCGEEIKKKHFEzzzzzAyAAABBBywzAEBBBAAyyyywqqqmmmmmmmmmm", +"eeeeeeeeebbbbba08222[[[[__^]^^!!''',,','!^]]^]11}}}47a68bhghjppqpnppustxxAEGHKMLNOPPPPPNMKLLHHHIHIHHFEEHHECzzzCBAzvsuwqmmhggeca2}[[({!!!!;''''';=*&%&&$$#$&$$$&%&*-;>',{(_}47abhjmuuwwzzCABBAAAAADEHIHHEEBzBECEEHIIKHEECzzzywyyAAyBBzzyAEEAAAAyyyuuqqqqmmejjjeee", +"eeeeeeeeebbbbb006222[[[[__({^^!!';;;'>,''!^]^^:1}}}78aa68bhgjnpppopqqqtxxAEGGKMLMOOPPPPOMKLLLLLLIIHFEDEEECCzzzzAAtstqqqmeeghcba2[[({!!!!';>'';;;==&%&&$$$$$&&&%%&*-;>',{{([4aahhmnuuxzzACzBBAAAAAABHHEEEEBAACECGGJIIHEGzAAzwwwyAAwyywytwAAAAAAAuuuuuqqjjjjjjjgdd", +"dddddddddddaaa00822}}[[[_({^^^^',';;;''''!^^^]_}}}3666a6a88hhoppqoopqqtxxAAGGKMNNOOPPPPOOMKLLKLKIIHFEDAACCCyAzzywusmqqmjhggfba2}[[({!!!';;;;;;;;=*&%&&$$$#$$&%&&&*-;>'!{{_[4aahemnuxzzzAzAAAAAADAABEEEEEEEBACCEGGGHHHHBCAzAuwwyyAyywwuutwAAAAAxuuuuunnljjggggddd", +"8888888888888888822}}[[(_((^]]!,'';;;;',,!!^^([}}2a66666aa8ahlpppnnpqqppxAACHIMMNOOPPPPOONMKLLKKIIHFFCAzCCCAzAzywumqqjjjggebb82[[((!!!!';;;;;;;;=*&%&&$$##$$$%&&%*;;>'!{]_:78ahjmnuxzCzzzCAzyzAAABBDEEEEEEBBBBGGGGGGEEBCAzwuxwyAAAAywwtttyAAAwxwuuuoonnkgggdbbb8", +"8888888866666666622}[[[[[(^^^{!''>;;;;;,,'!^^^[[}26a6666aa8abhopqnnppqssxxAEGIMMNOPPPPPPOONMLLKKIIHEFCzzBBCAAyAysmmqnjjghecb82}[[({!!!';;;;;;;;;=*&%$&$#$#$$$&&%%*;>>,!{([[788hjmnuxzCCzzBAAyyAABEBDBEFBEEEBCCGGGGGCABzzAAwxwwyAAAAyywuutwyAxwxxuuonllkkggbbbbb8", +"6666666666666666662}[[:[({]^^!!',>;;;>''!!!{^^[:}46aa226aaaabhoppoorrqssxxACGHKMNOOPPQPPOONMMMKKIIFEFBzzCBBAyyAuqmmjnjggbebc82[[[({!!!';>;;;;;;;=&&%$&$####$$&$%**=>''!{([1468hjmvqwzzzzzCzAyyyABEBAABEEEEEEEHGGGGGBADxzAAyywywAAAAAyywtttwuwxwxuroolkkkebba6666", +"66666a666666622}}}}}[[[[((]^^!{!'',''''']{{^[[[}25a66a6668abbeottppprqupxwACCGKMNNOPPQPPOONNMMKKKIFEEAzzABCyyywtqmjnngdbebcb22[[((!!!!;;>;;;;;;;=%&%%&#$####$%%%*=;-',!{([1488ejnvwwAzzzzCCAyyyyAEEAABEEEEEJGJHJGGGADDxxyAAyywyyBBBAAywwttqutxxwupnokkkeeb888666", +"66666a22222222222}}2}}}__:^^{]]!!''',,''!]^^^^[}44a6666666a0cemtwtpppuuuxwAGCGKLNNOPPQQPPOOOMMMKLIFFFAzzABByyytuqjjnggabbhca2}[[({!!!!;;>;;;;;;;=%&%%$&$$#$$$%%*=;-;,'!{_[168bbknvwAAAzzzABAyyyAADBBAAEHHEHJGGJIIHEAAxxxxzyyywyAABBBAyywttquuxxxppomkkhfa8888666", +"}}}}22}2}}}}}}}}}}}}}}}__(]^{~{]'''''','']^^^^[[}2222222266abckpttqpruuuxxABEHKMNNOPPQQPPOOONLNLLIIFFBAzBEAywquuqjjkggb8ceb22[[[({!!!';;;;;;;;;==%&%%$$$$%$$%%%%==-;,'!{[[266bjhnqwAAAzzzAAAyyyADAADAABHIHHHGGIIKIEBxxuusptwywAAAAEEBAyywqquuxwxpppmkfheb888822}", +"}}}2}}}}}}}}}}}}}}}}}}}_:]]]{{!!!'''',',!{]^^[[1122222622260abkotprrrqqtxxAAGJKMMNOPPQQPPOOONNLLLIKHECAABEAwtquujjkkgbb8cf62}[[(({!!!';;;;;;;;;==%&&%%&&$%%%%%&==-;'''{{[_468bjhnvwAAAzzzyAAAyyAAyyABBBHIIJIHJIIKKHByxurspstuuyAAAEEEBAAuuquuuxpprmmmjfbbaa8222}", +"[[}}}[[}}}}}}[___[[[_}}::]^]({{{!'',,!!]]]:[_122aaa66aaaaaabfhlpttpppquuxxAzBGIMMNOPPQQQPPPOONLMLMKHEEzCBEAwqqunjjkkbbabfb62[[[(({!!!';;;;;;;;;==%&&%%&&&&%&&&&&**;>'!{{[1468benqvwAAAAwwzzCAyAAxuuAABCEJIIIIIHHIIIBzxxsspquqquAAAAEEEBAxuuuuuxpppmmijbccb8222}[", +"[[[[[}}}}__[_:_:([(__[[___[:_//(({!!]{{((<1|1356988999a9cccfjiotyywttxuuzzAAEGHKMNOOPQQQQPPPPONNLMKFEHAAEEAwqqunikkkbb8bf62}[[[(({!!!';;;;;;;;;==%&&%%%&&&%&&&***;-',!{[[166bbknqsyAAAwwyAAAzAAwwuutACEEJKKIIJJHIIKEEAxwwuutquuyAAyABEEAyxuuuuxpspmmjjbbbb62}}}[", +"[[[[[}}____(([((((((:_1:|1:}1____({{{{(((_1|}34688a8abda9ecchmptAAyyyAAACAEEHJIMMLNOPQQQQQPPOOOOMMMKIHBBEEAwqqunjjkeb88bc62}[[[(({!!!';;;;;;;;;==%%&&%*%%%&%%%**=;;''!{^_166bhknqsyyAwwwxAACAAzxutuuxBEEIKKIIKIKIKHHEAAywtttuuxyAAwwABEAyxxuuupppqomiicbb6a2}[[[", +"[[[[[____((((^^^^:[:[[[1|}[[_<<__({{{{{((_<11|366a68899a8bbdflouwAAyyAAACCCEIIKNNOOPQQQQQQPPOOONONMKIHCCEEAxqqunjkkbb8acc62[[[[(({!!!';;;;;;;;;===%%&=%%%%%%%%==;;;''!{^_166aekvqwyyAwwwxzCBCBzxxuxxxAEHHKKKKMMMKIEEEAAwxtuuquuyAzxwyAyAyyxpprpppqqmjfbcba62}[[[", +"[[[(___]]((^^^^[[[:[[[:[[1:[_<___{{!!{{(((_}_|266a6668668aa9filotyAyzzAACCCHIIKNOOOPQQQQQQPPOOONOMMKIIEEEHAyuuunjjkb88bb822[[[[(({!!!!;;;;;;;;;===&%*&&&&%%&&=*-=;;''!^^126bagjrtvyywwwxxzCEEAzxuuuxxCCHHKMMMMNNKIEBDyyxxuupqquwyAwtwuwyztprppprrqqlifbb6622}}[[", +"((((__(](^^^^^^[(((((:[[:[:[}__<,'^^_122bbgjmstvvywwwxxzAEzxxxuxxzzzEIKMNOOMMKIECvvqqqronppoqtxywuqlnmptpoiiijjllliecba222}}((", +"((((({^^^^^!{{{{{{{{]{{]{(([:_((:<]]!!!!]^{]:[^[:[:_2}2}266a8ahimpwxustwzxAAEEGIMMMOPQQQQQQQPPPPPPPOOMMMKIEyyxxppmmjbbhba2}[[[[[(({!!!!';;;;;;;;;===;=-=====;;;;'''^^(_2268hgjmvvvvywwwwyzABzxxxxxzzzBIIIMMNNMMKIGzvtqqqmnnnonquwyxuqnkklppoifiifiiifecb622}}_((", +"(({(({^^^^{{{!!]!]]{^{{{{{(](_((__]]!!!!^^]^(^^_[[1[[}}2226668gelqwttupwxxAACBGGKMMNOPQQQQQQQPPPPPPPONNNNKHAAxwpomkiififa22}[[[[(({{!!!!;;;;;;;;;==*=;====;;;;;;,'^^^(_2288bgmmsvvvvwwxwyzzAxxxxxzzzCEHIIKKMMMKIEGCvsqqmnnnnnhmquwwuonkjiiooliiijiiiief86222}_((", +"({{({^^^^{!{!!!!!!!!{{{{]{](]((](<(!!]!]^^^]]^^[[[[[[122226668bgkqtwsrtuuuyyBCGGILKMOPQQQQQQPPOOPPPPOOOOONKIEAyxokkhjhifb622}[[[[(({!!!!';;;;;;;;;;;;;;;;;;;;;','!^^(_}228bgjmvvvvvvywwwyzAAAxxxxzzCEEHHHIIKMMKKEEAwuqqmnjnnnjhmqtuunkkjfiloiffffccbife8622}}_((", +"{{{({^^^^!!!!!!!!!!!{!!!{{{]]//(/_(]]!]!{^^]^[[[[[_[[222222888hghmwwsruuuuyxzACCHFIMNPPQQQQQPPOOOPPPOOOOONNMIIBAtpkkeffbb8622}}[[[(({!!!!';;;;;;;;;;;;;;;;;;;''!!!^(_}}2aabgjmvvvvvvywwwyzzAzxxxzzCEGHHHEIIIKMKIEEAvuqmmmjjjnhjjmuuonkheheiiifcfccc9bb98622}__((", +"{{{({^^^{!!!!!!!!!!!{{!]!{^]{]:<:::]{]^]^^]]]][^[[[}2}2222668adghottsuuuuzyxzzACHIFKNOPQQQQQPPOOPPPPPOOOOOMMKIECwtqmiifbaa866a22}[(({{!!!';;;;;;;;;;;;;;;;;;>!!!!!{__}}28bdjmmvvvvvvyzwwwyAAzAxzzzCEEHHEHIIIJKKHEBAvuqmnmjjjjjjhmqunkkhbb8bfffbccc999988a62}__({", +"{{{({^^^{!!!!!!'!!!'!!{]]!{^]]:::::(]]]]^^]^]^[^[}}}}}2}2666a0dhjotxxuuuuwxxAzzCEIFILNPQQPQPPPPOOPPPPOOOOOMKKIHBBywtponc888826a22}[(({!!!!';;;;;;;;;;;;;;;'!!!!!{{([[}2a8bdhmsvzzvvvvzzwwzAAzAzzABEEHHEEHHIIHHIHGEDvuqmnnjjjjjhhmquokfbbb888ffc9cc998866662}__({", +"{{{(^^^^{!!!!!''!'''!!!!]]{{{(:_:::({]^]^^^]:[[[[}}}}}}266aaaaeejnuwxuuuwwwwzzACGIIKMNOPPPPPPPOOOOPPOOOOONMMKHHCAwwxwwplhba8a226222}_({!!!!';;;;;;;;;;;;;;'!!!!{{^([[26aabhmmsvzzzvvvzzzwzAAAAABEEHHEEEEHHHIHEIHHEDwuqmnnjjjjjhhmqomkjcb8a68bc99995555866222__({", +"{{{({^^^{]!!!!'!]'!'!!!!{]]{{(:_:_<_]]]^{^^^[[[[[}}}}}226aaabbehmquywuuwwwwwzzzCGFHFKNOPPPPOPPPOOOOOOOOOOOOMKIEEAytwwxtpoheb888222222_{!!!!';;;;;;;;;;;;;;',!^^(([[[}266ademvvxzzzzvvzzzABzAACBEHHHEEEEHGHHIHEHEEBDwuqmnhjjjjjhkkmomjeh888a85095555335544222__({", +"{{{({^^^{!!!!!'!'')!!]{!{{]{{(_<<<1_(]]^{^^^::_[[[}}2227aaa8bbhkmquxxvwwvwwzAzACGHHFKNOPPPPOOOPOPOOOOOPOOOOMKIEEzxxtwwtppplifba8222}2<(]^!!';;;;;;;;;;;;';'!,^(([[[[}668bhhhvuxzzzzzvvzzzCCzzBEHHHEEEEHHHHGHECBCEBAyuqnnnjjjjjhkkmomifea6aa475534224443||||2__({", +"{{{({^^^{!!]!!!!'!!!]{{{{{{]](__|_1__]^]^^]::::[[[}2227778888hhkmquyAxwwwwxzzzACGHFFKNOOOOPOOOOPPOOOOOOOOOONIHHBBwxxwwuqqppolihha22}__(^^^^';;;;-;;;;;;;'''!,{([[[[}668abekrvuzDzzzzzzzzAABBABEHHEEEEHHHHHHHEEzBEBDyturnnjjjjhkkmnnmkjjc8a744432}22}}}}|1<_<<_((", +"({{({^^^{!{]^!]!')!]!!]~{({((:[<}|11_]]]^^^:::_[[22277777888bgkkmpuyyyxxwDAzyACCGHHFKMOOOOOOOOOOPPOOOOOPOOOMIHEEAAxxttpqqqnopllih8a2__(^^]^!'';>;;;;;;>;'''!!{([[}}6668abkkqvxDDDzzzzzzzACBCCEHHIEEHHHHHJEHBEEzCGBDAxurmmjjjjkkkmmnmkhheba541}22}}22}}}::^(_((((", +"{{{({^^^{{]!^!]!!]]!]!{]{/(((_1|}}111:::_([_::}222277777a888bghkqptyAywzyDAAyyCCGHFFFKMOOOONONOOOPOOOOOPOPONKGCByyuxyyppmmmmooplmfc61_{!^]^!!!!''>;;;;;;;;'!!{([[[2228abkhrvvxAADDzzzzzzzACABEEEHHHHHHHIHGHBCAAzAAAAxuqrnjjjmkkknmlmlfcfec74[}2221111_}:::]^]{{{", +"!!{{(^^^^{{!!!!]!!]{{!{{(/(_<_143|||1<::__[[}22222777770a888bghmmrtzCBAzAAAAAzzCGHFFFKMNOOONNNNOOOOOOOPPPPPNKHCzzwwuxxupormmmmoolifc9|_^]!!^{~{{'';;;--;;;'!!{(:[222600bkknvuDBBBDDDzzzzzAzABEEEEGEEHHHIHGEBEACCAAAAxxsqmjmnkkkmmmlmlifiic04}}}1_<<<<;-;;'''!{[[2260bagnnvuDDBECDBCzzyADzAAEEBAAAEEHHHHHEEECBBAADAyxxuummnmkkkkkmjmmifiic92}}_<|',''!{[[2260bhgmvutyCGEBDBzzzyDxyABBBAzAAAEEHHIHHHCBCAAADAAzzxupmnmmhkkkmjklifffd922}_<<<(((/{{{)),''>;", +";;'''{^^^:{({{{{{{{{({]((__:__|114414}_____111226666aaaa9behjilqqqtyEECCCzCAzzzCEHEFFIKNNNNMMKLMOOOOOOPQQQQONKHFAzzyywprssmqqlife9aa7445cd95}<]^]!'''''';',''!{[:22a0ahnnvvvDBGBBDBzzwyzyDBEzxxAzAABHIIHHIHGCEABAAAAAAAzturmnhhkkkjkiidccd5221_<<__((({{{!'',;;;", +";;;'''{^:[{]{{{{{{{{{{{^(__::<|11442|}[[[_[}}222aaaa0898abbbejlquuwyBEEEEEEEBBBEEHEEFIKNNNNMIKLKNOOOOOPQQQPONMIFDAzzzvvvrrsmhgfbe8a85375955743}:^]!''''''',''!]^[22608gnjvuvDAGBBDzzzwvwyABAzxxxzAABHIHHHHHEEBAAAAABAAAAwuqmnmhkkhkkiicccd963|<<<<_(~~~)),''';;;", +"=;;;'']{:[(({]^]{{~{{{(((_::<1|4443332}[[}}1222000aa9c9aaaabejoquuuyBEECHFIHHEGEEHEEEHKMNNNMKLKLMOOOOOPQQQPPNMIHFDAzzzvvvvrmegbabaa777753}}}3437}_]!'''''!!!'!{^[2260agljqqwDADBBDzzzwywzAzzxxxxxABBEEEEBHHHBAAzyyAAAAAzwtqrqnmhhhkkiifcccc654|____~{~~))''>;;;=", +"==;;'''{([[((]((]]{/(((((__<:11|4353552}}}42770ddabbdccccdhgiopptxwABEGEIHIFIFFFEHECEHIMNNNMKIKLMOOOOOPQQQPPOMKHHEEEAzxxvvrmedaa222|7572[<[:|1|742|[!)'''!]!!{]][22678gjjqqwDDDDDDxzwxvxzAzxuuuxxzBEEEEBEHHBAAwxyyyAAAAwttqrqqljkhkkkiiecdc954|___//{~)),>>>;-==", +"%==;;''!](:((](((]]/(((((_<_<1|435575955775700ddihhggfffikimopptwwxABHEEHIKKKIFFEIEECEIMNNNMFILMMNPOOOPQQQQPONKLHHHEFzzxxxrmed862}}1774[[:[::[|4443|:{!''!!]^{([[}}6a8gjjqquDAADDDxzwwuwzwxuuuuxxxBEEEEEHHBAyyxxzyyyzAzwwtpqpooljjjkkiifcdc993|<__//)))),>>--*%%", +"%%*;;;,!{{(_((:(((:(/<:__<_1|4377590990775000ddijifikfiiimmmmpqppwwABHHHHIKKKIIIHIHECEIKNNNMIIIMMOOOOOPQQQQPOOMLKHIFHDDzxvrmed862}}131_^]:^::_14|1233}({'!!!](__:}2778gjjrquDAADDDxxwwwwzxusuuuxxzzBBBEHHByyxxxxxywwyyAwwupuqnoomkkkmiieffc995|<__//~))),>;--*%%", +"&&**-;'!]]([(__:_::/_<<<<|11|4355599900557909ciiiigggkfiikkkkmnnrtxxBHHHIKKLLKIIKKIEEEIKMNNKIFILMOOOOPPQQQPPPOOMKLKIHFDzxvrmed862}}1|_{^^]^_<_1111:}334<^]!!!{(:}22778dikmquwADDADxxwwwyyuuqvvuxzzzBzEEEAAwuuuuxxwwuxxxwwtrqooopmmmmmllffffc97||;-=%&&", +"$&&=--'']{]_______<<<<||||3||47579999990099ccgiiiijgggcfghhgggijjquuyBEEEIKMKKKKKKIHEHIKNNNMIHIIMOOOOOPQQPPPPOONMLLMLHDzxvrmed862}2__{{{{{((__111<_[}323|:]!!{{[}62088djjmqtwAADAxxxxzwyuuqvvvuxzzzzBEEAywuuuuuupstpuxxtwuqqlnnmmmmmmoliffc9673|_//~~),,,>-**%$$", +"$$%==-''!{((1<_<1<<|<||||||33347799ccffdccccfgjkkggddggcdbbdhheehmqqwAEECGIKFFLKKKKIHIKMNNNMKFIILOOOOPQQQPPPPOONNNMMLHDzxvrmed86222_({{!!{((_11311_[<:}2|11:({/:[220agdjmmqtvAADDyvxxywyuqqvvuuxxxzBEEAywutuxuspppsqutxuwtrnmlkmomliloonifc9663|1>>-**%$$", +"#$%%==>''{(_1<|<|111||||||33357709cccffcc99cghhhhjghddgdbbhbdgeehmmqwABBCBHIKIFIIKKIHIKMNNONKFFIMNOOPPQQQQQPPOOONLNMLHDzxvrmed8622}[(({{{{{{__2221__](:<11|||1_::220bghjmmquvyADDyuxwzyyvqqqqrruxxzGEAywxuxxtpprrppquuxtwtqqnjkjjillnilolif9a63||>>-*&&##", +"##$%*=>>'!{(__1_111||11||33355900ddccfgc99ddhehhhhhhddddbbbabheeemmmtyCBCCHIFIFIIKIHEHKMNNOOMKFKKOOOPPPQQQQPOOOOOONMLHFzxvrmed8a22}[(({{{{((([}}2|__^](::<||752}}2609gglmnqtvyADDxvxwAyxqqqqsrquxzBEBAyxxuuxtutsssppstxtwtummkhkehijiilolij9aa3|1>>==&&##", +"##$&**;>,!{(_|||||1||1|33335599990dccfffddhhhghhhhhghdddabbbhheeehmmqyABBCEHFKIIIKIEEHKMNNOONKKKMOOOPPQQQPPPOOPPOONMKHFzxvrmed88a}[[(((((({{[[[}}_1<<]^]^[_1459556678gglqqqtvyADyAvxxAwwqqqqvrruxzBEAywxwxxttwwyvvwwtxywyutpmmkheehhiiloilic9673|_<~~),>>;==&&##", +"@@$&&*-;'){{(_|11|||11133555569990cccghfebhhhghkkhjfgdgggbbehhhjjhmqqyABCCEFIIFIIKKIHIKMNNOONMKMNOPOPQQQPPPPOOPPPONNKHFzxvrmedb8a2[[[(((((([:[[}[}<__]^^]^]_|3999990adgjqqquwAADDDwxwzwwmmqqunruzACyyywxwxwyAEEEEBAAAAAAAwwsomkhhbbbejliiiif9673|_;===%$@@", +"@@#&%=*>>'!)(__1<1||43347555599999ddghfifghggklnjmmmiigghhfhghggjjqquyAEBCCHFKKIFKKIHIKNNOOONNMMNPPOPQQQQPQPOOPPPONNLLFDxvrmmhb88}[[[[((([[[::1}}}_|__]/](^<<1599cfdbggkqpqwyAAADDxxyAwtsmqqquoxzzywwxwyAABEHKMKIIHEEBAAAAAwpmmjjbbbfiiiiiifc953||-==%%$#@", +"@@#$%%=;;,,!~(__|_|||33555550999cccdggiiijkjlooommmollkkkffghghkjjnquAAEBCEFIKKKKKKHHIKMNOOONNMNNOPOPQQQQQQPPOPPPPONLLFDxvrmmjga6}[[[[[[[[::}22}}}}_<_<_:/(__137ccfgfigimmqvyACADDzzzAztsmqqqquxAAvtwwABEEHIKMMIEEBAAywwyABytqnjjgbhhhgiiiifd99531;==%%$@@", +"@@##$%%*;;,!{/_<<||1|145559709cccffiillllllopprpppppoommiiikkkkkknmuuAAEECEFIKKKKFKFHHKMNNOONNNNNOOOPQQQQQQPPPPPPPONLLHDxvrrmhgba6}[[[[[::[}22662}}(//<_<__<_}|580fiimomrqqwyAEADDAzAywusmqqqvxzAwtwxyBEHIKKKKEBAwwwxwtwyyAywqmoijijhfhfiijif8853|<<~)),;=%%%#@@", +"@@##$&&**-')){/<_<<|||3755999dcfffiilooooooooppppqppppopllommmpmmpptwABEEGCIFKKKKLKIHIKMNNOONNMNNOOOOPQQQQQQPPPPPOONMLHFzxvrmjgb66}}[[[[[}}2288864}}({{(1||1_}|298fgiopprqqvvACADDDzzvvsssqqquxzzttwyAEIIMKIHBAywtttxwwwyyAywtpmlmihehcfiiiff9973||'!~/_<<|||3355999ccdgfgiillllollnoorrpmoqoommoloompqpqttyyEHIHGHKKKKKLKKFFIKMNMNONNMNNOOOOPQQQQPPPPPOOOOONLHFzxvsmhdd666}}[[}}266ccff996}(({/<||1_|2269dfmotttutvyACEBBBBzxvvstqqqtwzxtwyAEHIKKIEBAyAAyyyyAyAAAAywtpmlnlgfhfeeifgfc8953|,!~/<<<<||3335599ccggfiijllnnlloooopppqqpoomomlmmmopqqttyAEIKKIIMMMMMKKLKIKKMMMMNMMMNOOOOPPQQQQPPPPOOOPPOOKLFBxvsmmed8666}222a6bbfeifif92[((/_|<_}}2269dfmmpwwwwwyABEBDEEzxvvtutqqxwxxwyABHIIHHHEEEEEHEEEEEBBABAAytpoliiiighceffgcc8953|;%%$#@+", +"+@@##$%%*;>,){//<<||||355599ccggfiijllonpppppttwwtxwttpttpppppputtwAAEIKKKKNOOONNMMKKKLNNNNNNMMNOOOOPPPQQQPPPOOOOPPPOMLIDzvssmed86666226bbbccjjefc6|[(((((/(::2669dckkptwwAAAACEGEHEAxxxwstuuxxxxwAEEIIHEHIKIKIIIHIIHIEEBEBAAwppojhfiffcddddc88653|;*%$#@+", +"+@@#@#$%*->,,)//<<<||||35599ccfiiillooppttwwwwyyyyAAyywwywwwtxzzyyABCHIMKKMNOOOOOOOMMMMNNNNNNMMNOOOOPPPQQPPPPOOOOPPPOOMIFBzytmmed86688abcbccehgif86}}[(({{{^:[}659dekoouuwABEBEEEEHEEzxvvwswyDuxzBBEHIHHIKMMMKKIIEHIHIIIHHEBBAwponijijfcccccc98655||<~),>;*%$#@+", +"++@@@#$$*--,,)~//<<||||35599ccfiiloppttwwywwwwyyywyyywwtwwtttwAAAAEEEIKMMMNNOOPPOOOOOOOOONNNNMNNOOOOPPPPPPPPPOOOPPPOOONNIHzztmmeddba88bbcciikggfc82}[:[{{^]^^::27dffkooptwABEHHGHIEEBAxzvvwwzyuxABBHHHHIKMKKKMKIIHHIHIIKIHHEEBAtpnjffefffcd9c996533|,)~///<|||335599cfiilopppttwwwwwwwwywwwwywwuppppptwwyzABEHMNNMOOOPPPPPPPOPPPPPOOONNOPPPPPPPPPPPOPOOOPPPOOOONMIEAzsmmeggbehchfilokkkf962}::::::[][:}2a0ckkmrpuwAAEJIIIKIEBCAzzyyAzyAzCEIHHIIKKKIIKMKIIEEHHIIKIHHEEBBypljfbeffcc9cc95333||,)~//<<||3355599cffillppptwwwwywwwyyyywyywwwutttttwwwyyABEIMMMNOOPPQPQQQPPQQQQPPOOOPPPOPOOOPPPPOOOOOPPPOOOONMMKGAwtqjjkkkhfhgkmmonkg6a6[::[:[[[:::2}60agkoupuwyABHIKMKIHBDDzzzACAyACEHIKHIIIIIHIIIIHHEBBAEEEEEHEEEBytoifbhcfdcccc9533|||;%$#@+", +"+++@@##$%*-->)~/<<<|||355599ccffiiloptwwwwywwwyyAAAyyywwywyyAAAAACEHHKMNNNNOOOOOOOPPPPQQQQQQQQQQQQQPOOOPPPPOOOOOOOPOOOOOOMMKGEAAxuronljeejjjqmhd8666}:[:[::[[22608ggjppuwyAAEEEKMNMIIEBDEBEEBEEHIIKKKIIKKHEEBBBBBAzyywtwwwAEBBBAwpoijedd99cc9953|||<<<~),>;%%#@+", +"+++@@@#$%*->,,~/<<<||||335599ccfiiloppwwwwyAyyyyyyywwwwwwwtwwxyyAEEEKKNOOOOOOPOOOOOOOOPQQQQQQQQRQQQQPOOOPPPOOOOOOOOOOOOOOONKHHHEEywuoljeemmqmmed8aaa}}[[:[:[422a08ggioqqwyAAEEHKMMMKKIEEEEEGGHIIKMKKKKMKIEBAAAAAAAAAywttpuwAABAAwtolifdda8c995531|<<<<~~,>;=%#@+", +"+.+@+@#$%%->,)~//<<<|||3355999cfiilopptwwyyywwwyvwwuutttpstquuuxAAAEHIMOOOOPPPPPPOPPOOOPQQQQQQQQQQQQQPPOPPPOOOOOOOOOONOOONMMMJIIHHAyuqqmmqqqpmhdd8662}:[:[:2226788glinqqwAAEEEIKMMMMKKKHHHFHHFKKKMKIKMKIEBAABzAAABAAAwxupqtwyAAAwtpoljgd890999541<<<;=%$@+", +"+.+@+@#$%*->,))~//<<<||335599ccfiillopptwwwwwwwywwwvxxwwwwwwwwyAAACEGHKNOOOOOPPPPQPPPPPPQPPPOPPQQQQQQQQPPPPPOOOOOOONNNNOONNMNNMKKHHEwuuqqqwtpkked82222[:[:22}267agglrrqtwyAEEHKKMMMMMMKKKIIIHKMNNMKMMKIHGEABBAAyyDyyyyuupttwwyyAywtpoifd09999953|1>=%$@+", +"+.++@##$%*-->))~//<<|||355599ccffiilllpptwwyyyyAAABBAABBEBABBBBEEHGIIKMOOOOOOPOOPPPQQQQQQQPOOOOPQQQQQQQQQQQPOOOOOOOONNNOOOMNNNNNMKEEEBAyyywtpkmeda82222222222607aggkqrqvvAACEIKKMMMMMMMMMMKKKMNNNNMMMKEEEECAywwstsstzwuuutwwwwwyywtpplic98999953|<=&$#+", +"+.++@##$%*-->,)~~//<<<||35599cccgffiloptwwAABBBEEEEEEEEEHHHHGHHKKKMMNOOOPPPOPPPOPPPPPQQQQQQQPOOPQQPPQQQQQQQQPOOOOOOOONNOOOOMMMNNMKIEEEBBABzypmkb0082266689889909ggkjmquvvABBEIKMMMNMMMMNMMMMMMNNNNONKIHIBBzzzxssrrruuuuuputwwwwwywwtolifcb955553|=&$#+", +"+.++@##%%*-->,,~~/<<<|||335599ccfiiloppwyABBBBBEEEEHHHHHHEEHHHIKKMMNOOOPQQPQQQQPPPPPPPQQQQQQQPPQQQPPPPPQQQQQQPPPPPPOOOOOOOONMMMMKKKHHEHIIEAAtmme0088688cccfjiigfkglmnqtvwyBBIIKMMNNNNMNMNNONOONNNOONMIHEEAzxxuuuuuuqusuuttuwtwtwwwwtooiib9955553|<-&&#+", +"++++@##%%*-->,,~~//<<|||333599ccfilopttwwyAABBEEEEEEEEIHEEEEEEHHIIKMNOOPQQQQQQQQQQQQPPQQQQQQQQQQQQPPPPPPQQQQQPQPQPPPOOOOOOOOMNMLKIJIKIIIIIHBwtmefd9ccffccfiilklqmporqqwvyCAEHIMMNNNNNNMNNOOOOOONOONNKKJEBzAxuuuuuvvqqqqtuspttttwwywwpoliec957533|<-&&#+", +"+++@@##%%*-->,,~///<<<||335599cfilloppptwwyyAABBBBEBBEEEEAACCBCCEIKMNNOOPQPQPQQPPPQQQQQQQQQQQPQQQQQPPPPPPPOOPPPQQQQPPPPOOOOOONMKFIIIKMKIIIHECwmmigkilifccffkkllpptupqtvvyCBHHIMMNNNOONONNOOPPPPOPOMMMIHHGAzAxuvuuuvqqqsttqutttwwwyywppliec95733||-*&#+", +"+++@@##%%*->>,))~//<<<||335599cfiloooppptwwwAAAAAAAAAADBBBAAAAEEHIKMMNNOPPPPPPPPPPPQPPQQQQQQPPQQQQQQQQQQQPOOOOOPQQQQPPPPPOOOOOMMKIIILMNNMKEEEAupnomoijfeccgggjomttxxuvyAyCBBHIKMMNNOOOOOOOOPPPPPPONMKIJGECzyxywvuvuqqvsuupuwwwwwwyywtplif9997731<<({~!),,>>-*&$@", +"+++@@##%%*->>,)~~///<<||355599cfiloooppptwwwyAABBBBBBAAABEDBDEEHHIKMNNOOPPPPPPPPOOPPPPPQQQQQPPQQQQQQQQQQQPOONNOOPQQQQQPPPPPPPOOMMLIKKMNNNKHCBAxxttqoifbc9dddeekmpuwwyAAyAACBIIKMMMNOOPOOOOPPPPQQPONMKIJJECBzxwwwwwtttvstqstuwwwwwyywwtoifc9973||--**$@", +"+++@@#$%%*->,,)~~~/<<|||355559cfiioooopptwyAAEEEBEEBEEEBEEEEEHFIKKMMMOOOPPPPOPPOOOOOOOPQQQQQPPPQQQQQQQQQQQPOONNOPPQQQQQQQQPPPPOOLMMMKKMMMKIGCAyBywpokgddd00bbggoostxAAADyABEEIIKMMNNOPPPOPPPPPQQPONMKKIGGGCzzzvvwttttsvsuvttttwywyyywtplicc053|||>-=**$@", +"+++@@#$%%*->,,))~~/<<<|||35559cfiilooopptwyAABEEEEEEEEEEHEHHHIIKMMMNOOOPQQPPOPPOOOOOOOPPQQPPPPPQQQQQQQQQQQQPPOOOPQQQQQQQQQQPPPPOONMMMMMMKKHEEABABywmkgdd00bbgggmlpuwAAAADAAEHIIIKMNOOOPPPPQQPQPQPPONKKIIGGCCCzDytuutssvtvusuutvwwwwywttoicc973||<>--;=*$@", +"++@@##$%*-->,,))~//<<<<||35559ccfiillmopptwwyBBEEEEHIEHHHIIIIKKKMMNNNOOQQQPPPOPPOOOOOOOPPPPPPOPPQQQQQQQQQQQQPPPOPQQQQQQQQQRQQQQPPOOONLMLIIEEEEEAzwtpmgdd0bbbggllqruwAAAAAAAEHHIIIMMNOOOPPPQQQQQPPPOOMKLKIHGCCAAAxvvvvvvtwuusuttvvwwwwttplic973||--**=*%@", +"@#@@##$%*-->,,)~~//<<<<||355559cffiikllopppwwAABBBEHHHIHEGJHJJIIMMNNOOPQQQPPPOOOOOOOOOOPPPPPOOOPQQPPPPQQQQQQPPQQQQQQQQQQQQQQQQQQPPOOOOOMIFECEEHAytpppligecbgggnmrqquwwADDAABHHHIKKMNOOOPPQQQQQPPPPOOONKKKIIGCBAAzvvvvvvtwxxvutwwwwwwwwtpoifc95||<-;**%&%#", +"@##@#$$%*-->,,)~~///<<<||335559cffiiiillooptwyAzAAzEEHHHIIJIIIMMMLNOOPPPQQPPOOOOOOOOOOOPPPPOOOOOPPOPPPQQQQPPPPPQQQQQQQQQQQQQQQQQQQPPPOOLIFBCEEEAywppppoljekggnlrvqttttxDABDEEHGIIKMNNOOPPQQQQQQPPPPOOONKKKIIHGGCCzzzzxwvxxxuuwwwyytwwwtpoifc95|1<--=*%&$#", +"@##@#$$%**->,,)~~///<<<||3355599fffiiillopptwwyAAzABEHHIJIIIKKMMOOOPPPPQQQPPOOOOOOLNNOOPPPPPOOOOPPOOOPPQQPPPPPPPQQQRRRRRRQQQQQRRQQQQPPOMIHECBEAwwwpooppolmmkknnquutuutuwDDEEEHEHIKKNNOPPPQQQQQQPPPOOPOONNMKKKKHGCCCCzzzxxxxxvwvyyywtttwtoifc9531--;=%%$$#", +"@####$$%*-->,,)~~///<<|||3355599ffiffiiloppptwyyAAzBHHHIIKIKMMNOOOPPPPPPQQPOOOOOONMNNNOOPPOOOOOPPPNNOOPPPPPOPPPPQQQRRRRRRRRRRRRRRQQQQPOMKIHCCAwwuuuoooppuqmmqmrruttqqqutwDBEEBGEIIKNNOOPPQQQQQQQPPPPOPOOOOMMFIIHGCzzzAAzzxxxvwyyAAywwtttolfc9531>-*=%&$$#", +"@@#$#$%%*->>,))~~///<<<|||355599ffifgiiloooppwwyAAABEHHIIKKMMNNOOOOPPPPPQQPOOONNONMMMMNOOOOOOOOPPPNNNNOPPPOOOOPPPQQQRRRRRRRRRRSRRRRQQPONMKKCzytuqqtuoooutuqtqqvvutuuuqqquwBEEBGEEIIKNOOPPQQQQQQQQQPPOOPPOOOMKIIHFECzzzAAAzzyyyyAAAywwtttplfc953|>-*%&&$##", +"#@#$#$%%*->>,))~////<<<||335599cfffgfiiloloopwwyAAABEGEIIKMNNOOOOOPPPPPPQQPOOONNNNMMMMNOOOOONNOOPPONNNNOOOONOOOPPPQQQRRRRRRRRRSSRRRQQPPOOMKEAxutmqqutuuquuuwtxuuuuqquqqquwAEEBAECHIKMNOOPPQQQQQQQQQQPPPPPOOMLIFFHEEzAzzzABAAzAAABBAyywttpoic953|--*%%&#@#", +"#@#$$$%%*->>,,)~////<<|||335999cffifiiililopptyyAABEEEHIIKMNNOOOPPPPPPPPPQPOOONOONMMMLNNOONONNNOOONNNNNNNNNNNNNOPPQQQQRRRSSRRRSSSRRQQPPOONNHCyputmqquuutupwywyxxwuuqqqquuuyEEEBAEEIKKNOOPPPQQQQQQQQQQQPPOPNNMMKIHHEEDDDDABBBBABEEEBAywwtpoic9531-**%%&#@@", +"###$%$%**->>,,)~//<<<<||3335599cfffffiililooptyyAABEHHHIKMMNOOOOPPPOOOOPPQPOOONNONNNNMMNOONMMMNOOOMMNMMMNNNMKMMNOPPQQQQRRRSSSSSSSSRQQPPOOONKEAyttmmqquuuupwwAAyxwuuuuqqquuyAEEBBGEHIMNOOOPPPPQQQQQQQQQPOPOOONNMKIIIHEDAAABBEEEEEEEEBAAwwpoic953|-**%%$#@@", +"###&%$%**->>,,)~//<<<|||3335599ccfcffiiiilopppwyyAAEEEHIKMNNOOOOOOOOOOOPPPPOOONNONNNLMMNONNMMKNOOOMMMKKKKMMMMKKMNOOPQQQRRRRSSSSSSSSQQPPOPONKJEAttmmqmqquuwwwAAAzyxuuuqqqquxyDDEEBEHHKNNOOOPPPPPPQQQQQQQPPPPPPONMKKIHHEDAABBEEEEEBEEBBAwwtplf953|-*%%%$##@", +"#$$&%%%**->>,))~~/<<||||||3359cccfcffiiiloopptwAAAAEEEEIIKMNNOOOOOOOOOOOOPPOOONNOMMMMKKMNNMMKKKNOOMMMKIHHKKMKKKKMNNOOPQQRRRRSSSSSSSQQPPOOOMKIHEwutqqqmqqwwwwyAAAAyxxuuqquuwyyABEEEHIKNNNOOOOOPPPQQQQQQQQQPPPPOONMKKIHHBBACBDEIHBBABEBAywtpoic95|<-*%%%$##@", +"@#$&%%%*-->,,)~~//<<||33333559cfffffiillloopttwyAAAEHEEEIIKMNOOOOPOONNOOOOPOOONNMMMLMIKMNNKKKKKMNMMMMKIEEJHIKKIKKNNNOOPQQRRRSSSSSSSRQQPOONMIIHHAwwwqqqqttwwAyzAABAxxxuuuuuwwwyABEEEIKMNNNNOOOOPPQQQQQQQQQQPPPPOONMMIIHEEBCCBEIHBAAAABBywwppif953|-**%$$##@", +"@#$&&*%*->>,))~~//<|||3333559cffiffiiilllopptwxAABBCEHHHHIKKKMMNOOOOOOOOOPPOOONNMMMMKIKKMMKKKIFMNMKKKKIHEECGHHIIKMNNOOOPPQRRSSSSSSSRRQQOOMKKHHEEywwwyywtttwAAzzABAzxxuuuuuxwwyyAEEHIMNMMNNNOONOOPPQPQQQQQQQQQQQPOOMKIHHEGBAEEHEBAAAABAAywtplfc53|>,))~~/<<|||3335599cffffffiiiillooptwyABBEEHHIIIIKKMMNNNNNNNNOOPPPONNNMLLMKIIKMMKKIFKMNMKKMKFHEECCCEGHIKMNNOOOPPQRRRSSSSSSRRQQPMKFEGCByywwwywtppzAAzzDEBAzxxuuuxxwwwyABEHIKNMMMNNNNNOOPQQQQQQQRRRRRQQQPPONMIHEEEEEEEEEAAyyAAyyywpoic95||//~),--*%$$##@", +"@@$%%*--->>,,)~~/<<||333355599ccfccfgfiiiiloopptwAABEGHIIKKKKMMNMNNNNNNOOOPOOONNMKLMKKIKMMKKIIIMMKIKMKFEEEzzzzCGGIKMNNOOPPQPQRRSSSSSRRRQPOMMIGAzAyyywwwtuxwxzAAEDAAAzyxxxxywtuwDBEHIKMMMMMNNLNOOPQQQQQQRRRRRQQQQPPPONKIIIHHEEEGBBAyywwywwwtpif993|-*%%$##+", +"@@#%&---->,,,)~~/<<||3|3335559ccc9ccffifiiiloopptwyABCEHHIKKMMMNNNNNONOOOPPPOOOONLMMKKKKMMKIIHFKMKIKKKFFFEzzzzzzEEHHKNNOOPPPPQQRRSRSRRRQQPONMICAAzyAywwtxtttzABEEEAAAAxxxzyxuttxBEIKKKKMMMMMNNOPQQQQQQRRRRRQQPPOOOOPONKIHIIIHHEEAAyytwwttttplfc953|**%$##+", +"@#$&==--->,)))~~//<<||33333559ccccccdfffiiiilnrptwyyAEEHHHIKMMNNOOOOOOOOOOPPOOONNNMMKKKMMMKIHHFKMKIFKKIFHEzzzzzzCCCGGINNOOPPPPQQRRRRRRRRQPPONKHBzAzyAyzywttxxAEEEEEAAAAyzAyxutuxAEIMMKKKMMKKKNPPPPQQQRRRQQQQPPONNONOONMKIIKIIHEEBBAwttwttppplfc953|<--%$#@", +"#$&&*-->>>,))~~~~//<<||3333599ccfdcffcfffiinnrpttwyAABEHHHHIIIKMMNNNNNNOOOOOOOOOOOOOMKKMNNKIIHIKKFFHIIIIHEBzzvxxzCCCCGHKNOOOPPPQQQQRRRRQQQPONMIEAzAzBBBzywxxuzBEHDEDAAzAAAAxuuxyABIMMKKKMKKKKMOOOOPQRRQQQQPPPPOONNNMNNNMKKKKKIHEEEBywtttpppolfc953|>-%%#", +"$&**;>,,,,))))~~~//<<||335559ccfccfffffiilnlnpptwyyAABEEHHEEHHIIKKKMMMNNNNOONNNNOOOOONMNOOMIIEEHIIEEIIIHIIBzzzxwxyzzCCCEKMNOPQPPPPQQQRQQQQQPONKHEAzAABEBAzxxwDAEEHEDAAAAEBAxxuxxzEIMMMKKKKLKMMOOOPQQRQQPPPPPPPPOONMMKMNNMKIIKIIHHHBAytwtppoolic953|>-*%%$", +"##%=;>,)))))~~~~//<<|||355999cccccffffeiiiloppttwwwAAAABEEHGEGGJIIJIKKMNNNONMMKKMMNOOOOOOONKIEEHIHBEHIIHIICzzzwwvvvvyzzCCIKMOPQPPOPPQQQQQQPPPONKHEAAyAABBCAxwyAAEDEAAyzAEECzxxxzAEIMMMMKKIKKMNNOOPQQQQPPPPPQPQQPONMMKMNNNMIIIIEHEHEBAwwttpoolif953|>-*%%$#", +"+@#%*-,,))))~~///<<||33559cccffccffcfeiiilloopppptwwwAABBEEEHJHHIIJIIKKMNNOOMKIIKKMNOOOOOONMKIIIKIGCGIIEIIEzzzxvvvvvvxyzCCELNOPPPOPPOOOPPPPPPPONMKHAzxzzBBCzzyADEDDBAyAzBEEAzxxzAEKMMMMKIIIKMNNOOQQQQPOOPQQQQQQPPONMKKNNNNKIIIEHEEBAyywtwppoolic933|<~))>--*%$#+", +"+@#$%=->,,,,))~//<||335599ccfffcfffffiiiillllmmooqssvyADBEHIIHIIILIIKLKLMNNNNMKFIIIKMNOOPONKKIKKMKHGGHEEHIECzzvvwvvwwvxyAzCHMNOOPOOONNMNOOOPPPPOONMHAxxyzAACAzADDDEBAzAABCCBAzzzAEKMMNNKIIKKKMMOPQQPPPPPQQRRRRQQPPONMMMMNMMKIHHHHBAAywtttpooolif955||/~),>-*%#@+", +"++#$%%;>>>,,,))~/<<||335559cccccffffiiiijliiiiillmqtwwDABEHIKKKIIMKKKKKKMMNNMMKKKIIKMMNOPPNKIIIKMIHEGHECEHECzzxxwvvwvvwzyyzCIMMNOOOOOMKIKNOOOOPPONNKBwxwxzABCzAABBAAAzAACEBBBAAzBHKMMNNMIIKKMMOOPQPOOPQQRRRRRRRQQPPOOMKKKMMKIHHHEBAAAywtpoolllifc9953|/~),>-%#@+", +"++@#%&=;>'>,)))~/<<<||33555999ccfffiiiffffgfggkkmmqptwyDBEHIIIIIIIIIKKKKIKMNMMKKKLKKKMMNPPOMKHEIIIEEGJHHHHICCzwwvvrrrppwyzzCGHKKNNOONKIHIKMOOOOOOONMIBwxwwyACCCBBEAyzAzAEEAABBBBEIKKMNMMKIFKMNOPPPONOPQRRQRRRRRQQQQPONKIIKMKKIHIEEBBByywtpoiiiffc9553|'',){~~//<|||33355999ccfffffccfccccggkkmoqqutwyABBEEHHIHHHIIIKKKKMMKKKKKKKMMMMNOPONMIHIIHBCBEIJIIIECzxwvqrrrrrssxzzGGEIMNONKIHJEHIMONNOONNMKEAAxxwzACBCBBAzzAzBEEBAABEHIKMMMMMMKKKKMNOOOOMNOPQQQQQQQQQQQQQPPOMKIKMMKIIIHEBAAAyttpoiiifc9953|<-%#+", +"@#$%%*->''){~{///<<||||3555999cfcccccccccccgggimmpquutuwyABBEHHIIIIIIKMKMMMMMKKIHIKKMMMNOPPOOMKKIHDzABEEIIIHGCyvvqrrrrrsssvzBCCEKMMMIIHEEEHKKNNNNNNNKHEAzwxwyCBCBBAAyABBEECAAAEIKNMMMMKIMMMMNNNOOMMNOPQQQQQQQPQPPQQPPONMKKMMMKKKIEBAAywttpoiiifc995|<*%$@+", +"+@#$%*>>)!~{/(/(<<|||3355599ccfccccc9cccccgggkkmmqqqqutuwyBEEHIKKKKKKMMMNNNNNMKKIIIKMMMNOPPOOONNKIDzzzACEIHHHEAAussrrrrssstzBAzCEHIIIIHEEHHEHKNNNNNNKIEEAAwwwyACBCBBzCCGEBzACAEINONNNMIIKMNNNNOONKMOOPPQQQPPPPPPPPPPPOONMMNNNMMKIEAyywwtppoiiffc9953|<~),>*%$#+.", +".+##$&*>,){~//<__|||335559ccfccccccccfcccfggilmoomqquuxwyAEHIKKMMMMMMMMMNNNONNMMMKKMNNNOOPPOOOOOOMEBAzAzBHEEGEEBwtsummmmssswCAvzCHHGCEHHHHEEEEIMNNNNMKIEBBzwwwyABCBBBCEHHBzzCEEIMOONNMIHKMNNNOOOMMNOOPQQPPPOPOOPPPPPPOOONMNNNNMKIEAywwwtppoliffc953||/~),-*%$#+.", +"+@#$%&*>>,!)]~(((<|2335999ccfffffffffffffkilooooppptwxzACEEHIKMMMNNNNNNMMNNONNNNNMMNNOOOPPPPOOOOONIEABAABGEEEEEBwwummqqmmmtwwzvzCEECCBEEBBBEEEEHKNNNNMKIEBBAwwwyAACBEEHIIEAAAEHINOOOOMIFIMNNNOOONNOPPPPPOOOOOPOOPPPPPPOONNNNNMMKIHBywwwttpoliifc953|-*%$#@+", +"+#%%=*=>>,!~{](/__<|335999cccfccffffffffiiloloppptwzAABEEEEEHIKKMNNNNNMMMMNNNNNMNMMMNNNOPQQPPPPOOOMHEBEEEHGCCEBzxxwuuuqqmmqwwtwvABBAzCABBAABBBBBEINNNNMKIHEEAwxwxzzzBEHIKHBBBEKMNOOOOMIIIMNNNOPOOOOOOPOONNOOOPOOPPPPOPOOOONMMMMKIHEAywwwwtpliffc933|-*%$#@+", +"+@$%**->,'!!~]/<__135999ccccccccfccfccdfiilllopptwyAAAABEEEEHIKMMNNNNMMMKMMMMMKKKKMMNNNOPPQPPPPOOONKIHHHHHGCCBAwttquuuuqmmqquspvAAAzwwyABAAAABBBBEIMNNNMMKIEEAxwwwzzyBGHIHEEAEIMNOOOONKIKMNNOOPOOOONNNNNNNNNOPPPPPPPOOOOOONNMKMKIEEAywwwwwtplic9553|-*%$@+.", +".+@$&%=->,,']/<<<1|5cfffccccffffffffcdfiililoptwwyyAAAAAEEEHHIKMMNMMMMKIIKIIIIIHHHIKMMMNOPPPPPPPPOONMKHIIKIECBBwtuqquuuuqqqqqssuwwusuwyAABAAAAAAAAEIMNNNMMMKIEAzxwzzyyAEHEEEAzEKNOOOONMKKMMNOPONNOOMKKKMMMMNNOPPPPPOOOPOOONNMKKKIEEAywwtwwtpoifc993|*$#+. ", +" .+#$%&->,')]]_1||79filiffffiiiiiiiiiiilllopttwwwyyyyyAEEEEEEEIKKMMKKKKIIHHHHHEEEEEHIKKKNOPOOPPOPPOONNKKKMKIHEEwtumqquuuuuuuqtswwwssstwyABBAAAAAABBEIMNNNNNMKIEAAyzAyyAEEEEECABHMNOOONMMMMMNOPONNONKIKKIKMMONOPPPPPOOOPOOONNMKMKIHEBAwtpttpoliffcc93|,')]_<1359dfifcfiilllliiiiiilloopwwwwwwwwyyAABBAAAABEIIKKKKKIIIHEHHGEBBACBEHEEIMNMNOOOOOOOOONNMNMKIHEAwtmqquuuutxxqmtwwwtssttwyAAAAAAAABBBEIMNNNNMMKHByzyAAAAEEEBBAACHKMNNNMMMNMMNOPOMNNMKIIKFKMNOOOPPPPOOOOOOOOONNMMMIHEBAwtpppplifcc99953|,')]_<|359900009dfiiiiiiiiiilooptwwwwwwwwwwyywwxxxzzAEEIKKKKIIIIHIIHEBAAzzCABEHKMKIKNNOOOOOOOOOONMKIIByuquuuomnpzyuqquuqmmmmstwyyyyABAAAAABEIMNNNMMKKHEywwwyyAABBBBBBHKMNNMKKNNMMOOOONNMKIKKKKMNOPPPPPPPPOOOOOOOONNNMMMIEAAwtpppplfc99553333|*$@.", +"@@#$%&**-''')~(<}357527755799ccffffilloppttttwwttppttwtttutxxxABEEIIKIIIIIIKKIEEBAAAyAABHKMIHIIKMNNNOOOOPPONMKKEEzyyAtrnnrtzxuuuuqmmmmmmswwtwwAAAAAABEHKMNNNMKKKIEAwwyABAyyABEHIKMMMKKKMONNOOOONNMIJIKMMMNOPQQQPPQPPPONOOOOONNMMKIEAywtpppolif955||<<<*%#", +"#$%*;>>,,))!~](<|35772447777709cccfiiopptptttttptppppuwwwwwxwyyAEEEHHHIIHHIKKKHEEEEAABBBHMNMIIIIKMMMNOOOPPPPOMMIHEEGEytnlopxxuuxuqmmmmmmmsttuuwAAAAABEHHIKNNMMKKKIEAAABEBAyAEHIKMMKKKKKMNOOPOOOONKIIKMMNNNOPQQQQQPQPPOONNOOONNMMKIHAAwwpppplifc95||<-*%$#", +"+#%*>,,~~~~///<|2552243277777090ccgiloppopttttppppppptwyywwwwxxADBFFHHIIIHHIKKIEEEEABEEEHMONMKKIIKKKKNNNOPPPPOOMKEEHHEwprptxuuxzxqmmmmmmmssssstyAAABBEHHHIMNNMKIHHHEBABEEAAAEIKNMMMKKKMMMOPPOOOONKIIKMMNNNNOPQRQQQQPPOOMMNNONNNMKKIEAwwttppoifc953|-*%$#@+", +".+@$=-,)~//<<11555575a7657509099cgfiooolopppppoloppptttwxttuuuuyAEEEEEHHHEEHIIIHEEEBEEEEHIMNMMKKKKIIIKKKNOPPPOOONIHEEEAtpptpuuxyxuqmmmmmmsssssswyABBABEHIIKNNNMKHEEEAwwAAywwAEMNONMKIKMNMNPQPOOPOKIIKMMMNMNOOPQQQQPPPONMKKMMONNNMMIHBywwttpolic953|-%$#+. ", +" .@#$*->,!~]<149999909a888999ddcffilollloppooooopptttppprqpuuuuwDEFEEEEEEEGHIKIIIHHEHIIIIIMMMMMKKMKIIKKIKNPPPOOOOMKHEEBwtttpppptsuuqqmmmmpspssutwABEBAAEHIKMNNNMIEACAwwwwwwwyBINOONKIKMNNNOPPOOONMIIIIIKMMNNNOPQQQPPPONMMKKMNNNNMMKIEAywttpplic953|*%$#+. ", +" .@#$%-->,)~/<|56596999cdccffggiilooliloppooloptttutpollqrqruquwAEBBDBDDABEIKMMKKKKIKKMMKMNNNMNNMMMKKKKMKMNOOOOOONNMIHAwwwwtpppppnuuqqmmmrssusttyABEEBAABHIKMNNNMHEEEBywwtttwAEMOOOKIIKMNOOPPPPONMKKIIHIMMNNOOPQQQPPOONMKKIKMNNNNMMKHEAwttppoif953|-%$#+. ", +" +@#$%-;;'!](_||322565599gfffiiloppolllppplooptwwtpollllprprqquwABAAADDAABEIMNNNMMMKKMMNMNOONNNNNNNMKMMNNMOONMNNONOONMEwtwwwtpppnjnquuqmmsssupuwBCEEHHHAABHIKNNNMKIHHHEAwtuttwBINNMIIIIMNOOOPPPOMMMMIHGHIMNOOOPPPPPPOONMKIIIKMNNNMMKIEBywppooifc53|-%$#+. ", +".+@#$*=;>,!](_<}}|346769099cfiiooppoilpttppoptwwtpplllooprrmqquyBADyDxxyAAEIMNNNNMMMKKMMKMNOONNNNNNMMMOOOOPPOMIIIMNONNKAwwwwupppnjhqqquqqssspuwACBBBEEHEAAEHKKNMMMKIIIIEypopptyEKKIEEHIINOOOOOPONMMMIGEEHKMOOOOOPPPPOONKKKIHIKNNNNMKKHEAwtpollic953<*%$#+. ", +".+@#%=-;',](_<|:|||776599989fiilooliiotwtttptwwttpooooollqrqquuABADxtuxxzAEIMNNNNMKKKMMMIIMNNNNNNNNMNNNOOPPQPOKIEHKNNNMIEBwutwtqnhjjmqquwttpsvwzABAwwyABAABEIKMMMMKIHEHEBwtptwAEEEHEEEHIMNOONNPPNMMKIGCCEFKMNNOOOPPOONNMKKIIHKMNNMMKKIEAwtpollif993|-%$#@..", +".+@#&=;>,)](_<1:}|4114700099filoolffiotttppttttppoopooolnqqvvuxABDxuuuxxxzGKMNNMNNMMKMMMHHKMKIIKKKMMKNNOOPQQQPNKGEEIKMMKKIBxuwxupjhemmqqwwwuvxwtwywtutxAAAABHKMKMMKKHEAABywptwAEHEEHHIIIKNOONNOONMKIHGCCBHIKKMNOOOOOOONMKKKIIIMNNNMMKKEAywpollifc953-%$#+.", +".+#&%;;,]((<<:<||1114770770fioollffgkpppqppooigllooolikilrprruxEBwuxvstwwxzEKNNMKMMMNKIIEHKMKIHEHHHHEHKMNOPQQQPOKHHEEBAAHKMKGCAxuppnqqmmtwwwxtsmquuqmmmmwyyyAEIKKKMMMIEBxqoputyBBAABEKMMNOPONOPOONKIEEEBCGHHIIKMNNNOOOMMMKKKKKKMNNMMMKKEAywpoliifc953,]((_::<|_114470770dflooiifcgmppppqpoiigglmolikjiimmnruwAAxussvvupptyHMNNMKKKKIIHHEIMMKIIIIHEABIKMOOPQPPONKEEEAtuwEIKKKHAutttxuquttxwqqqmquqqmmmmmwywwyEIMKMMMKIHAqmmuuAAAwxwAEIKNPPPOOPPONMIEGGECBHFFIIMNNNNNNMMKMKMMKKKNNNMMMKIEAytpliiifc93|/~),>*$#+.", +"+@#&=->){((___<|__14770070cilpliggdflpppppplggggkoolikikjnmmqqwAAxsstunqqpptyEKNMMKIIIHEEEIMNMKIIIIEAAEIMOPPPPOOOMIHEAumotAEKMMHAwwyAAxwwuqqquuqlnnjmhmmmqwwwwyAIMMMMMKKEumlptABywttyAAHMOPPOOPPONKIJECCCEHIIIKKKKMMMMMMMMKKKMKKMONNMMKIHBywpoiiffc953|/),>*%#@.", +"+#&&->'!{(((___|__1477770dgimoliiddglloppoigggggkkolikjkkmmnqqtwyzutvoonoppttyEIIKKKIIEEEBEKNMKKKKKIEABIMOPPPOOONMKKKHwolootAIMMHBAABAzAyqqqqnorooonjemmmqqwwwwuAIMMMMNMKApopwBEAwtttyyBINPOOOPPOMIIHGECCEGIIIKIKKKMMKMMMMKKKKKMMNONNMMKHEAytpoiffc953|<~),-%$@+", +"+#&*->!{{(((__<_[_1}23246dklopmliddfiilllifc9agkkiollillknqpuuuwxxwunnoookkmqwABBAEHHIHIHHEIMMMKKIIIHEEIKOOPOOONNMKMMKEwpojipyIKKHEBCAyxuuunnlmmmmmkifjjqqpwywwquCIMKMNNMHytpwBIHAtttwyAEMOONNNONKHHHJGBBGEIIKIIIIIIIIMNNMMKKKMMMNOONMMKIHBAwpoiifc955|*$#+", +"+#%*>'!{{((::___[_1}34226bkmppoliddciiigifc9a8akmkkollllmprsuuuuxwzxrnnkkkkmmqtwywwyyEHHIIHKMMMMKIHHEEEIKMOOOOONMMMKMMKAwpiiipyGIIIHEAzxxrookkmmqqqmkgjjjqquAyywqwBIKMNONMHAwtBKMHytuwyyEINNKKMMMIJEEEGBCEHHHIIIIIIIIIKMNNNMMMNNNNOONNMMIHEAytplifc995|*&#+", +"@#%-''{{({](<:<__:<}3222adjouuqligd9fiddddd9aaakmkglolmomrqpuuuuuuyttqkkmmmmmmtwuqtutuAAEEEKMNMMKIHIHEEEIKKNOOONNMMMMMKIEApfhlpxzEIMICztppmkkfjiloppmkkjjquwAAAyuuyEHMNOONMIBAEMNKBttttwyHKKIKMMKJHEBEEECCEHHHHIIHHIIIKMNNNMNMOOOOOOONNMKIEBywpoifc9953|/~)>-%#+", +"@$=;,){(~/]<:<:___:}422269iotwtmig9acgddgdd0788cmkgloooomqqqqsuvuswtwtmmmmkjmmuwuqmmppuwwyABIMMMMKIIHEEEIEIMNONNMMMNMMMKIIAoooopuyEMMJAwqqmjeecbcfopomkgjnwwwAAAuutABHMNOONKIHIMNNHwppptwEIIEHMMIHHEBCBCEEEEHEHIIHHHIIIKMNMMMNOOPOPOOONNKIEEAwtolicc953|<~),;*$@", +"#&=>,!~(](/(:<::__<}211179iotxwpmg9a0ggggfd07a8cmkggoooooqrmqquurrtpwtuqmmmmhjuwwuqmmmutuwwxCIKKKKIIEEEEEEIIMKKKIKKMNNMKKKIAttpmmpwHIKHzuomiec9abbfiolkggluuuwyAAtuuyAHMOONMKKKKMMHypqptwEIEEEMNIEBEEAABEGEBEHHIHHHHIIIIIKMMMNNOPPPPOOONMIHEBywpolfc955|))~(]//<;&#", +"%*;,){/]/*%", +"*;,)~((/::<<<<<_::11211147dipwAAztlgdddccca0008aemkklooputxussuuuuorpkmmqoppptwyAyttpuuuxxxxCEEEBBAABBBAAwAEHEywwwyAEKMMMMMMMNMIBwqmoptAEEyolifca668ciilmmonqqwyAAyxuoptzIKMMMMNONMKBwqotAIEEEHEEEBABBBADEIHEEIIIIIKKKKIIIKKMMKKMNOOOOPONKHEBBAwtpoifc9953|<~)>*", +"-,)~/_|<||||1__<}|2|4411470gmtyCBypkgbdfgfdd008bbmmkkonpptywwttusuvookkmmlnoopptwwprolluutuuzEHEEEAzAwtwwwwBHEypppptwBHIIMKKMNNNKGzpooptAEBwpiif9a6aceiinqpnuuxAAAByxtopxEIKMMMNOONMIAwqtyHHEBEEEEEBABEEEHIIHEHKKIIKKMKKIIKKKMKKKMNNOOOOOMIEEAywwtoigc9953|)~/(_||||1||__}|14434}470dkpyzEAzulfhffffgdddabmmmkkorppwyyxwuustprmmmmiikillmptplnjinqqqquAEEBEAwwwptttwAIHAtlilptwyAEIKKMNOONKEwpoolpyEEyplifd866fiioqqpxzAEEEByxwppuAEIMNNNOOONKHAttyHHHBEEEEEByAAEHHIKIHHIIIIKKKKKFIIKKMKKKKKMNOOPONKIEAyywtplid995||/~)>-", +"*-,)~/_<|}|||<__:<|2442}}470dlpwABAAtoifcffggdhbbkmmmkgoopuxyzywwuuppummmeefefgkopmkijhijijquyBAAywttuuuppowHIAwpliloppptBEIIMNONMIBwpiiiowEEAtliff98biilotwwAEIKIHEAywptyBEKNNNOOOOMKEywAIKIEHEEEEAAyAEEIIKKKIIIIIIFFKIIHIIIKMMKKKKMNOOPOMKEEyywtpoifc0531,!~/<_|}|___<_<:_<1422}}2770cilpuxwwwtplifggikmmmmomkoloouuwAABAAAwtmkkkbbbcdgmtplggddeijjnpwwvttqmoollllltABAwpoiillfflttyBIKMMKIEAtoffipyEEypliiifiiilpwBIKKKKKKIECwwAEEHKNOOOONNNNKEHKMKEIIHEEBAyyAAEHIIKMIHEEEHIIFFHHHIIKMMKKIKMNOOOONKIHByytpolic054|(~';", +"=;,)~/_<|}|<1<<__((<14222227770bhkmoptttupolkgjimmqqqqmkllmmppwAABBBwupkkkbbbbdglpumgddddgkknpxzwwwqlolnlifipyAAAwpolllifioopyBHIKKIEAwpicccmwBBxpllliillootBIMMKKKKHHEAyABEEHKOPPONNNNNIIKMMHEHHEEBAywwyAEIIIKKHFEFFEIIFHIIKKMNNMKIKMNNOOOOMKIHBAwtpolid571_/';", +"=;,~/<<||||11<|__::_1}222227777abdgekloptttpqmlimmqpqqqknnnorppwyAABwtpkkkkbbb0glppmgdddggmmmuwAAywtolnllecclwAAAywpoopoiiiiltyABHHHEEAtof57dipyypoiiillllotzHMNKKKKKKEEABBBEEINPPPONONNMIKMKEBEEBBAwwtttwAHIIKKHBBEEEFIIIIIMMOONMMKIKMNOOOONMKHHBAytpoifc96}_!;", +";'!~/<<|||21|1|__:___}}22227777880888bfioopputpoqmmmpqqmomnnrppuwyAzAtpmkgkhcb0dkoqmgdddgkmmmqtAAyywooooif98fotyywwtpopplifciowwtwBEEEByti0730gmutpiiiillilotCKMKIIIKIIEEBBAABEKOPPONMNNMIKKEEDAABAywttpptyEIIIKHEABAFGHIIIKKNOONNNMKKKMNOOOONMIHBAAytpoif952_!-", +";')~/<|1||3114|<1:[_[1}12267000a0aaa66aadfloqutttppommmmprnoopqpwxwyywtpkkkfehddkmqmggggkkkkkmqtwwwpolollic89ilotwwwtqptpoiccippoptyBEBAxqf5347dltwoiiiiliifowEKKHEAEEHHEEAyyAAHMOPONKKIIIIIEBAAyABAwtuuqutAIIIKIHBAzACFHIIKKNNOOOOONKKMOOPOOONMIHBAywtpoif97:);", +";'~/<1|1453442|11::___:[}227000bdaaaaaa6a8cfkmutwxtuqmmmqprnnopptwxxzzwtmmmmheedgmpmkbcfffbbbeipttopllillif99fcipyywtpopmpof9flpoilpwABAAuld3||7dlutoiiiififioyEIJAwwABEHEBywwwAINOPNIEHHHIIEAyAyABAwqprpptyEIIIIHECzAABEGHIKMNNOOOOOONNOPPPPOONKIHBAywttlif5}{'", +"'!~<<|347555333311:___1:[}47770008a6aaa66a0adglowwyxuupmpppronpppwxxwywwtmmqjjedgmoojeeehbbbbhfoooooljfiiifccddcowywpilommplccilliilptAAAyuid7|47dmwtoiifffbilwAEEAtppxAEEEAwpwAHKOOOMHCBEIIIBAwwAEEwqmprptwEHHHJHHBzzzzABEEIKNOOOOOPPPONOOOOOONMKIEEAywtpol92[,", +"!~(||355055957|211}}__1}[}447787066aaaa8668a0degmuwwxwwuttppqrqppwwwxxywwqqpllidgkmpjffhfb9bhbfiopooofccffcb50ccitAypiglllppiffiiifilptyAAytmf0770itzwpliiifcipwBEypolqtwBHEwppyEKNOONKBABHIIEyywxAEwumpqqtwAEHHEHHECzzzzzCCGKNOONNOPPQPONOOOOOONMKIEEAywtpof7}!", +"~/1435990999577314}}1111}44247a76222666a6868ddbkkmquuwwwywttpprrqxxxzxwtwpqqqonggkmqljfeea8bbb8elponifccccc770dcfpywoffiiklpoliififiioqtyAAzwpmd77dmwAwmgiiiffotAAwtoiilpyEIBtotAIMOONMHyABEHHAtwwyBytqppruwAEHHHHHHECzzzzzCCGKNONNNNOOOONONOOOONNMKHEBAAwtpi93:", +"~<|7599cddcc099544}22114244477776}22226a66a8ddekkkkmmquwAzywwupqqwwxzyxttwuutlliggmqoiiheb8ba88clpoolibcccc5750dfltwofdfifimpppliffiiimptwAAAyulc0dkuAAwoimoilotwwtplifcipAEIAtpyHKNOONKBwyzEEBxwwwAxwutrpptyEHIIHHHHECCACzCCBHMNNNMKKKMNOONOOONONNMKIEBAywplc|:", +"]<|5559ccdfcc9a90772244444477776622222226268ddekkkkkkmmqwAAAywttpwwxzzzytwquuojigkmooljieb8a888ciopoli999cc95|399fowpf9cfdglotwticcfffgouwABEEBwpifipwAAwpppqppwyytpplffeioyHIAttBIMNONNIywAAEAzxtuwwwuwsrpuwBEIIHEEEEGBCCCAABEIMNNMIIHHIKNNNOOONNNMKKHEBywpid3]", +":|35099dfdgbc0d9975224477777787a2222[}22622a00bkkkkkkkmmtwyAAAywtwwvxzzzwuwqtuljkkmmoliifb678889fopliic88c097||59clwwofcfccilqwwofcfiiiotAAEEHHEApliipwAAyttttpwAytpppliccipAIIytyHMNOONMEwyAEBAwwwzwxuytprptyBEHIEEEEEEBAAzAABHKMNKHHHEEGIMNNONNMNMMKKIEBypli5:", +"}6599ccfffgfc0dd9706657777777776222}1}16666800bkkkkkkkmmpputAAAAyAwwxzzyytuquuoojkmmooiihc666888elpllic9999951|45clwywpif99cgipwwlfiopootyAABEHHEwpiiiowAAytututyytolopoiiiltHKHzwEKNOOONKAwAEEAyyAzwtuwwtrrpwABEEEEEEHEBAzAzABEEMOMIEEEBGGKMNONNMKKKKIHHEAwpic4", +"|609cgiiiliiecdd0000675777708066266}2226a66800bkkkkkkkmmqpuqwwAAABAzzxywyttqquppoklmqoljheaa68aabjplllic99055|||5fotyAwoi9599glwBypopppoptwyyAEEEAtmifglwAAtpqptwAwlcfiooifflwIIEABKNOOOONIAABEEwyyAwuuwywpppswzAEEEBEEHEAzyzzAAEKNNKEFEBCCIKMNNNMMKKKHHEEAtoib5", +"_}599fgiklliifgd9c006665500cb0aa6a4242228aa8dehkkkkkkkkprqrsstwyACBAAzzvxxttquxppmmoppojifb666aabfolloic99575|1|5iptyAtoic509clwEEypoppplotwwyAEEAwplf99itzypompwAwofcfqoliffoAIIEAHNOOOPOMHABHHBvxwuuutxwtppptwwAEEEBEHECyyvwwzBHMMMIEECCCHIKMMNNMMKIIIHBAwpi81", +"_|290cggiiiiifdcdc90d0899bcfdgc9807a666a8a8bghemkkkkkkkrrrqpuuutwBEEEEAzvxtwquxttpmppppniee866a88elllllf997553115iptwAtliiccfilpAEAwpoppootwAAABEBAyulf99iwzwpllpyAtf9ioolkdfipAEByBKOOPPPOMHBHKHytwtuquttwtqqtwwyAEEBBEHEAytwwyAEIIKIEECCGIIKMMMMMMMMIIHEAwpj82", +"}478dcggfiiiifdchd00d09cdfffggeff9b99999fccfhjmmmmmmkkkprrrpruptyAAGEHEzxwttquutttqqttpojfeb668a8ciillif885553335fpwABApoooliigipyAAtooppopyEEEEBEBAwpf979iuxulgipyti9ciolffcdipABAwENOOPPONMIHKKBwppuqqutuqmmpswwyBBEBEEHEwxwwwyzABHHEEEEHKMNNMMMMMKKKIEEAwpj9}", +"[458ccfgiiiliifhfffdggcfffiigffffcc9dcccffhimnqqmmmmmmprqrrrrrqqwvzCGIIECzwttquupttttxwplfehb6a88bfllliic885557339lwABEAwwtoic9fotwwwpoppptAHIEBAAAzwpg5413guuogditwlc9cillfc0cipyAyAINOOPOONKIKKIAtppopttupqmmqqwyABDBBEHEzxxwyuxzAAEEEHHIKNOONMMMMKKIIHHBwpj8}", +"[659cffiiilllikiiiigkkfffiiigc9cc8956aa9bfgimouuqqqqmmpprpprrrrrxxzzBIKHGAzttqqupptuwwwtnifhbb6a8aclloiic9959994}6ftwAEIHAticccfloppxwtpptwyEHEyxwwwwpk0|<_4gqpicfpwticcktttld9dltAAAEKNOOOONMKIKIEwttppppptqmmmquuyABABEEEByxxzuxyzzAABHHIIMNONNNNNMKKKHHBwulb}", +"}6addfgiillolllmlilikikffffdd96622|2327689ahknqquuuuqttutrrrrprtvwxzAEIHHEAttuqquppuxAzypjfhbbb888bioollfc909954[3cpwAHKHyof9cccfilotAAtpwwwAEEAwwpppqmd4_/<9kqofcmyApifoAAAwof9iqwBAAHMOOOONMKIHKHAwuttttttpolmquuuwABAABEEAywsuxxyxwAAFEGHKMNNNOONNMKKKIEAtqc6", +"669ddfiilmmpooollilffffg9bc0d056}}:}[}2}a68dhhmnmqpswwwwtttuprrvvxxAEDEEGGEBwtmqqopstABCyoifbbbb88bfllollfcfd95333cpAEIHBtlfccc9ciiopyAAwtttwBEEAwpoomif5|<_49mqkfiwytiipAAAAtlfcfpwBABKNOOONMKIHIIBwwwtutwwwtooouttuxBBABEEEAuuuuxzxuyyyCBGKKMNNOOONNMKIIEAtqh6", +"6abfiikllmpqppomlmiigffgf9906622}}[[::[}66addbkmmmmtttxvwwwttuwvvxxzBFEEBCEEAwqmqqnotyEIEwmhbbbb888cipopoiff995756cpEHEytpliif959clpptAEAwttyEEEAwpmkmmg93<<<|9mmgfmwwoiotwttwplccfqyAyBKNOOONKHHHIHAwtpttwyywttppttuxAEEEEEEExxxxxzzxywwAzCEIKMNNNNNNMKIIHEzrk8", +"6bhilllomppppppmllilgggig997a222}}}_[[:[22adbbkkkkrrquttwwwwvyxvxxyDBEFEBzCEAAwqqqooptBIICtlgbbaba8biooptofcb90799ftEEypopplifc55cloptyEHyttyBEywpoomlmld7|_((|dolcfqupllliilptpicfipyyyEMOOONKIEEHIEwtppptwwwwwwyywwyzEEEEEHBAzxxxzzyxywAAzCHIMMNMNNMMKKIHEzxk8", +"8bjilooopppppppmloiifgkkica76222}}2}}[[[2280bkkkrrqrrrrpttwwzzzyzxzDDEFEEzzAEBAuqqqoppxEKHymkggbdb88fltttof990900flwBAtiiopoifc569iotwwEIEwtwyAtpooomopplc51_(/3goicippliiiflpttpfciowAyAIMOOOMIBABIIBwoilpttttyAEEBAACEIHHEHBBAxwyzzAyAyAzzCFIKMMKMMMMMMMIHBxnd", +"dhinommppqppprrmloiigggkkf00a222}}22}}[22280bkkppprrrrvqrqvxzAACzAEEFEEFDzzzAAByuqqnprtAHIBtmgggbbb8cltwtpiccc90cipwywpfcippifc959fopwwAHKBwtwwplmllmoptpod7|>>->!<1<(_||||/~/4cilkggiddfoxAtpic7||3fpAEIKMMKMKIAwyHKMNMMKIBAywoilpwwwtpotAHKKNNKHBABBAxwuwACEIKKMMKKKMNNNOOPPO", +"OOLNNNNNLKIIEDDzxxwtwwwuuqqqqnigggggggeemmrrvvvwxxzzDFFFIIMMMNOOOPPPONLHFDzvvprmmmqquuqmmmqwyAIIKKIBypof997735illooliiiloptpptttppwwof5|(~~),>>-=='!<_{)///~~,,{3gklkgiigfotyytpi95335fpwBIKIIKKIBwyEKMNMMKKIIHEyplloptwywyBKNNNNNKIEEEEzuwwzCGGKKKKIIIMLMNOOPPP", +"POOOOOOMMJIJEEDzzwywwwwqqqmmmjhjhggggiijmmtsvvvvzzzDDFFHHLLMMOOOOQQQOOLIFCzvpsmmmmmjnuuqmmmtwAHHIHEEztpic99542cllopoiiiiilpppppollptof3<())))'>;=&*>~<~,)~~)),>,~5ilkiliiiopuyywpf95599kowEIIHHIIEwwAIKMNNMKIKMMIAtolllpwAyEKNNMNNMKKIKIEzAwwCBEHIKKKIILLLMNOPPP", +"POOOOOONKLLHFFDzzyAwwttmmmmmmmeeedgghjjmmsswxyzzzzzEFHFIIKMMOOOOQQQPONLIEzzvppmmmmejjnruqmmtuyBHIEHEBwpofc95439iopttpolliiopolliffilli5|~),,'-*==%%;~11(~//~)~),);**=-,)),)~<<~~/<<<|<))<5fluqqoommuxAyticcf9335itEKIIKKIAttyHIHHHHHIKMNOOMBwoliowBHKOOOOMIHIIMNMKIHIIHHIKKKKMMMNOOPQR", +"RQPPOONLLLIFFFECCyvtsrrmmmmmmrmmmmmmmmmpssvvvvvzzAEFFIILLLMOOOPPPPQOOLKFECAwwqqjjjjjjjjnpxuqqwyBHEEEEEEAtpic0975cipwwwtplililllllif99flf3~,>***-,),-*-)~~),)~~~~)>)<3clqqmmikmtyytlfffc5|39lAIIIIKKIAtwEIIHEEEEHKMOONMEwpoptABEMNOOOKHIHIMMIIHKMMKKMMMMNNNNOPPQR", +"RQQOOONLLIFFFGCzyxvsrrrmmmmmmmrmmmmmmmmrrvvvwvzzzzFFFIKKKLOOOOPPQPPOOLIFCAzwuqqjjjggggjjnuuuqwyAEBCBBEEAytof009669ipttplifiioloolid3}5fi9/)>*&*-->*#@#*>,>-->,',,>>)/|dlqqmkggmtxuiccffc559itEIIIIKKHytyEIIHHHHEHKMNNMIEywwyBEEIKMNMKIHIIKMKIHHMMMMOOOOPPPPPQQQR", +"RQPOOOMLLIFHFECzvvvssssmmmmmmmssmmmmmsssvvvvvxzzzCFFIILLLMOOOPPPQPPOMMFFzyzxuuljjggggggjjjuuuqwABEAAyABAwtpi0097269lppoifffiliilii93:<5ff|~,-=***%#+.+@%--*%-),,,---,{|foqqmkgkqtul959fif99fpEKKKKKKKEwwBEIIIKKIHHIKKMMKEBEBEIKIMKKKKIHEIIKKIHHKMMMNOOPQQQQQQQRR", +"RQOOOOLLLKFFEzzxvvvssssmmmmmmmssssssssssvvvvvvzzzCFFILLLLOOOOPPPQPOOLLFFzvstqqllkgggddgdehquuuwyAAxzyyzAwwplf777225foolifffifccili93::|9ic|{>-%%%$+. .@%-*%*,),,>-%*>~3gquqmmikuupc3|3cg95coAIMMIKKKIEABEIIIKKKHEBEHIKMIEHEIMNMNNKKIHEEEHIKIEEEKKKIKNOOPQQPQQQR", +"RQOOOOLLKFIHBzzvvvvsrrrmmmmmmmrrrrrrrrrrrvvvvvzzzCDFHLLLMNNOOPPQQPONLLFDzvspmmjjkkggddddhehqquuyAyuxzwxywwpoi9576329ioliffffc99cfi953}<3fl9<,>%#$#+. .#**%%-)),,>%$*,_0kqqqmkkqupi1(/|0c59itEKMKIIIHHEEIIIIHIIHBwwAAEIHEEEKNNNOOONMKHEBEIKIGEAAHEGHFKMMOOOPPQR", +"RQPOONMLKKIHzzvvvvsssrrmmmmmmmmrrrrrrrrrrvvvvvzzzCDFHLLLNNNOPPPQQPONLHFCzvrrmmjjkkkggddddeejquuuAyuuxwwyAwwpof950059iooifcifd098b0c955|<5ff3~>*###@+....@%*%%%>,,,,-%%-)_cmquqmkkuuo9<)~|9550iwEKKIIIHHEEIIKIHEEEBwwAwABEBBEIKKMOOOOONKHEEHKMIBBAEEEGEFKMNOOPPPR", +"RPPOONMMKKHEzzvvvsssssrmmmmmmmmmrrrrrrrrrrvvvvxxzDDFHLLMNNOOPPQQQPONLHFCzvrmmmedggkkkggddeeemquxxAxqutwwywwpolf00cdcciiiccffc988799dc9|(/|99<,-%#@@#@+++@$**%%*>>,,,-%*>~3gmqumkkmuul3/!/35379iwEIIHEEEBBEHIHEEBBBAAAAyAAAAAABEHMNOOOONKIHIKNNKEHEIIIHKMNNOOOPPQ", +"QPPOOMNNKLFEzzvvvsssssrmmmmmmmmmhrrrrrrrrrvvvvxxzDDFHLLMNNOPPPQQQPONLHFzzvrmmeeddggffkggddeemmuxyxwqqxtwwywwpoif99cd999cccfff99599ccc9|(!)|95/>*$@#$$##@#$*-*%%*->>,,>->)/0kmqqkgluuuf1!)_7||39lAHHEEAwwtyABEBAyAAAABBywyyAywAABEKNNNNMKIIIIMONMKKIKKIIMMNNOOOPP", +"PPPOONNNMFFCzzvvssssssmmmmmhhmmmmmrrrrrrrrrvvvxxzDDFHLLNNOOPPQQQPPONLHFzzvrmmeeddddbhhkgggeeemqtAyutqqpwxzwwpoif9500d079cffiicc99955553_),~393)-%##%*--%%%->>-%%*->>)~)>,~|fmqumkkquxm7{)(3|<13ctBEEByppttwyyytolpwyAAwtppwwwyAAAEKKKKKHEEEEHKMKHHHIIEEHIKKMMNOP", +"PPPPONNMKIFCzxvvssssmmmmmmmmmmmmmmmmrrrrrrrvvvxxzDFHLLMNNOPPPQQQPPONLHDzzvrmmeeddddbbbgkkgjeemmuzAuqmqupwxwwwpif9569d0779fillif992||333|/),~39|,-%%*>,>-**>)),-%%*->)/~,,)/7imuqkmmuxug<){|3<_19mAEEEypoptwtttpidfltyAwpoioppttwwAHIHHHBAAAyBEHEzyAAEBCCEEFIKLNO", +"PPPPPONMKHHzzvvxsssmmmmmmmmmmmmmmmmmmmrrrrqvvvxxzDFHLLNNOOPPQQQQPPONLHDzzvrmmeedddd88bbgkkgjeemqwzxqtmquttwwwwofc645d07|5coppof92|:::|||<~,,~35<,-->,>>-*%-,~~,-%%*->)~,>,~),->)~3gquqmqqtuqc_~{|4<~/5lAEEByoilpppppoicclwAwtollloomrqqwBBABAwswwyAEEBxuwwyAzzzEFFLLO", +"OOOOOONMKHECzAyttsmmmmmmmmmmmkkkkkkhmmmmrrrrvvxxzDFHLLNOOPPQQQQQPONMLHDzzvrrmmeedddd88dddgknjjjquxxxuqmmqptuwwwpic8a634439iptof9221<**,)(9kuqmmqpuuo7/(<|1{{<5pBEBAtiiotpopppi9ftAAytoolooqqmqtyyyAAtpsttwABAyuqtxzzzzCEHILM", +"ONNOOONMLIGCzzztusmmmmmmmmmhmkkkkkkkkhmmrrrruvxvzDFHLLNOOPPQQQQQPONMLHDzzvrrmmeeddddddddddgjjjjquxuuuqmmquutxwwtpica666859cilof959553<(//<<<~))/|33<)*#+....+*~//,-%*->,-*>)~|fqumopuuuuk3_/<|/){_fyBCBypfgoolopqoifowBAwppqppttppwAywwyupoooqtAAwxuqtwxwzADFFIL", +"LLNNOONMKFGCCzAttsmmmmmmhmmkeebbbkkkkkkmmrrrvvxxzDFHLMNOPPQQQQQQPONMLHDzzvrrmmeeeddddddddddjjjlouxuquuqmmqotuxwwtpfa6aa9cc99ciic9cff93|(~~/--,)(9kqqomquuuqc|((__~)<5oABCAwmcfigkooppllpyEAwwttuuwwyAywtwytlinllpxywxuqtxzwwzCBFFL", +"LLNNOONMKIGCCAztutmmmmmmhmmeebbbbbbkkkkhmrrrvvxxzDFEJKMNPPPQQQQPPONMLHFCzvrrmmmeeddddddddddeejnopxuqquuqmmqptuxwttofc9ccc9575cffffiic731/))~~/~/<|59<-$@. ...#>~<~,**->,,->,~|gmqmmquuuuk5<~/_({(5fpABAAtg9ccglmptpoouAABByyyyAEEAAwtwAwojjiiouwwsuqrtwxwxzABFI", +"ILLNNNNMLFGCCzztttmmmmmeeeeeebbbbbbbkkkkkrrrvvvxzDEJJMMNPPPPQQQPPONMLHFzzvvrrmmeeeddddddddeeeejoptuqqqqqqmquutuwwttplie98655379cfilic541<~),,)~<<<39|,%#@.. .+%,~/~--*>,,>>>!/9kqqmmtuuuqc|/~///(49iwAAAypc90dioppwpolpwEEEEEBEHEBAytwAyplliinuwxtpqqttyxxzzAFF", +"FILMNNMKFIHCCAzuttmmmmeeeeeeebbbbbbbbkkkkkrrvvxxDDEJJMMNPPPPPPQPPONMLHFDzvvrrmmmeeeedddddeeeeejnptxuqmqqqqmquttutwwwtlf866444426cilic5||>)~~<3|~-%$#@...+#-)~),---,,,>,)~|gmqolquuuuk7_((///<7ftyAyyti059floqppogioyEHIHEEHEBAyttwypooihjpttwpqqqtuzxyzDzF", +"FHKMLLMKKHHCzzAtttmmmmeeeeeeebbbbbbbbbhkkkrrvvxxDDEJJMNOOOPPPPPPPONMLHFDxvvrrrmmmeeeeeeeeeeeeeejotpuqqqqqqmmqutwwyBBypc662|11[}}3clic54<<<~'-**--,~||~,>--*$+++#*,)),,;-,,))))~{5kpmllquuuq0|<(((~/3gpyAywwpf70fiiiioplcfpyEIIEHHEBAwolptpookfeotttsommqtxxyxAzz", +"zFIKMLLKKIHCzzvtttqmmmheeeeeebbbbbbbbbkkkkrrvvxxDDEJJMNOOOOPPPPPPONMLHFDzxvvrrmmmmmeeeeeeeeeeeejoppouqqqqqqmquxwxABAypf96221__[:<3fif93|*%%%-~||/))),>*%#+@%>)),>,>,,)//~~~,,>,)/<-%%%>))>>,>,)~/%##$-))~//~/<|*-)~,>>>,)~{/<(~(7kmmfgmquuqi9995<{)|fpyAyppqpppof059cittrififiopttpiiptpllljifisttqomljmmrnqms", +"stzCCIIKIIHGzzyxuvmmmmjeeeddddddadadbbbkkhrrvvxxADJJMMNNNOOOOOOOONMMMLLHFDAxxvvvrrrrmmmmmmmmmmmmquqmmmmqqloppppttttsqolpli86|_^[/~~(~~<5953<~),-$##%-->)~~<39c93/)>,),>->,~/<<||(~|gmmgckpquuog9997<~/5ityywpoppolic76acottpf9889fiiilouwtooleiiiottppjjhnmqrnmm", +"mtwCCGJIHFIFAzyvussmmmhjhedddddddadabbbkkkrrwvvzDEIIMNNNNNOOOOOOONNMKLLHFFDzxxvvvvrrrrrrmmmmmmmmquqmmmmjjlopttpnopttqmlloic84<^]{~~{{))<|55|/~),*$#%*%%*>)<3cff93<~)),>-->~/|353<~*%%*$##%>~|355955|>)/|3|/~)>**-%@+#*,///<39fc9|,~<|<~~),>>-$@@%>,,)/|9fiif93/>$$-/9ili5||0gmmg7dkquumg517c7;--->,~///~~)),%#@$*--,~<359cili9/-%%,|ioli515gmqk75gmquqmd1|5c3/{/3iwAytlgf9566862259dflptwwwwywtpicbc999fnppooihdeheheb", +"bgnrxzBCGGCBBzzvvvsrmmmmeeeeeeedddddbbbkmmrvvxxDDFIIIIMMMMMMNNNOONNNNMMMKJJLLFHFFDDDzzxxxxvvvvstwywmmmmquonjjjnmmkgkmqunjefd967}3|1/{';-*--**;>)/////~>%#%***,~|||||3cooc/-*-~9lpoi59giqmg40mmppqi3<|00|{~19pyAytif9566762223099dimopppppolfcc988biooolihhhbgbab", +"bbkrszzzCCBBBBzvvvvrrmmkheeeeeeddddbbbemmrrvvxxDDIJJJJIIMMMMMMNNONNNNNMMMMJJLLLHHFFFDDDzxxxxvvvyyywummqquujeehjmmmkkkqppoieb963|253|_{';**-*&%*-,~<<||~>%*-->)/<33|)3lppof9fkqpi77fmqpumc|<5d3_/<5itAAypid76266|}1|1|4509d9cdgklkiif9669flomligbhbbhb8", +"6ejmqxzzzCCBBDzvxvvrrrkkhheeeeeeddbbbbkmmqrvvvzDEJIJJJJJIMMMMMMNNNNNNNNNMMMMKLLLLKHHFFFDDzzxxxvyBAwtsqquuqheeedgmmmkkipppmiida31}55531/)>--*=%&%*-~<35|~>>,,)~/|5995|/|9fc|~))|iptpidflqqmd7dkouuum9|7dc3<~|dowAAwoi9311||1__(__37777750ciillf9268cjlollihcabaa8", +"8bjnquwzzzCADBDzxvvvrrkkkhheeeeeeeebbemmmprvsxDDEJJJJJHJJIIMMMMMNNNNNNNNNNMMMMMLLLLLHHHFFDDzzxzyBEAtuwuuqjheeeddgmmmjjmpplllifc32359993<~,>-=***%*>)|99|~)~/<<|59fff9|<|59|~))-=*&%%%%>)|c9|<|335cfc9cfic5|373~,>~3pwwtpllqqpmicgkquuuof0cif9=%$####%%,|95559cfllifffilf9355<,--)9ptwtppuutpmgilqquuulddiif5<_|0qwAytplf91^]^^^[::(]]!{!{{(159a2}26abfgiiigbaaa22", +"}68hnouxxyzzCADDAuuvvsrrrkkhhhhheeeekmmmrrvvvzDDEJJJJJHJJHJJIMMMMMMNOOOOOOOOOOOONNONNNNLLLLHFFFCCHIHEAqmmeeedddddgklooompppomiiid56359cfc9|<~,=%$####%>/||9flpttpoollllf5593/>*-~9opttuuxxwumikmmqqpplfioic3<<4ipyyytog92[{!!^^]::^]!!!{{(|462}}228cffiiifc9aa2}", +"}6ablnrtxzyzCABADxuuvvvrrrkkhhhhhmmmkmmrrrvxxDDEJHDEDEEHJJHJJMMMMMMNNOOOOOPOOOOOPPOOOONNNLLLHFFECIIIAwmmmeeeddddggkinonmptwwttptpigfccfiifcc5|/)>*%%%$*,))/5lwyywttttpoid955|~>-,<9iotutxzywtmmmmmqqpploqof951|9lwyywoi93[^^!!!^](^]]^{{(_1||2}2268bffkgigc0082}", +"}28bhnqsxzxzzCADDyxuuvsrrrrkkhhhhmmmmmmrquvxxDDEEEEEEEEEJJJHJIMMMMMNOOOOOPPPPPPPOPPPPOOONNLKHFFFCJIHztmmmeeeddgggggeiopptABAAywttpllc99cccffc03<~))>>->,),,/9oyAAyyAywtpli953<)>,/39copqtxxzxuomqqmmqqopqplg9547fpwAytlc6}:^^!!!]]^]^(____||<}22270dfiiiifc9071}", +"}2aahjpqpwxzzCABAyyxvuvvrrrrrrhhmmmmmmrprvuxxDDEEEEEEEEEEJJJHJKMMMMNOOOOPPPQQQQQQPPPPPOONNMLKHFFEGEBtsmmmeeedgggggghlpttwAEEAwpptolic57555555953,~~<3copttofflpABEEAywpi933999fpwuuyAAyuppqppqppuwyywoigfdflwEEEAwoic93<<:[::::<__11|23559ccfilifdc954_(", +"{}47bhhjnruuwxACCAzADvwuvvvvvvvrvvvqsvvvvxzDDDDBDDDDDDDDDEDEJJJIKKMMOOOPPPPPQQQQQQPPPPPPPOONLLIFFFzzvvpmmqjjgkmpqpqmlnlollilpwwpifgd52_~!!,,>;>--->,)),,,))~<5fqttogccfltAEEBAypic99fiiptwuwzAzxpqpuqqppppwywpiffifgpAHHEAwoif954}|}<<<|1_|__}|3659cfgiiffc951_(", +"{_47ahhjmnrpsxwACCzAAyvwuvuuvvvvvvvvvvvvvxzDDDDDDDDDDDDDDDEDJJJIKKMMOOOPPPPOOOOPPPPPPPPPPOONNLKIFFAzvvsuqqjjoqppqmmmmiiiiifhipwtlfdd961(!!';;=*&%&%*->>,,)~)~|clppofc99cfpwABBAytlfcfllltwwxzCzyuqpputpppptyywojfifcitBHHEAplfc953}:<<__<_<<}123559cfiiifgc95}_{", +"{(120hhhjnrrstxvAzCAADyvvtvuxxvvvuuvvvvvvzDDEDADDDDDDDDDDDEEJJJJKKMMNOOOOOOOOOOOOOOOPPPPPPOONKLHFECzvvstqqqppqqqmmmmkeeehhebhlttoifdd94_{!'>;-*&$$$$$$%*-,~~/|ciopi953359fptwAAyytoilpolpwyyCGCzwtputppppoqwyywmmlifflwEHHBypiffc93|}:<_||||2355599cfiifgff92:^{", +"![1700hejnnrrstvzAACAzADvywzxxxxvvuvvvxxzzBDEDDDDDzzDDDDDDDEEJJJKKMMNOOOONONNNNNNOOOPPPPPOOONNKLHFEzzytuqquttqqmmmkkggbbbfebbfottlgdd56_~!'';=**&$$$#####%>)/|clpoi5|<<<|9iptwwwtollottttyAABEHEAwtttupmqpptyAytoiiffipAEHHEAtoiikf953|1||4355555cccffiigfd52[^!", +"!(1400behjnrrstvyyzAAzAADADDAzxxxxwxxxxxADDEDDDzzzxzzyDDDDDDEJJJKKKMNONMMMNNMMMMMNNNOOOOOOOONNLLHFECzzvtwuxtpmmmmkggggdbbbhbbafopoid055_/!'';;*%&%$$##@@@@%->/5lppi9|/~)~<5ipwwwti9cipwwwyABEHIIGAywwwuopxwwyAAyumifilotBEHHEEypppolf905755599090cccfifffc96}[^!", +"!^_270deejnnrrssvyyAzAAAADADAAzxxxxxxxzzBDFDDDzzzxwxxzyDDDDEEJJJIKKMMMMMLMMMMMMMMMMMNNOOOOOOONMLLHFFzyywyxxppomkkgggddddbbehbabipolfd071_{'';;%&%&$####@+@#$%>|gifc93<),,)/3itzAtg3|5foppotyBJKKHEEAAzywACEEEBBBAtooppttyBEHHHEBAAwtppoliiffcc95559cd990962}[^!", +"!]_1700deejjnrrssvwyAAACGGACBDADAzzzzADBFDDDzzxxxxxxxxxyDDDDEIJJIKMMLMMKJJJJJJEEJIJJLLLNNLLNOOOMLKFFCCBEAAuunjjgddddeedddddbhhbbflligd541({!';;%&$$####@@@@#$$*!59953|<~~~~~<5itxxtf430floiitxAEJEEBAAAAtwAEEEBBBAytpoopptABEEEEEBAwtpoolifffc9955550d050762}[^!", +"!]_17709eejjnnrqsvwvDAAzCGGGGBBDDADDDADFBDDzzzxxxxxxxxxzDDDDEIJJJKLMMKIJJJEEEDDDDEEHILLMNNLNNNNNLLIHFCEEAyuqqjjedddeeeeeddddgfehbiiiid061/{!''-=%&%$$####@@@#$%'|95;%&$$&$$$##@##$%;_57_!>-=-,)~/<3ftxBAuifiomigipwABGBzwtttmfimwyywtppoic5590cipwwwwywttoiifdc957590cfiifc9d95|[[]!", +"!^^1470abeehhnhqqsxDvAAAzCGGHJEEBDDDDBDADzxxzzzxxxxxxxxxzDDDEEJIJMIJIIEEDDDDzzxyzAzDDEFHKKNNNNNNMMMKIIGCAxummmeeeeeeemmeeeedggkkeciiid999|>,,)/3iwACAwptttpoiluyBECywtppmg0dipuupmomkc953459iutttttttpoliigc9009cffffcccc9531[^!", +"]]_177a0behhhhhmqsxDvyADzGGHHJHEEBDDDDDAAxxxxzvvvvuxxxxxzDDDEEJJIJJIJEEDDDzxxxvxxxvxzDFHHLLMNNNNOMMKKICCAtummmmeeeeemmmmmeeejgkkkehffd99971({!'';&%&$$$%$###$&&&,|77(;*-,,;--;;)|fwABAwwyAywpmpxAEEAxwtpok05cimliiiiigc05337doutpptttttpppoifcccccc99599905531:]", +":}|45799aeehhhhmqvuyDyAACBHJHGGGEEEDDADzzxxxxvvvvvuvxxxxzDDDEFJJJJJJEDDDzxvxvsvvsvvvvzCDFHLLMNNOOLMMLIECyyusmmmmeeemmmmmmmhjhjnmmhccffd5903_({!,;***$%&&$$$#$%**>/77<,;,{,*%%%%*>|iwAAtptyAAywtwCGJCzzwtpog59fkkkgikgfffc959cipttppppttpppplifd9995537535433||1}", +"}35509dbeehhhhhmqvuyDDyDCEHGHGGEEEBDDAzxxxxxvvvvvvvuxxxxzDDDDEJJJJFEDDDzvxvvvvvvvsvvxzzzDFHLKMOOONNNKIEzvvspmmmmmmmmmmmmmmqqqnnomlfdgfd06873<{!',;**&%%&&$$$%%---)104),~_!*$$&$$*,|owAwlltyCBAwyACJJEzAwwtoc0dkmqmiiiffkifcccfmptwtpolooppolifcc955333|||1<__<<}", +":}79ccffjjhhhhhmqvuxyDDBEEEGGBEEEAADDzxxxxxvvvvvvvvvuxxxxDDDDEIJJEEDDDxxxvvvrrrrrrrrvwwzzDFHKKNOOONNMIFzzvrrrmmmmmmmmmtwwqqssuuppolicfd02505|_{'';--*=%%&&&%%=;;-,<75()~<_'=%$$$%*{5pwxofityAAyzAAGHEAAAwtui75gquumkkfccffgcd0diopppliiilooliiffc95531_<>{45<~~(||~>=&**%>{9pxtifowyyyyyABEEAyzwtum0|5gquqggd73570d0579fiilllilloolliifc995|1|>!|7|/~~_33(),>-%=;/cuuiffotxwxxzBGGzwxwttti415iomdd051<14507770ddgfiilolollliiic953||<_{~)!'';", +";'^[400eejllqmruquuxyzBAAABDADDAADwuuvvvvvuuvvvvvvvvvuxxxzDDBDEDDDDzxxvvrrrmmkkhhmmmmmptvvzzFFIMNOOMMIFDzzvvspstqqqwwwwABEEBAAxxxupoffiikccgc541_)'-;--;>=%%*=;'>>,/44_~!{390|<{>;=*,|lpofciuwutwzABGBxttuutp9<<39c90901_(_|3777590099cfilllooooolif953|<(~~)';;", +";'{[}0bbehjjnnquuuxxzzBDADDDAyDDxuvuuuvsvvvuuvvvvvvvvvxxxxADBDDDDDzxxsvrrrmmkkeeeeemmmmspwvzzFIKNNOMMIFFzzvvwstwwwwwuuyABEHBBAAxwtpooiiiliiiif997,,,>*%%&=;>>'{451~~/7mpi9|)>**>(9opkdfpwtutwyAEGAuppptuo5,!|7|/~|dqtpoc|!;->{3kppfciutttxwzAEBypooptug4{~_47007|_({(_1359000077670cfiiffffffffcc93|/),'", +"){{<}20beejnjjmqvuuzCCCDBBDAyxtvuuuvvrvvurrrrvvqsvvvvvuxxzzDDBDDyxxxvvrrmmkeeeebdddeeemmmptyyzEIFKMKKHFFEzzzyzwutttwxABEIIHEECywqlkllicfkmiiiigccc95|!<9ouodfotwwxxwyCEAwpommpqf|~/<3555|_{{!{<|35999d97243230995595555599995|/~", +"|||||60dejnnnmmmquuxzzzCDDAzxuvuuvrvvvvnnrqrrrvvssvvvvvxxxyDDDDzxxxvvrrhhmkeebbbbddddeeemmttyAEEHIIKLLHHFAzzzAyststwCEHJIJGCAzAwqqomloiffilkifgc9553|-*&&%%*-'~|3<~<3dlf09d9|~!!~|dpukciptwxxwwzCCywpmioppc|<_|1353_]~)){_|359cdd06||2122|3||||<||||459553", +"59999d9dfhjnnnqqquwwzzAAADzxuuuurvqqqqnnnnmrrrvvvsqvvvvxxxzzDDzxxxvuvrrhhheedbbbbbddddeeemmstzCEEFFLLLHFFCzCzAvvwvzCEHHHGECzzzzAwqomolifffkifdfd0743|;=%%*->!/4|~/<507||499|{!)(3mtpfdltwwxuwxzCAwtpiiopm91____471(~]))~/<159dgd967321|||<<<_((/(((<<|33", +"<39fiiiilljnnrqruuxxzxywyxxvvuuvsvrvnnnnnnnrrrrvvqqvvvvxxxxyDzxxxvvurrkhheeddbb88888dddeeemqxyBCCBDHHHHFFFCCzyxxyzBEHEGCEFBzzzvAwqomlilfc9dggddfd0333|-;'')<|/~/|4|7d03354<{~_5muukdiqutuutxyzwtpollqupf3", +"->)<|5clopttttppqvxuxwxuuvvvvqvqrornnnnnnnnnrrrvvvqqvvvsxxvvxxxxvvvqqmkkeeddd8886666888ddhjquuywywxDFEEFHFEzzzvABEHEBCCzCFFFBzzCAwqnkhb9aa3589575093|||||||||<<~~)',))/||~~|449mqf5573_/_4gtwpgflpututuxyxupomlqppoc|<<|75|/)'>>''''~_|0900765342||||<_/~~)),>;=", +"=>'~_25dioptwwvwuutuuuuuvvqqqrrnnjlnnnnkkhhknrrrvvvqvvvsxxxvvxxssvrrqmmkeedd888666666688dgjnuusstwxxDDEHHFDCzzzGEHHGCCzCHFFFFCCCAxqqkhab9644307||774_//<_|||3||///({{{/|4>'>'!{_3a9006332}<<<_<<<>-=", +"=>,](<|7cfiostywyxxwxxussqqqqnjnjjjjghhkkkkkkrqrqvvqvvvvsxxvvxxvsvrrmmmeeddd886666666668bggopwuqurvxzDEFEFDEAzCGHHHGCCBCFFFIFFBCzzwqjkhb88634704|4751~~~~~/<|33||<>')/:77657633|}__<(<<<-*", +"->,)/<|35bginpswwyzxxztvuvqqjjjjjjhhghhhkkhmmmrrrrqvvvvvsxxxvvvvvrrrmmmeedd8886666666666bbgmppummpvvxzACFDDDCCCGHGGCCzCFFFKFFHEECAwsnkie999535873|703_)),)))/_1333-", +"-'']/<|25dcfinnpttwxxzzxusvnnnjjjhhghgghkhhhmnrrqrrrvvvvvvuuxvvvvrrrmmmeedd886666666666a8bhmqpommhrvvzzzzzDFHHHGGCCzzCEFFFKKIFIIGEAwxtqijfd0539d73799|~),,,,),{_|53,'!{_|22322|4|__//{),,>>>>>-", +"*>'~_<|279cfijjoppqsxxzzwwsnnjjghgghhgghkkmnnnutpsurvvvvuvvuvvvvrrrmmmeeedd886666666666688ilomnjmmppvzzzzzAFIIIECzzzBEIIIFKMMMMNNMMKIBzytpolgccfd97905<~,'>,,>'')<||<<<|0iic00dfiikmtpi9900imuxwpfcgkmptqqqqupoi539iqppoikmmk9_{',',,',{:|42732|1<_(]{~),>-;*=&%", +"$*;)(<3359ffginnoporvuxwtupppohgghgghghhhkhjknrputttutttvvvvvvvrrrrmmmeeddd886666666666688ellmgjemmstwwvxzzBIIIHBACBEIIILMNOOOOOPOPPONIIHEAwtoillidcc93/~',>,,;;>>)/||<<3clkfgiif95cimoicddioptwtmfcfmppqooqqqold3|9fmppppmqmg9;;=&&$", +"#%=,)]<35cfffilnoonmnrsrrspppmmkkggggggghghkhkrrqtuutwwvvvvvvvvrrrmmmmeedd88666666666666aafiifhgehmmtwvvvzzCHIIHECEEIIFMNOOPPPPPPPQQOMIIIIEBAtooppliifd3<{'>,,,;--->)<1||5fliilol9459gmolmklmquxwulggippuqomqqoom91|0imqpppupof7|~~!)!]{][:}652641_(]]'>,>;==%$#", +"#%=;,]/|29cijlloonnqqqqnqnnojmmmmmkkgggkkjkjkhrrrusuwywvvvuvvvqrrrmmmmeedd886666666}}}}68bfihebddejmmsvvvyzCGHHFFFFFFKMNOOPQQQQQQPOOKEAzAAwttpiiloolilof5<~',,)''-*--)/|359fiiotpi9339fmppppommtwxtidfkoqqqmmmmomm0|40gmquttupi97|//~!!]]]:}473a71|:]]''>--=%%$#", +"#%=->!~_170dijlororoqrrnmjjjgkkmmommmmmlmnmmmkrqrrptwyywxvuvvurrrrmmmeeedd886666666}}}}28biih8b8dgjmmrprvAACGCHFFFFFKMNNOOQQQQQPPOMKEzAwuppligf9cfiiilptl9|/),)))'-**>)/|55cfiotwpf5459iptutqplqxwwqgdgmqqpmmmmlmmk5159imptuupmg77|<(({{{[_[}26672}:({]'>-*=%$$#", +"#%=;,!~::479hfioprrrpqqnnjhhhggkkmmqpppoomqqmrrrrrpvxwwvvwvvvrrrrkmmmeeeddb8666666}}}22268iiba68bggjmmrptzCCCzAFFIIKNNNNOPQQQQPONNMIHEAwtpoifiid9cgiilptpi9|(~~~/{,;;->)/|5cfikpxwofc09cmtttqqolqwwui9dfopppmmmkkmmc||5cgoqputqic5311<_((_:[1a5a731<]{{''>-*&$#@", +"@$=;>!]_<435dbgilnnrprrnjjihhggggklmpppqpqpprrpqrrsuvwtvvvvvrrrrqmmmmeeeddbb666666}}}2226bccc8666bggemmstwyBAzzEFKMNNNOOOPPPPPOONNNKIHBAxwtoooooliiopoppplc5||//<>-*&#@", +"$%==>'{/:4750cbginnnmnnniijggggggkkkklmqqutttrqprruvwutvvvvvrrrqmmmnmeeeddbbb666662}}226acc9666668egehmnwwyzyyzBFMMNNOOOOPPOOPPPOOONNMMKIHEEAywwwttttwtppof053|||33|{'')~/_3cillotutpommmuwtqptpqtxxumd9ckmpqqmligki91|7ddgkoppoi97733377742}2677a311_{!'>--*%$#", +"$%=>>'~~_4790bbgginnihnnjihhggggggggggkmmptttprprpsvvsvvvuvrrrrrmmmmmeeeddbbb6666622}22aacc862}6a8hbdemqquwwvyzCIMMMNOPOPOOPQQQQQQPPOONMMKMKIHHEEAwtwyxtppl0533|3553|////(<<3flloptwwtpquwzxppuuttxwxqf90dkpqqmmkgggd7<|0dgglmolic077|335066aa65723|1<({)'>-*%$#", +"$==>,')]_1359dddfhjjkhjhhjgggkgggggggggkmqqtttttprxuvvvvvvrrqrrmmmmmeedddb888a6222}2}}}26cc662}2688bdgjquuwtsyCGIKMNOOOOOOPPQRQQQQQPOONMKIKKIIIIIIEAABAywwtl53||3|33|<<<||''{/_1457bhbggijikhjejdfgkgggggkkkgkkmpprtstswvvvuvvvrrrrqqmmmmeeggbb888222}}}[[[[}26bc62}[22866bgjnuuqstzBJHKNOOONOPPPQQQQQQQQQPOONKIIIIIIIKIIIHHHEAAAyo9333<;;=%&", +"&*--']~(_1375abcfikjhhejefddgggggkkmkkkkkrrnrrrwwwvwxvvvrrrrrrkkkmeeddb88aa2}}}}}}_____16b96}}}}22666bkoouqmsyEEHKNOOOOPPPPQQQQQPQQQQOONMKIIIHKMKKKKKKKIHEEEAtig9|/{~<|353>==&&", +"%*-;,)](<1357acdgfinhjhjgfddddggggkkkkkkkmooopstxwxyywxrrrrqqmkkkeeddb888222}}___(((((([79562[[}2226aekmooqquABEIKOOOOPPPPPPQQQQPPQQPOONKIHEEEHIKMKMMKKMKIIIIEypi5-*&$", +"$%->,)(/1|350ddcgfinjjnnfgddddddddggkkkkoonnnssvvwvyywtttpprmmmmeedbb88a2222__(({^^^!^^(|774_[[}}2}28bimonqquAAEIMNNOPPPPOPQQQQQPPPPPONKIIEBAAAAEIIIIIKKMKKKKIEApg5|/~{_|7974|<19gltyAyplltEEEHHHGEzyxywqc3379mqqqmmg05731147dcgfcc03790d05a7888ab07241_{~,;;*%$", +"&&->,{(_11550cbbgfgjhnnqiigddddd0ddggkkooonovsvvuvvvttutttsmmmmmeeddb6622}}___^^^^^^^^^[}32|(_[}}}}26bflmniuwxAEKKMNOPPOOPQQQQQQQPPPOOMMIEAzwtppwwwtyEHIKKKKKMKHBpic3({!(<7907770diowBBwoipyHIIHHHHEzzyxum0445cmqqqmkd033113500diiic5750d998008a8aa722*&&", +"%=-'']{_|450acbggghjhjlmllgggddd0dddggmonmnrvsssttvsussttqmmmmmghggb882}}}_((^^^''''''!]12}:{{_:}}}26bfimklpxwBIKKKOOOOOPQQQQQQPPPPONMKIHEAwwttpplikipwEHIKKKMMKIEwoc|(!!{_7999ccfiipAAypootBIIHHHHECAyzwug7345gqqqqmk0744|43570diif97570dcdcdc8bac0522_({!'>-*%", +"%=;'!{{_<159abcggiijhhfiiilggdddddddgiljnlqvrsstusrsspummqmqqmmjegbb886}}_(^^]!!''','''{<||]^!(::_[269eeikmpwxBIKKMNNNOPQQQQPQPPPPPOOMIIEBEyywwtpogc9flpwEIIIKKMMIEwl93/{)~<59cfilllowAwpoopwEIIIJHGEBAAAxqd3439mqqpqmg74414409779cfcc090dhcfegbb0a857}}({{'';*%", +"==;'!{{_<1789cfggggjhhggfiigggddddddikiljnrqrsvvrrrusmmmmmmmqqmjggb88622_(^^{'','''''''{_|_{]^^(:__26c9fimqtpzEIHKMMMNOPQQQPPPPPPPPOONKIIHEAzywppolf09ccflyEIIKKKKHApi93<{{/<39ciopptyAAtollpwEHIHHEEAAAzAum0775cmqqqqld741347007359dgddddd9figgbbb8a53}:({!';;=", +";;''!{(_12a8a9ggiijjhgggfggigggdddgiilkinmmqvvsrrqrmmmmmmmmmmmjjggb88621_^^{!''';>;;>;'!<_/]'^^((__<69cfciqptBHIIKKIMNOPQPPPPPPPQPPPONMHHEAyxwttpllfd99999iwBHIKKIIEwplf92:::269ciptwAABypiiopwEHHHHECAAzAzumc075iqqqqpkc743479093379fffidbdhejkjhhbaa7|[[{]'';;", +";;'!{(__22669dgggfjhhgggggffddddggkkmlnmnmmrrrnrqrmmmmmmmmmmmmjjgea8622_(^^!'';;--;;--,)<<('''^]({(1688chnqqwBHEIKIIMOPPPPPPPPPQQPPONKFCCAuwttppollicdccdcfmtyEHIIIEAtpoic5}:}268clpwyABAukfiopwEEHJJECzAzAzukd57dmqqqqqm0333570d07359fgighgbejkkjehbaa74[[(!';;", +";''{([[}2260cdfggjjhjgggffgfgfhhhiilloqnnnrrvnnokkmmmqmqmmmmmmjkkebba21_^]!!'''--===*;>)/,]<~';'){{!{[3389cnnqAEHHIHHMNONNOPPPPPQQQOOONLFCzvsmjghbffccfffffilloptwyHIKIHBAyytof05770dfluyABApkgiptwyAEHIHCAzzAzwoddddkoqqqumgd90070dc0570dcimmkjjjjkmnjha884}[^^^!", +"!^^^:<13779cdgiheeehhggggffdhheijjjnrrqrvrrrnnhhkkmejnrprppqppqqmkidaa4[:{''';;--=&&&=;,/<~>;''!^^^_|388fllpAEEIEEIMOONMOPPPPPQQQPOOOLIFzvsmedgbab989cfiifiilptwwAEKMKIEBAAwoi9550dfimwAEEyqiiotwAAAEHIHEAyAAwtlcddgmppquumkcd999dggd00dggomnmjjjkmmjjjb864<_^^!", +"{((_|17790cfhhghheeheeehjjeheeheihjnonmrqppnnhkkkejjorpspppppppqoikfb05}_/!,>;--==%%%%;'{<{>;''!!^^:<158cfltBEHIGEKNNMMMNOPPPQPQQPPOOLHEzvsmmedb886868cfffiiilptwyAHKMMKHEAwtplfbbcffiqwBHEytppptyAAAEHHHBAAzzwuifgilqqquuupigd9dddgggddhhomqpnknkmmmljeb8621(({", +"(__14479acefffhhfeehhhehhheehhehjjnnnmmqrrorkhkhhhjnqqqqppprpppmokjgcd06|<~!,--=%%%%$%*>{/);-;,''^^[:159cfltBEEHBHMNMIKMNNOPQPPQQPPONLHFzvssmed8a662a689bccfiilptyABIKMNMIBywwtpibdfiiipyEKEAwpppwAAzAEHHGBAAAzwuiiilopuuuuupkcddcdgggggjkmmmqnnnnmmmmnjea662__(", +"[}2266a8cbffffhhhehhghehehehhhhjhjnnnmmnqnnhmmmjjknmqqmmmmpprppmmijcc0763|<~,>=*%%%&&%*>)()-->'''!^[[:40cciwBEEECINNKHIKNNOOPPPQQPPPNLLFzzvsmeeda666268b988fiiilpwyAEKMMMKHByyywplfffiiowAEIHBwpopyAAyAEEHGAAAACytolmmpuxtxxtuidddgggggjjloomnqnnnmmmmmjefa622}[", +"[}22a6abcfffffhhheehhghhhehhehjjjhmnqnnnjnkhkjjkmmooollllmmnnlnmifea90221||<~'>*%&&&&&&-)~'-=-''''{:::40c9iyEEByBIMMHGIKMMOOPPPQQPPPNMLHCzvsmmedbb66886a9668fppptwyAEIMMNNMIEAAytplifiilowAEHHBwttyAAyyAEEHBAAACBzwqlmqxxxwxxxpkgggiggkkgilljmmloommmnmmjhbba6}[", +"}226a89bhffhffheeeehhhheeehhhjjjjnnrrmmmlnhheegklpolijhhjjkkknnkhhh8a3}1___(/{,>*&&&&&&-)~'-=;''''{_:1250clABEAwEKKKEGIKKLOOPPQQRQPPOMLFFzvsmmeddb6668abbbadiptwwyAABHKMMNNMIEAwtpoiiiijiptyEHHEAyAAAyyyAEHECAyABBAyuqquxzyxxzxumkkkijkkkjjjkkmjnommmmmmmhbbba2}", +"688bbhfjieffhffeeehhhhheeehehjjjjhmmmnrlnhhbhdbiiolliieeehhkkkjkeb666|[_(({{~{~,>-&$$&&;)~!=*-'''){(_}250coyAAzyHKIIEGFFKMOOPPQQRQQPONLIFzvssmeedbb6666a88bciopwyAAABEKNNNNNNKBytpillllifipwAEEEEEBAAywwyAEHHAAzABCAxpmpxAAzAzzxxqmmkjjkkkjjjhmmnnpmmnmmmmhha886", +"688bbbejiffefhheeejhhhhhhhheehhjjmmqmrnnghhbdbbhiiffc9ahbbbeegggeb6661[{{!)!)!)),'-%$$&;)~);*=-;''{/(}437cpyAAwAIIIIEGGIILNOOPQRRQQPONLIEzvssmmhddbbb666889jloopwyyAABIMNNNNONKEypoiopoiffipwyABEHEEAwtwwABGIHAAAzCCzwuquyzACzAzzxuqnmmllljnhhkmhnrmmmmmmmkkeb86", +"8bbehhfhifhehfehehhfhhhhhehhhhhhhmqqmmnnhhba88bebcbd8aaa8bbbeghgebb62_[{!'''>,,,',>-*&%-'~);*=>''')//_227cpwywwBKIEHEGGFILNOOPQRRQQPONLHFzvvsmmeeddb88bbbbhimmmmqttyAABHMNNNOONKEypplptoiffotwAAAABBAwttwABEIIGBAAAzzzxtwwyACAzzzAyuqpqoonkjkkhmjnnmmmmmmmkkggb8", +"dgggechfjihfhgeehehhhhhheehhjhhmmrqmnjjhhba888bc9098aa66aa8bbhkgebb62_^{!',>;--->>,,-**;'~);-;;'''!((<227ftwtttBKHEEEGEIILNOOPQRRQQPONKIFzzvummhjgdddbbbbhgkmmkjnpptwyyyEMNNNOONMEytppttpigjowyyyyAAywtptyBEEIIHEBBAAAzAyyAABAAAzzzzxtppppmmnmmqqnnnmmmmmmkkjggd", +"dgggejeehihfhhheeehehhhhhhhjhhmmnmqnnjhgba8aa8aa8aa4316666a8cbekhba62[^{!'';;**==;>>>>->,~)>-;>'''!~/<126fpwttwEIEEEEGHIIMNOOPQRRQQPOOLIFBCAwwqqjjgggdddddgknnijjqptwwwuwBKMNNOONKHBwwwwwoifotwwwwwwwttttwABEEIKIEEBAAAAAzBBBCCzzzAAAytppmqqqqqqqnnnmmmmmmkkjjje", +"ehggejeejhhhfeheeeghhhhehhhhhhmmmmmnjjgb0a68a8a86531_111266aabbheba62}^{!'>;-=%%&%*->>,'~/~'-->'''!{(<<26ittppwEHEEHEGGFILNOOPQRRQQPOOMKKHCByyuuornkkgggddfjnjmmmqpttwwwuxAHKMNNONMIEBABAwolmptAAAwttpttttyAEEHKKIHEBBBAAACCEGGEECAAAAwttpqpqqononnnonmmmkkkjjje", +"ehggejhehihhfefhehhhhhhhhhhhhjmmmmmnjhgb086266873}[[:[__112aa8bhebb861^^!'>;-=*&&&%%=>,)/,''!{((|39ittptwHHEEHECEFIMNOOPQRRQQQPONMKECAwyuuuppprmmnjjhjqqnmmqupwwwywtuABIKMNONMKIHEBAtolnpyAAwwtppttptyBBEHKKIHEEEBAAABEEHIIEECBAywuuptuprprnnnrmmmmkknjjje", +"dggghhbhehieffehehehhhhhhhhhjhkhhnnljhba8662aa53}:[]^^^^__12aa8bbhbaa1_^{!';-=*%&&$$%=;)(||)>;>'''!{(/|39iptppAIEAyBEGIFILNOOPQRRRQQPONKFCzzwwuuqnnnnnooonqqqqmmmmqppttwAwutyAEIMNNNMKKIEBAtoopyABAwtpooppptyABEHIIIEEEBAAAAEHIIKIHEEAAAxutuptttpprnrnmmmkknjjje", +"dgbebbbhhehheheechhhhhhhhhhhkhkhhjnjhhba6622634}[:^]^^^^^(_12288bhba64_[{!'>-=*%&&&$$%*'~|3(,>>'''!{{(<39lppppAIEwxAEGIIILOOOPQRRRQQPOLIFCzyzwyqqqjjjjnnouuquqtmmmqloppwxAyttwABHMNNMIHHEEByppptAAAywtpooppptwAEEHIIGEBAyAABEHIKKIIHEBEBywwttttttuqmmmmmmmknjjgd", +"8b88bbbhaabbbbcbbhhhdhhhhhhhhhhjjhjjhba8662244}[[{!]!]{^^^(_1228bbbaa41[{!';-=*%&$&##$&=,<3<~,,'''){((<49lppopAHAwxAEGIIILOOOPQRRRQQOOLIFFzyAyyqqmmmmmmmqquuyywqmmqnlotwwyywttwABIKMMIBABEEBwpoptyABAytpnoppptwBHHIIIEBAyyAEEHIKIIIIIEEAAAAwtttutuqqpqqmmmkkgggd", +"668aa888aaa8bbbbbdddddddddddgghkjkjggb8662224}[[]]!!!!!!{^^(_122abba64|[{!'>-=%%$&&###&&>~|_/))!''!~((<39lpploAEAtxABGIIIMOOOPQRRRQPOOLLFFzzzwwqrnmmmmmmmmqtwyyuqqqqnpwyxyAyvtwABBEIKKHAAAAEAwpoppyABAytppoppptAEIIIKIHCAyyBEIIIKIIIIHHEECAywttutuqquupqqmmkkbb8", +"66a6aaaaaa880999dc9000aa0dddggggghhh8a862}221[[({,,',,'!!{]^__222ab8631:{!'>-=%%$&&###$%*)/~/~{/(~'){(_|5coppooAAwtxyCCEIKMNOPQRRQQPPOOLMKKIIEEBBAuxxupqmtpppwuwwuttwywyyAAAAAAywwAEEHKKIAwtwyywpomotABEAwppppttwyEIKMMMMIHEAABEEEEHIKKKIIHEBAzwtttppqljjjiiihba8", +"6222264434244226aaaaaaaaaaaaaaabddda066}}2}:::(]'''>;''','!^^(_}22aa6|1:{!',>-*%%$&###$&&>){)'~(/{~~(_|5coppooAywtxyCCCIKMNOPQRRQQPPOOONMMKIEEAAAAzywuwttpqwvwttquwyABywyyyAABAwwyEEEIKKIytptttppoopxAAAAtpmpptwAABHKMNNMKIEBABEBGHHHIHIHEEEEBAyvwpponijjiffefb6", +"6626|14111}}}}222644477770aaaaab800a722}2}_[_<]!'>>>;;>''''!^^(_}26a24_[{!',>=*%&&$####$&-){)',{/((((/|5copplpwwptxuyABFKMOOPQQQQQQQQOPOMMLHHEEAAABBAAyywtxwvxptmqtyBEAwuttwAEEBwwBEHHIKKHytppopppopuwAAAytpoptwyyABHKMOONMKIEBBEEHHEEEEEEBBEEEBAywtppllijgeb888", +"26434||::[}}}1|11111444377770008aa67a2}[}[[[:({'';;;;;;;;','^^^[}}2221:[{]!'--*%&&$$###$&=,)'->){{(___|3coppopttpsxuyABFIMOPQQQQQQQQPPPONNMKKIIIEEEEBAAyyAAywwqttmqwAEEypolptwEEBAAEHHIKKKHAtppopporpuwzAAypprtwwwyAEHKMNOONMIHEEEHEBBAABAAABBEEEBAwwtpniec86622", +"2|3||}}}}____<|:_1111}42277700067a622}}[_[:_:(!''-;;=-;;;;''!]^(_}2221_[{{''-=*%&&$$$##$&=>),>>''!(_11|39oppoptpoqxuyzzFIMOPQQQQQQQPPPPOPOOOOOONMKKIHEBEBBACywpttmmuzEEyplfilpwBHEBBEIIKMMMIBwtptrpopqtwABzwsqppwwwyAEHKNOOONMMKHEEEBAzAAyyAAAABEEBBAtpoljca662}", +"_((:[}21<:<((_______11144777776777a2}}[[[^[([{!,---===-;;;;''^^^[}2}21^[{!''-=*&%&$$$$#$$%>),>;>''!_34350ltppoppoqxuyzzFIMNPQRRRRRQQQPQPQQQQQQPPPOOONNKIEEBCAAytttqqwBBAtofcffowEHHEEHKKMNNMKEywttppputwAEEAyuqutwtwyEEIMNOOONNNKHEEEEAAAyyxywyyAEEEAywtolfc862<", +"_(^^[_<|<<___(((__::[1}1227777767342}[[[^][(({'>;;===**=;;;''^^^__}}}_^{!!,;>;*%&$$$$$$#&%-,)>;>'''{1459dotpppppppxuyAzFKNOQQRRRRRRQQQQQQQQQQPPPOOOPPOOMKIECCAAwwwwtwAAAwpjiccfltBHHBEIKMMNNNKEAwwtptuwwCEEBAwtuutwtwAEKMNOOOONMKKIHHHEEBAAwxwttwAAAAAywtpoib531", +"::^(]{{/___<<__///____<1}}244734733}}[[(^^((^{'>-=====*=;;;;''^^][}}}[^{!'';;**&%$$$$$$#&%-,),;;'''!_|59iptpppttpuxuyAzFKNOQQRRRRRRRRRRRRQQPONMMKMMNNNNOONKHEAABAAAyyBAAwtpoifffltAEEAEIKMNNNMIBywtptwwwABEHHEzwvwyywyEKMNOOOONMMKKKIIHEHEEAAwtttwtwwwyyywtpic53", +"|}_/(~{{{{(/<<<<((((__<:1}}24421144}1[^(^^]{]!,;===%=====;;;''^^{_}}}_^!!''>;**%%$$$####&&*,{);>,''!(_|9ipwtpptttttuyAzFKOOQQQQRRRRRRSSRQQONMIGGGEHIIIKMNONMIEEEBBBAAEBAwtptpliffltAEBBEKMNNNMKEAwwtstwwyACEHHEAyAABBBBIKMMNNOONNMMMMKIIIIIHEBAwwtppppttwywtpic5", +"95|<_((~~)~~((_<<<(/<_<<<:111|}1}12|:[[{^^{({!';==*%%==*=;;;;'!^{[}}__^!''>-=**&%$$######&=>~)>>'''!{<|5ipywppttswtuyAzHFOOQQPQQRRRRSRRQQPNKIHBCCCCGGGHIKNOOMKHEEEEEBEEAtppttpoifiipAEEBEKNNNNKHAwywwwttxAEHIKHEEBEEEHEIMNNNNNOONNNNNNKKKKKMKKHEBytpooooptttpoif", +"lf933|__~~~~~~/))>>''''~/<3coyytptttwwuwzzFKOOPPPPQRRSSRRQPPONMKFFBCCCCCCGGIKNNNNMKIIIIHHHEAtptwwwplifipAEBBEKNNNMIBwyyyzutuyABEIIHHHEEEHIIMNONNNNOONONNONNNMNNONNMKIBytollilopppoo", +"plif953|<<<'!^{[[[^^!',;-=%&&$$$######&&-)),;;''')(<|9lwAwtwwwywxyAzFLOOPPPPQQRSRRQQPOOOMMKKHEGGGGGGEHKKMMNOONNMKKIIIEwpwAEEAwoiiltBEEEIKMNNKEAAwAAwtuyyEEHHIHHEEEHHIMNOOONNNNNNNNNOOOOOOOONONNMHBwpiffiilopp", +"iillifc53||'!!^[[^^{''>;-*%&&$$########&*,));>'''!(/19ftyywAywywxyACIKMOPOOOPQRRRQQPOOOOONNMMKIKIIIHHIILKKMOPPPOMKIIIIBwyBHEBAwpllpyEHHHIKMNMKEAyyyxtwyABEEEHHEEEHEHIMNOONNNNMMMMMMNNOQQPONMMNONKIBwoic9cffii", +"59ciiiic953|/~)))))~{/<<<<<_<__](:::]]!!!!(_:{';**%%%%%&%==;;>'!!^{^^^''>;-=*%&$$#########&&>))'>'''!((|6cpwwwBAAAwxyACFKMONNNOPQRRQQPOOOOOOOOOOOOONNMKKIKIIKKNOPQPOMIEIMIBBEEBBEBAtppyEIKIIKMNNNKEAAAyyzAABEBEEEEEEEHIKKMNNNNNNMMMMMKMKNOPQPNMKKMMKKHBtlf633333", +"(<|59fffc953<~))!!!!!!{((<|<<(_(:::(]^!'!'{(:~'--**%%%%&&%=;;>'!!^^^^^'';;-=%&%$########$#$&-)~'>,''!(_}29ottwABBByxyCGFKNONNOPQRRRQPPOOPPPQQQQQQQQPPOONMKKKKMMMNPPPOKIIMMHEEEEIKIHBwtyEIMMKIKNOONMEBAyyAAyACCCBEEEEGEHIKMMNNMMMNNNNMKKKIMNOOONMKIIKKIEAtlc6}/~~", +"')~/|599c9953!!{^{^^'';=*=%&&$#########$&&*)),;'',!//}29ltttyBHHAxyCGKKNONMOPQRRQQPOOOPQQRRQQQQQQQQPOOONNMMMMKKNOPOMIHIIHEEEHIKIIIEBBBHMMMIIMOPPONHBAyABABACzzEEEEEHEHKMMMMNMNOOOONNKKIKKMNNNONMKKIHEBAwof9<~)", +"',,))/|3599995|!!{^!!!';-=*%%&$$#########$&&*,))>''')~_}29lttpwBIIByACHKLNNNOOPQQQQOOOPQQQRRRQQQQQQQQQPPOPOOONNMKKMNNOMHEHHEEEEHEBEHIIIEHKNNMIKNOQQPNHBABEEHEEBCBEEEEHHIKMMNNNNNPPPPOOMMKIKIIIKNNNNMIEAAABAti9<{", +"/~))!)~(<|59cc953|;;*&%$&$##########$$%*>))'>''){_}29ltwtwAEHBAAEGKKNNNOOOPQQONNNOQQRRQQQQQQQQQQQQQPPPPPOONMKIIKMMKHEHHEHHEAwwAHKMKKKNOOMKMOPPPONIEHHIIKIIHEEEEHIIKMNOOOOPPPPPPPOONNMMKEEEIIIMMKIBwwABByo9|", +"5|/~~~!)~/|59ccc93|''!!!!!!';;=*&%$$#####@##@@@$$&%>)~'>'')![:}5iwwtwyEEBABEJKLMNNNNNOPPNKKMOPQQQQQQQQPPPQQQPQQQQQPPOONKHEHHIMKIHEEHIHBwwAEKNNOOOOONKKMOPPPPOKKIKMNMKKIIHEHHIKMOOPPPPPPPPPPPPOOONMIEBAAAEEIKIAtptAAwpf", +"l9|/~~!)))~<39ccc953|'']]!!!!';;=*&$$##@####@#@##@#&&-,~)'''!{::}0itywwwBBAzAEIKKKNNMKLNONKKKNOPQQQQQQQQPPOOOOOOOPQQPPOONKHBBABIKKIHHHIIIEBBEKMNOOOOONMIINOPQQQPOKKNNONNMKKIIIIKNOOOOOOOONONOPPPOONMKHBywtwAAEEAwppptwyw", +"wo9|/~)),,,)~<39ccc995|->,~<|59ccc53|-**%%%%&%%=;;;'!!]^!'';-*&%$$#@###@@@@@@@@#$&%>~{)'''!]::4dpwwwwBEAzAEHKIIKKHEIMNKECGINPOOPQQPPPPPNNMMNNOOOOOOOONMKEBBBEEIKMMKKMNMKBAAEIMNMMKKKIEEHMNOOPPPPPQQQQQQPPOONNNNNNNNNNNNNNMMNNNNNNNNKIEAwttppptyAAwpll", +"ciolc3<~),,-;=-,)/|5999953|<<<<(]~]]/_/^''''!)'>---***&%%===;;''!!!',;;-*=*&%$###@@+@@@@#@#$$%;)~~'''!^[:39ltwwwBHBAyBGIHIKIEEIMNKHEHMNPOOPQQPOONOOOMMMNNOOOOOONNNMKHHEHIIKMNMMKKIEwpptAEIKMKKKKKEBHKNOOOOPPPQQQRRRQQPOONNNNNMNNNNNNNMMMMMNNMMMKHEBwtolootwBEApf", +"iilifc9|~)',-==;-,)<3599953|<<<_/~]{]//]!)!!)]'-*********=*;;;,',!'';;;=*&%&$$####@@@@#####$$%='~~!'']^^|39ipwwwBHEAACGGGHKIEEEKMIEIKNOOOOPQPONMMNOONNNNNOOOOOOOONNNKKIIKMMMNNMIEAwpliotwAHKKKKKMKEEIMOOOOOPPPPQQQRRQQPPOONNONNNNNNMNNMKMMMKMKKKIHEBAwpooptAHIEt", +"HApf9cc9|(~)>-**=*>,~<3599971|<<)/{!!!^]|39ipwywAHHBACCCAEKIBAEIMKIHINOOOOPPONMMMMNNNNNNNOOOPPOOOOOOONMMMMMMMMMIEytpliklopwEIIIIKKKKKNOOPOOOOOOPPPPQQQQQQPPPOONONNNNNONMKKKKIKIKIIIHEEAAwptyEKMK", +"POEl539c93;==**->)~|359953||<]]]](/!!'!)~~)'-*%%%%&*=;;;;'!]!'';;=*%$$###@@@@+@@@##$$$%%&**;~--****->)/|559553|//]](/{!'',)~),-**%%&%&%*=;''!]]'',;-*%&###@+++++++++@###%&%**;)<<_/([:|79fowAyAEHEBBBAwAEHzAEKNKEABKMNMIKIIIKMKMMMMMMNNNNOPPPONNNNONONMMKKEEIKMKHwploollopwEHHHHHHIKMNOOONNNNOOONNNNNNOOOOPPQQQPPPOPOOONMKIHEHEEEHHIIIIIHHEEBI", +"EKONEpf5|3599|~,>-****->,~<359905|<]{(/]!'''))!'-**%%&&%===-;',!'''';-=*&$#@@++++++++++@##$$%%*;,(<_//::179flwBAAEIHEAAyyAEBAAGMOMEABHNNIHEGGHEHKKKKMKKMNNOOOOPONNNNOOONMMKIEBEIKMKEwpttppootAEHIIIHHHIKKKMMKMMNNONNMMNNNNOOOPQQQQQQPQPPOONNMKKHEEBEEEHHHHHEEAAA", +"yBKNNHwi5||5cc5<),>----->,)<|599933<(//]{''')!)'>*%%&&**==;;>'''''>;;-=&%$$#@@@++++++++@@@##$%%=-)<_(~:[_|5cipwAABHIBBAyyxzzyzAINKAwAEKKHAzCBGCCEIKMKMKMMNNOOOOONNNNNNNNMKIHEBBEIKMKEywwwwtppwAIIIIHEEEEEEEHEEEIKMMMNNONOOOPPPPPPQQQQQQQQQQPONMIIEEBBEEBEAAAAywy", +"ABEHKMHwi5<|3cfc3/),>>>>>>,~<|599993<',)),>-=*&&%%==;;;','';;;=*%&$#$#@@#@@@++@+@#@@##$%%=-,/_({]^_|38cltyyzEIBxuuuuyzrrwEKIAwwAIIEAzABCzzCHIKMNNMMNOOOOOONNNNMMMNMKIHHEEBEIKMKBywwywtttwEIKIHBAAAAAAAAABBEIKKMNNOOOOPPPPQPQQQQQQQRRRRQPONKKIHEEEBBAABAywy", +"IKIEEKNKAo9|<|9ff5<~,,>>>>,)~/|599953||<],'>>,),,>--***%*==;-''';;;;=%$$###@+@@+++@@@###$#&&%%==-,{_>>>,,)(|3599555|:),';',,,>>>;>---;;>;'''>;;=%&$$##@@++++++@@@@###$%==-->>)/11_::_1379fpyyAzEBtpruuttqmuAEHByyAHHBAAAyCEEGHIKMNOPPPOOOOOOOOOOMKIIIKKKKIIKKKKMNNKEwppttoptyEIIIEAywyyAABBEBBBEHKMNOOPQQQQQQQQRRRRRRRSSSSRQQQQQOOOOPOOPQPPO", +"QQOHAEOPPOKAti99fopi9|/~)),,!!~<|3555953|~,,>,,,>--->>>,;>>>'','>-==%&$$##@@++++@@@+++@###$&&*;>')(|33}::|35cfoyyAAAAtpprpttqqpyEEByAEHIAyxAAAHEEGGHKMNOPQPPOOOPPPPONMKHHIIKKKMMMKKKMMMIypoopoolotBEHHEAwtwwAAABBBEBEIKMNOOPPQPPPQQRRRRRRSSSSSRRRRRRQQQQQQQQQRRQ", +"QPOIBEIOPPOKBwl9cflppi9|,,,>****->,,,,,'!!,;;;=%$$#@#@++++@##@+@++@##$&%*;-;,{<|72[[||59clwAAzAzwqqmpqtpnpwABAwyEIIAxuyABEBEEHIKKMNPQQQQPPPPPPOOONIIEEIIKKMKKKIIKKKEtllloliiotABEEBwtptwyyAABEHHHIIKMNOOOPPPQQRRRRRRSSSSSSSRRRRRRRRQRRRRRRQ", +"QQQOMHHIOQQOHAti999iptoc5|<<<<||||33599995|/)))),>****->,,,){]]!'>;=&$$##@+++++@#@@+++@###%*->',,)/_3952}|159cityAAAywrqqqutpootyBAwwBKKEwxwzEEEEIIIHKMNOOPQQQQQQPPPPONKHAyABHIIIIIIHHIKIApolooolopwABEBAtpptwwwwyEKKIIKKMNNOOOOPQQQQQRRRSSSSSSSSRRRRRRRRRSSSSSR", +"RRRQQPNNOQQQMBwti955fotof5|<<<<||<|||355c95|>-;;;'',))]]{),;-*%$###@++++++++++++##$%-,~)){/|35fc94335bcipyAAAytppppwwtrotyBEAyAIMIBwAzAyEEEEECEIKMOPPPQQQQPPOOONKEAwtwyAEHIKKIHHIKIAtoopoooptyBEBAywttttttwAHIKKMMNNNNNNOOOPQQQQQRRRSSSSSSSSRSSRRSSSSSSSS", +"SRRQQQQQQQRQOHAAwof99fptpi93<<<<|<<<<1||555||<>>>'')!{{]))),>>-=$##@++++......+++@$&=>!)~/<|35ff953799fiowABBAwtpppwytpptyABAwyBIIByAAyzAEAyAABEIKNNOOPQQQPPPOOMKEBytttwyBIIKKIIIIIHAtpooooopwBEEBAwtttppopwyBEIKMNNNNMMMMNOOOOPPQQQRRSSSSSSSSSSSSSSSSSSS", +"SRQPOQQQQQQONEwAEyof99fpwwof53||11<,>'',){]])'',,'>-*=*%###@++....++++#$&*->,)/(_|5cc52459fiopyAAywtppptwwppptyBAwwAEEAAywyAzyywAACzEFKMOOPQQQQPPPPNMHBAwwwwwwBHIKKIIIIHEAtpooollpwAEEByttpolloptyABEIKMMMMMMMMNNNNNNOPPQQQQQRRRRRRRSSSSSSSSS", +"RQPOKMNPQPOIyoipBBti933cowwpf95|33||<(/~/<|||<<<;',,)!{]),',>--;*=**%%%$##@@+++@@+#$$$&*;;,'!/|7952|70filpwBBAAwpoptwwtoptwBAwwABEBzyyyBAwuyyzyzAEKMMOPQQQQQQPPNKIBBAwtppptAEHIKIHHHEBypoopoilptABBAwpolffilptwyAABHIIKKKKMMMNMMMMNOOPPPPQPPPPPQRRRSRRRRR", +"PPPOMKKMNNKAoc9iyHyi5<<|5fpplc53333|<(~))~/<<<<|||/),',''''',){)''>--*=%%%%$%%%%$$########$$%&*=;;''!{122}:457filtABBBAtolowwoopptyAwtyABBAxzBEAzxwywyzzFKMNOPQQQQPPPOMIHAAywpoiilptBHIHHEEEBAtppttoiiopwAAytpliffilptwyyABEHIIIIMNNMNNMMNNOOOOOPOOOOOOPPQQQQQQQ", +"QQPONMMMNNMIAoioAIAi9|/~/|9ili933||<<~)>;'))~~/<|||/)),,,'',,,,'',>-*&%%$####$$$$$$$$%$$%%&***---;'!!!{13}[_1|85cipwAywpiijopollopwAwttyBEBAzAEAwxxuwwzBEKMNOOPPQQPPPOMIHAAwupokiilptAEHHEEEEBAwtwwtoiiloptwwtplifdgioptwyBEEHHIIMMNNNNOOOOOOOOOOOOOONNNNOOOPPQQ", +"RQQPOMKMNNNNNHAwAAti93/~~~<9iiic53|>,)~/<;*&$$$##@@@@@@@@#$$$$*=*->->,''!!{){<43:^_1|439iptppifccgiifiiopwwtptyABwtwzywtwuqwAAEKKNMOOPPPPPPONMIEAyutpolllootAHHHHHHEEBAAAytpliiilptttplifdfilotwABEEEHIKMMNOPPQPPOOOOOOOOONONMMMMKNOPQ", +"PQQQOMIKMKIKNNHApof993**%**=->)////)),>;;;;>>';;>-*&%$##@+@@@++++@@@##$%*->>,)~{//~(/<|52:<<__|29looli9589cfccfilpwpootyAtppwxptpuqwxABEIKMOOPPQPPPOOMKICAywtqpppppptBIKIIIIIIHEBAwtpoiiilptwtpolifiilmpwABEEHIKKKMNPQQQQPPPPPOONMMMMMMMNMKKMO", +"MNOPPONMMHBBEHEypf953|||/~))/5iolc5|/~)>**%%*&*->)///~),>>-;;;>>;;--*&&$###@+++++++++++##$$%*->,'{{////||5832}:}269ioolic977cc99cfiottllpwAtlltpqqpoqqwAyzEIKMNOOPPPOONMKKEBywttqpppoppwEIIHEHIIIIEAwwwtplilotwAAywwtppoopwyBEHHIHKKKMOQQQQPQQQQQPONMMMKMNNNNKIK", +"MMMNOOOOOKEAyyAwtof5|<<|3<),~<9lpi9|-*%%*&%*-,~//~~),,>>;;;>;;*=%%&$##@+++++++++++@###$&&*-;''''!!~~_|593321359fptpoic90dcfcfiiowwpoopAwpopplmmlqqwuxzBFKKMNOPOOOONKKKHEyttpppooolotwBEEBBEEHHEBwtttpoiilowAEEEEAAyyyyABEHIIKKIIKKNPRQQPPQRRRRQQONMKKMMNNMMM", +"NNMKKKNOOONKEAwtttpi93|353/))/3cilf5|<~,-=*%%&%&*-,~///~)),,>;;;;;-*%%%$##@@+++++.++++@@##$&*=-;'';''''')/|3|<<<<|39ipppoic9cfifillpwAwpotwywtpolikinuuwxzAEIKNNOOOOOONKKIEBytuoolololooptwBBAABBBAAwpllllifcflpwyAAAAABBABEEIIKMMMMKMNPQRQQPQQRSSSSRQPONNMMNMMM", +"MMMIIEEHINOPPNHyttwwpi9995|///|39ilf5|/)-*%%*%$$$%-,~~~)~)),,>>;;;-*%%%%$#@@@++++...++@###$&%=*;;;;;;;''''/<<~~!){/|5ioolifc9cffiilpyEBwttyEEywpiikgjquwtxzFIKMNOOONONMKHEBAytplkilllollloptyAywwwywwtoifiif999cilptttttwwwAABEIIKKMKKNOQQRQQQQRSSSSSSSRQPPONKKK", +"KKIHHHBBABIMOPOIBAABAwoc53|<<<<|39ilc3<~,*%%%%$###%*,,)))))),'>--;-*=%&%%$$#@@+++++++@@###&%%*;;;;;;;;;;;')/({''''!{_5fifc95599ccciltAEAwtwEIHAyoiigjiqqtwzDEKKMMONNNNKIEBAxwtqplkllllliililpwwwtptttpplififc55599floooppppwyyAABEEEIIIMNOQQQQQQSSSSSSSSSSRQQONM", +"OMKHHIEEBABEIMMMMIHHEBwoc5|<<<<|35fiic|/)>%$%*%####&=>>>,)))),,>>--*=%&%$$$##@+++..+@@####&%&*;;;;;;;;;;;;'!~{';;;''{<0cc953|35959cciwBBwptAIIEAtligdemmtwzAEIIMMMNNNNKIEAyuuppqollifeffiiiiiptwtppppppoliffc955555cilloppptwwyAyyAAAEEHIKMOPPPPQSSSSSSSSSSSRRQP", +"QPNKIIHIIEEEEEEHIKMMKIEyoc53|||5559fol9|/)-%%%%$#@@#%*-->,,))),,>>>-*%&$#####@+++..+++##@#&%&*;*;;;;;;;;;;;')),---->,~|9995||||595359lyBypptBIEAtiebdemmquxAEHIMMMMMMMKIEAAuqomqpomiicccfffgilpttppopppooifffc9553359filooppptvwywyyyABEHHIMOPPPPQRRRSSSSSSSSSRR", +"RQPNIHEHHEEEEBAyAEIMNMMKApic5339c95cotl9|/,-%%*%#@@##%***-,)))),,>>-*%$########+++++++@#@$&%*******;=;;;;;;->),;===->,~39995||<395259fpAypopyEBypicedeempvuAEHIKMMKMKMKIECAwuqmmoppoifccccffiilpttppoooooiifffc9533599fillopptwwwwwwxwyAAEEHKNOOOPQQQQQQQPPPPQQR", +"PPPOMIIEBAwAAywwttyEKMNNNIAtlc9cfc9cltti5<)>*%%*%#@@#$%%%*-,))),,,;=*%%$###@###@+@+@+@###$%&***=*&%&**==;=*==',>-*%*=>)<5c905||335359flwytolpwwppifeggjmpqvxDHIIKKKKKKKIECAysrnjoppuplfccccfilllppppooollliifffc9555559cilopttwwwwwwwxwwyyCEIIMNOOPQQQQPONMMMNNO", +"NNNONNMKHAwwttttpoopwBIMNNNMHAtppoolotwo9|~,-***%$#@@#%%%%*>,,,,,,>=*%%$$###@##@@@@@@##@#$%&***%%%%%%&*=**&%%-,,>****->{3cc999535559ccfowwoifooppofffgjmmrsuDFHIIIKKKIIICCAvurnkmnpppolfcccfloolloppplllliiifffcc9557550cfipptttwwwwwyywwyABBHIMNNPPQQQPOMKKKKKK", +"HEHIMNOONKEAytpoliiffipBKMOOOOMIHEAywAytf5/)>>**%%##@#$%$$%*->,,,,>-*%&%$$$#@@@#@@@@+###$&%&****%%%%%%**%&%%&&;'>==&&->,<9ffffc55555599fopofdilptpihhgjmmruuDDEEIIIIIIIHCByvqqmnmolilllifccfioooooooooliiiffffcc9955333599fiopppptttwwyyyyyAAEEIKMOPPPPPONMKKIHE", +"BAAABHMOOONKIEwoifcc99cltBINOOONMKIHBBAyo9|~),-*%%$###$%$$$%*->,,,,>-*&%%$$#@@@@##@@####&&%%******%%%**&%%%&&=*>,,-;;->)<5iiiif9333||425fomgc9ipwtibegemmrtuxDBFEIIHHHIHEAyvuqqnmoifgiiifffffioppolooooliifffcc95595533335afilooooppppwwxwyAAAEHIKNOPPPPONNMKKHE", +"BAwwwyAIMNOOOMHwof999599flpwEKNMKIHHBBAyti5|/~)>-*%%$$%%%%$%*->,)),,>=*%%$#@@@@########$&%%****%******&%%&==***>)~),>,'!/|ciffc51<<|_<139ipld0fowwocfgjmmrsuuxDBEEEHHHIHHBDvtqropomfddgfifcccfiopololloliifcc9955555553337adfjilllllppptwwwwzzBBEIINOOOOOONMKIII", +"CytqpptABHIKMMKEwof953599ccfowBEEAwwwwwwti953-*%%%%**%%%*=->))),>-;*%$$####$##$$$$$$&%&****===*===**=;--**->)//)>>>,)/|9c995_(<<<<122cloidcitypffhhmmrvvsuxDBEEEHHHIIEDyuusppmlfc0cdfffc99cioooolllliifc99553355557735a0behiikilooooputwAyAAEEJMNNNOOONMKIKI", +"BuuomorpwwwyABEEBypf5||39999cipwytpoooooi9355|<~)>-%%%%***%%%=->,))),,>-*%&$$$%%%$$&&&$%%*=*--*=--=-;-*=;--*=**=-,)'-*-->,~|9995<((<-*%****%%$&*=>>,,,,>>-*%%%%%%%$$&&&%%&*****=*==*=**&&*%%&&%%&%=>';%%**>)/3999|_(__<(_}39loifciopifkljmmponrruuABBBBEHHHEBywxttpoofb99cffifc9059cffffififfc955333599990999ddcchgeiijonlrqptxxzECCHIMNNNNNOMKIH", +"ByqmjggeebbcccipwyAytof5553335clpwwtof95|*%%*-*=&%%%**->>>>---=&$$$$$$$#$$$$%&%&*%%&&&&&&%$$$$$#$&$###$*;;*&%%=;,<5995|_(<-*%*---*&%%%**---;-***&$#######$###$$$%%%%$$$&&$$#@####$####@@#%=*%$#$&>)<5593<_<<-*%%=>,>-*******--**=%%$############&%&%%%$$$$#$###@#######@@@@#%=&$#$&=>)|5953:_<|<}}}5fooic9c9bcijmolqmmppuwxAABABEEEEAyywwwttpoieccdcc999997333599ffffffcc99535599ccc88a99cdhfilonorqpxxAACEHIKMMMNMMNNMM", +"KIEAuqjg8a24:<<<|359ipyBEEAti93339ipwtplic533|>-**%*-,,>=*-*==**=***=%$$##########$$%&%&%$$$$###@@#####@@@+++@@$&=%$$&&->~|5954||3|22239ipoicc9acfiooolqpqttwwyAABABEEEAyywwttpplkicccfc99999553|3559ccffiiiffc99cccjiiffcccdchiklooorqtxwyyBCEKKNNMMNMMNNM", +"MKKEwuigaa21:_(///<|9ipwAEIHAof5535ciptpoic533|>--*%&=>,,---*=***=*****%$##@@######$$%%%%%&$$####@@@####@+++..+@#$==&$$&*-'<35553|3352226fotoifccciioooolpmmttwyAABEEEEEAyxtttqoooiiifcfc995999955559cffiloooooliiiiilloliiifiilloopppttwyxAABCHIKNNNNMNMMMN", +"MMMIExuke861[_(~////|9fowAEIHAtf95559ipttpif953||~)>-*****-,,,-*=&%%%=***--*%$$#@@#######$&=&%%$$###@@@#####@@++..+@@#%;*%%&*-'~|599955555559cittoieciilioomlnmopttwyABEEEEBAwtprrppoookggf9c999999cccfcciiiilppppppoollliiiiiiiiillooopttwyyAAEEEHIFMNNONMMNMMN", +"NKMMIEymib64_[]{//(/||5iptyBEHBtic999cipttpiffc95|/)>**%%%*-,,>**%%%$&%**---**%$#######$#$&**=%&$###@@@@@##@@@@++++++#$=;-*==-')<59ff99999599cfowtlfffiiilooonlomttpxwAAEBBBAytpqqpqplllgccdfcccffiiioliiiiilillloooolllliicddccfgiillloppswyAAEEIIKMNOOPPONNNMM", +"MKKMMKEwoia61[]/<||||||9fiopyBEBwoicccflppoiffffc95<)--***=-,),-*%%$$&%%**----*%$###$####$&%%**%$$#@@@@#@#####@+++++@#$*;,>>;>,)/39fifcc999599cipwplfifffilooolimmoouutwyADAAAywtrrmmmiiiggdgiiilpptpppliiiiiiifiilllllooolic9099cfigiiknopuwzzBEHIKMNOOPPPPOONN", +"ONKMMKIBwof94}<_|33|>>>>>,~~>-=%%&$$%%*->->--*%$$&%$$$$$%****%&&####@###$$###@@@@@$$=>)))>,,)~|5fiifc9999559fottpliiffcilllkikkglnrpuuyAAAAywwpqrnliiiilikllmopwAywtplliifififiilllloooolic0899dffiijnlrutxxAEEGKMMNOPPPPPOOO", +"OONMMMKIEtic62<_|33>>,,>,)~)>-*%&%%%%-->>>>>-;**&**&&%%*;**=*&&%%$&$$$%%%%$######$%%=,~{),,,)<3ciiiifccc999ciottoifc988fffgdhgggmlrquwAAABAwturpqomoploollllopwyyttptplliiffffffiiillliiifd99999fiijnloqtxwABEGILMNNOPPPPPOP", +"ONMKKKMMKEtl92__<|3->,,,,,)~,-**&%%%%*->->>>>>------=*=--*****&%%&&$%$%**%%$#####$%&&-)//),)~/|0ioooiiffc95559iolfc986a9cfegfbggijmmquyAAAAwuqquuttttpoooiiiilopttttttpplic99999ccfiiifcfccdc800cffilloqtxxACBCIKKNOOPPPOPOO", +"ONMKJHHIKIEyoc3|/_|<-&&%%$$%**;->>>>>-----------***==%%&&$$$%***%%$$$$$%*=*-,/-==%%%&&&*-->>>>>--->>>>>>-;--=*%%&$%$$%*---=%%%%%*--->,)<<>,~~,>==*%%%%*-->>,,,,,>>>;,,>>>>>---***%*%%*-->--**&%%**=**->,~/~)!!{{/|9c953||1____|7cc977626bcfgdfkkkmrrqqtwyyAAAywtuqpmmloooliifcccfffilopptttplfcccfffcccccc9ccddgfeiliqqpuyyBBGHILMOOOPQQPPO", +"NMKKHEAywwwyAywoc53353|<|553|3359fflliiltBHHEyo933333||=&%%%%%%*-->>,,,,,,,>>>>>>>---**=*%%%$$%**%%%%####$&&%%&-,)~)'''')/|9993|<<<((/(<7c9056266dcfghgkkooqrqtwyABBAAywtpommlkiiiiffcc99ccfiiiiopwyytlfccfccc99ccccccfiiiiloqppxAEEGFFIMMNOOPPPPOO", +"OLIFCBAxtpptwAAtl9533533599533359fiiliiopyAEEBApc99993||,,>&$######$%**-->-----;--*=-***&%%%&$$#####$$#$###@##$$$&&*;>!!!''>,){|553|<<<_({~(|9c90566689ffgfkknlqrqtyBEEBBAywwpolkkfggccfcfccc9cffffffipwAAwpiffc9999c9cccfgifilloqpxwBHHHIFILNNOPPPQPOO", +"OLIFAAyurmmoptAytof5||||59fccc99cciiloopptABAABApifff53||<~),>**-,,>*$$#@@####%%**=------=*%**%%%&$##$###@@@#######@@#####&%%&*>!!';-;''~|553|<<__{{{(|9cc0866889fgikklinnqtABEEEEAAywtrllidd90999cfiiifffcc9cffiotwwtoif9999c9ccccfiiilinmpuwAEIIKKMMONOPPPQPPO", +"OLLFBvwqrmieiiptwwplc5|||39fiopppiiiloopppwBAAABAplii9533|/))>--;>>>-&#@#@@@@@#$%**-----;=&%%&%%%$######@++++@@##@@++@@#@#$$&%%-'!!>;;;-,~|553|<__({]{_49cc066aa0fkifkglnrptyABEEBBBAAwpolif9999099ccffffffc99c9ccfiotttoi999c9dccffiiilnnmruuAEHIMMNMOOOPPQQPPO", +"OMLFFzvqnmebb9ciotttoi953359itHMHwtpollollpAEBBEBwoif95595<~))>>-->>-&#@@+++++@#$$%*----*=&%$$&$##@@@@@@@.+++++@@@@+@@##@##$&%==;'!,';--;,~|5531<_>-*$#@@@++++@##$%******&&$$$####@+++++....+++@@@++@##@##$&%==;;'),'-=->,~|553|<|<_(~][20cc969afgkimioptuuwwwyzAAAAAwwtpoifffc995573559cfiiifc955599flppoliccccgfiiiooopqppuyyBGFKNNOOPPPQQQPO", +"OOMKFzzwqkij96}||5ciif93359cipEKEtooppttpoopwAEEEBwpif99cf93|<>--&$#@@@++++@##%%*****=&$$#$$##@@++++++.+.++@@@@#@##@$#$%%=;;;;,',>--=;,(|5353|1<_]/_}29cc98ccfiommpptuuwwwxwyxwxwwwttpolifcc9533333559ciilic953599cfloollicccfiiiiolpqqpuuyACHKNNOOPPQQQQPP", +"OONMKCByumjjc9}<_|39cc9|<<39flAIBpc9cipwwtppttwyAAytoifffi93|<--*&##@@+++++@#$$%**%%%*&$$$$##@@++++.+++++++@@@#####$$&%==;;;;;,,,>===;,(|35533|1_/(:}5cffccbfipppupsuuwwwywwwwtpptttppolifc99533333559cfilli955559cfiilooliiiiiiillloqrwuyCCEKMNOPQPQQQQPP", +"OOOOKHByxrljc921_/_|5993>,,-==*-,~|35577|1,';***-,~|555733||}:15ciilfffltutppqptvwwttttttpppoomoliiiifc955333355559fillif9909ccflottpoolnlmlloqqpuyyACFKMNOPQRQQQQP", +"QOONMICwurmjeb564|(]{<355|/~~3fpABtfcffiiilopwwtiffiptoic93-****$#@++++++#$$%%%%%%&&%$$##@@@@++++++++++++#####&%$%==;;;;===*->,'-***-,/|55557552}|38dfllikipqqppqpttttttttttppppollliiiiiffc953333353359filiic9009cflpttpppppppoooppxuyBCFLNNOOQQRQQQP", +"POONMICzqlkfa85434_~{~<355|~~/5iwAwicfltwpolipwwtlffiptpof5|/~/~,,)~)>*&**%##@+++.+@#$$%%%%%%&&%$##@@@@+++++++++++@@@#$$&%&&=;;;;;===**->>>-***-,/|59599c96|458ciloooqmpoqqpsttttttttttpppooliiiffiiifcc955333333559fiilic909cloptwtwwwwtpppptwwABGHKMNOPQQQRQQQ", +"QOONMICAwqkbb67}<1|>-***-,~|5599cfc556a8flpttpmooqqpppputttttttpppooomiffccfffiic995553335599cflolifcdiotwABEEEAwwtwwwAABEHIMMOPPQQQRRRQ", +"QPOONLEztqjhb64[_/(/>--*-;,/|599cfid9a66cipwwwppopqqprpuuttttpttpppoollifcccccffiiffc955755999cfloppollotyBHIKIEAywwyAEBHIIIMNOPPQQQRRRQ", +"QQPOOMIBxqjhb62_[{{{~//~~/|53|<<|5cooiipyEIKIHAywywwtpllpttof3/~)),>,))>*%%*%#@++..+@#$$$$%***&**%$#@###@++.+++++@@@###&*=-;;;;;;;;;==***==->>>-*;;,(|599cfifc66bfopwwtttuqmopppoppttptttppoooliiifcccfffiillfc99999cccfilppttpppwAEIIIHEAyyyAAEHHIKNNOOQQRRRRRR", +"RQQPONMJAulkb861[({'!)~~~~<|33|<||5fiiilwBHHBAAAAAywwtplllopoc|/~/~,,'~)>*%%%&@++..++#$$#$%%*=&***%#@@##@@@+++++@@@####&%=-;';';;;;;;-=**&==->>>;;>>)/|55ccggf99ccimpwwywtpmmmponoppptpttpppoooiiiifffiiiiloolifcdf9ccffiiilpttttwwABEEEEEBAAyAEHHIKNNOOQQRRRRSS", +"RRQPOONKHzrmf861[({!,,,)))~<3553|||5cfiltAAwppttyBAywwwplilptpf3|,';-;''(|59ccgffcfehklptywtppopmmnnoooppttpppppolliiiiiiilllooooliiiffcdcff9bfltwyyyyyAABBEEEECAEBHKKMNOOQQRRRRSS", +"SRQQOOOMKHAulia7}_({),,,,))~<3995|||39fopwyplillpwBAyyyypliowwtic53|//~/~,-&%&%#@++@@@####$%**=****%#@@##@@@+++@@@@##@#$%*;;''!!';;;;;=;***===>',';-''!{|99cfefilifgjmqttwtppoomlnoopopppttppppoooooliiiiiiopppooolifc999d99ciotwAAywyAAAEEIIHEGBEIIIMNOPPQRRRSS", +"SRRQQONMKIBysric0a|_~)',',,,)<3995|||3clptwtoiffiptwAyyAytllpwywpi953|*%&%%#@@@@@@##$$%*-*****&&####@@@@++@@@###@$%%*=;''^^!'';;;=;;***===;',,',''{_26cifiopplkiimoppppololkinoopoppppttpppppoliifffffoptpopmlic97759a99cfiotyyyywwyABBEEHHEEHEHKMNOPPQQRRS", +"RRQQPONMKIEywpolfc93|(~))',),~<3999|||5fllopplc99foptwwyAytpopwwwtof99|<<<)-%$$%$#@@@++@##$$%*=-***=&$@##@@@@@@@@@####$%&*=;;'^^^!'';;;;;****--;>,,!'''!{:29fiipptpojiiimmopooiiikiolooppppptttttpoliififfiottplifcc99079909099dioptwttttyAABEEIHHHEGKKNNOPQQRRR", +"RRQPPOMLIIEAwtolffc953|<~))))){<59c93<|9fffillc559fioptwyAywwwwwwwwpic53||/,*%$$%$#@@++@##$$%==--=*=*$####@@@@@@@@####$%&*=;;'!]^^!,';;;;;;**----;,!{!!)^]16bflppwwplkifhfllmlliiggilloppppttwwwtpoiiiiiiilpwtlfc055999c05508888cfilpppptwAABEEIIKIIHKMMNOPQQQRR", +"RRQQONMFGEEAwppigcdc9953!!!^^!''';;;;;*----;>'{]{{^]_16cipptwtpokddccfililfffgfilmopttwwwttpoliiiiloottoic933375599009d909ccfflopttwyABEHHIKKMKKMMNOOPQQRR", +"RRQQPONLEBAxtplfifcc99554|<%&%%%$@++@##$%%&*---*&=%$###@@@@@@@@@####$%&*=;;!!{!]^!'''';;;;;;;;;;'!~]:^(:228ioopptpplgcd09ciiiiffddfilmptwwwtttpolliilppptpic9553|433599ccccccccfcilptwyyAEHKIKKNNNMMNOOPPQRRR", +"RRRQPONMHCAxtnied9999555543||||<--&&%%###@@@@@@@+@@####$%*=;;'!{!!^{{!!''';;;;;;;'',!{[::_}26biopppppolgd00a9fffiffddfilpttwwtttpooolopttttoic9554|}1|35dfcfffeffgilopwAEEEIMNOOOOPOOPOOPQQRQRR", +"SRRQQPNMKECxsqib8967575555533333|<<|59fc53599ciof5|||5cfiffioyEEEEBywtpoli9**%$$$#@@#$$&&**----=&%%$##@@@@++++@@@###$%&%=;;!!{{!^^{!)''''';;'''''']^:11}26bbeiloooooifd0786ddgfffddiiopppptttppppopttttpofc95511<|13559cfilliloptwyBEKMNOPQQQQQRQQQQQQQQRRRS", +"SSRRQQOONIHBytpkb85633755555337553|<|3cc9559ccili93<|5cfili99itAEHIBAwtplic5|~,--%%$$$###$$&&**-;--=&%%&##@@@+++++++@@###$%&==;;!!{{{]^^!!!''''''''''!^^_162668abcfilllliic9776500dfifgillliopptttttpptppttplfc953|||3543559ilptttttwAAEIKNOPQQQQQQRRRRRRRQRRRRS", +"SSRRRQPONKIEAywplf9a4773334333335553||599559cfiiic3<<3ciilic59fowBEEAywtoic95<~,;*%$%%%%$$&$%%*----==%%%$#@@+++++++++@@#@#$%%=;;'!!{{(^^^{!{{!)'''''^^^(_}2aaab888bffiiiiiic9725500cfiiiiifiiloppttwwwtppppoic9555333555559fiottwttwyBEHIKKNOPPPPOPPPPQQQQQQQRRR", +"SSRRQQQOONKHBAAwtoi995573||||33||3555359c95559fiif9|<3ciloif9559fpyBBAwtplc95|/~,>*%%***%&&$%%*=----=%%%$##++++++.++++@@#@#%&%=;;!!{{{({^^^^({{!!'!^^^^(_}}26cba8aa99cfjffffc9732357ciiiiifffiilpptwywtpptplf995555595999ffiiloptwwyAEHHEEEEIKMMMKMNOOPPQQQQQQRR", +"SSRRQQQPONKKEAywytqlf9053<<_<<||||335359cc95359fiif9339ciolic54|39ltAAyytpi95|*%*->>*&%%***-->>==%%&#@++++....++++@##@#$&%=;;!!{{((({^^^[[[^^^{^{(_}}}28bb98aa868accffccc9743570ciifffffiiloppwwttttwpic953559999cfiiiffioptABBBBAywyyyAEHKKMKNOPPPQQRQQQRR", +"SSSSRRQQPOMMIBwwtttplc997|<<(//<<|||33359ffc5339ilif9559ciiif951<|9ityyywtpi93**->>-*%%%***;>>;=%$$#++++.+.....+++@##@#$%==;;!{{((_(((^^^^^[^_[(__}}2268ca698a6a6689cccfc976357ccccfffffiilptttpptwwpic95359cffiiifccciotwAAAywwwwtwyABEIMNOOPPQQQRRSSSRSS", +"SSSSSSSRQPONKHAwpppoifd0554|_/(/~/<||33359fic535cilifc959cccfc9|<<|5fptywtplf93--;>>-****=*->>;=%#$#@++..+++....+++@#@@#$%=;;'!{{(____(((__1111122}}}66866a6aa2}}}65999cc9d959999999cfffiilptpooptwwpic9559cfilifc99flpwyAywtppwyAAABEHIMNOPQQQQQQRSSSSSSS", +"SSSSSSSSRQPONKHBwtpoifc9577553<<{//<||33|39iif959fiiffc99959cc93<;-;>>>-;;***->>;%$#@@@...++++....++++@@#$&%=;'!!{___}}__[___1122222266a22226662}[:[2355999cc99d95559ccffiioppollpttplifc9ccfiiic999ipwAytppppttyEHIIHEEEIKMOOPQQPQQRSSSSSS", +"SSSSSSSSRQQQPONKHEAyplifd5559553|>>--;-->>>>*=*;>>;%$#@@+............+.++@@#$&%=;'!{___}}}}}}}}}2226a686a222222662}}:[:}225799cccd9955799cfilopplilpppliifffiillc535clwAAypllotwyyBEIIHEAAyBEKMNOPPPPQRRSSSSS", +"SSSSRRRRRQQQQQQPPNKKEAwtlf95555953||<-->>>->,,>**->>;*$#@@@+..............+@@@#$&%=;'!(__}}}}2}}}}}}2268aa86622}22222}[:[[}}32399dff99555599cflppolilopliffffiopof5|3fpABBytooptyAAyAAyAABAAAEIMNOOPPPPPQQRSSSS", +"SSSSRRQQQQQQQQQQQQPOOMIEypic53|33|33||<|3|||39ilfc9cfiiffc553553|<<->>>>>>),,--->>-*&#@@+++..............+@+@#$&=;>'!(}}}}2222222226866626662222}1}}}1::}}[}|300c9999955999fipolliiooiffffiiooi935cpAEAywtttwwyyytppptAEHIIMMNNNNNOPPPPQQRRSS", +"RRRRRQQPPPPPPQQQQQQQPOOMIEwpic53|<<|33335955|39fifccfiliic93|333|<,,'>,,),,--;>-*%#@@+++...............++@@#$%=;'!^:}}22886666666666626662222}}}}:_:::__::|3795999c9999cfloliiilooiffifillf999coAEBwtwwwwwwwtoiiopAEKMNNNMKIIIKKNOOPPQQQRR", +"RQQQQQPOONNNMNNOPPPPOOOOOMIEAwpi9|/<||3335993335cfccfiooli953|<|--;-=%#@+++.................++@@#$%=;']{_}}2866666666666}222222222}}::::<:}[::}|3335799999cciiiiifiioliiiiiiic559coAHEAttwwwttpliffotAHKMNNMMIHBEEEHKMNOPPPQQR", +"QQQQQQPNNMKKIHIKMMMKMKMOONNMKKIApc3<<<|||35555335cfccflopoic9|//~~~)))~//<39iif9335995|/~~{)){!)),>---*%$@++++.......... .. ...++@#$&*=;'^]_}}866666666666}}22222221}1[_::_:}}:_||11|439999cffiliiiffilliiilllf559ciwEHBwwwtttplfcciowBHIKKIHEHEBABAAEEIMNOPPQQQ", +"QQQPPPONNMKIIHHHHIEBBABIMMMMNNNMEti93;--%$#++++...... . . . ..+++@#$&*;;'](_}266666666666}}222}22}}[:[::[[/}||:|}1<<||55999filliifffilifiloplc59fltAEAwtwtpptlc79itAHKHHEByyABABABAABEIKMOPPQQQ", +"QPPOOOMMMKKIIHHEEHEAAwtwABBEIMNNMHyoc5|////<<||||59cfffloppoi93/!,,)),,)<<<<|59c953||5cc93|<-*$#++++...... . . ...++@@#%*;;'!^(_}26666666666}}222}22}[::::]]]:<<||334_|||33559filliifcfiiifioppicciopAAyttptpttof50fpBIMKEEAwptwyyAACBABBHIKNOPQQQ", +"OOOONKKIIHEEBBCBAEBAAwttppptwBHKKIEwpi93|///<<|3359ffffiloppoi9|/))))),,)/(//<35995335cffc95|,)~~~/<|595559fiifc93-',))))~<359999fllif93*%@@++... ..++#@&%&=;',^{_}}26666a62}}222222}[[::^:::[<:::||1|}33|35359fiiifffioooppplfcitBHIBtpollpoid9kwEEEEEAwppoooptwwwwyABHEECCFIKNOP", +"OONMHIIEBxxppmlhjffffgfloomlliffiotwAABAAwtpf53||350ciopifcfiiiic5|---,,),,)/|59555fioif93>-;->,,,,)~|55559fillf95_/!)),>>-$#++... ......+###&%*;''^](_}26666666889886067222}}::::]]:}<(/:_<||3559fffccccioopptpiioyIKKEtoliotpf59lAIBytploloprpwyytpnquzEEHHEEFIKNOO", +"MMMIHEEEAAAtqqlgeba87976809cgiifffiffilpwBEBAtplic95439cfc99cfioolc5|>>---,,,,)/|3559cfiolic5<{~),>--*$@+.... ....+#@#%=*;''^^_}}}6a6a99899889b99652|}1:_:]:<<_(//<_|||359fffcc99flopppliltEMMKApifipti95iwHIAtpopptwwwwAzwpnnquAEAEEJHIFKNNO", +"KIHHHHBBAAwtpooiica8774263779ccccfcffccfltAABAwtof9533|599ccciiopoi95|>>>>',)),)/|399cfioooic5|<~,>--*%$@+++... ...+@##&%=;;''^(_[26a688aa99cccfg99522|||<:<:||<__/__|<||59cfc9999floppoiioAKNMEwlfclto939oAIEwpppwBBBAABAwppnquwEBAABGKKKKLNM", +"KICEHHBByAwwqroolfda573}24347759999cc989ciowyAAwplf957||359ciiloooic93||/),>>,>>>>,)))/<59cilooolic93<),>-**%$@++.. ..++@##$&%*;;'^^{[}}6689aaabbcfif9956333|||||4|||<|_<|<||79ccc9959flopoiilpEMNIApiffpti53fpAHEwppwEIIEBAytuprrtxAEACzCCKMMNMMK", +"FECBEEEAyywtupoooigca74}}1|14335355999999dgltwyAwpoif973359cffilooic9533<~!,>,,>-->,))~/|9cflllliiif9|/'>-*%%%#@+.. ..+@+@##$%=*;',^{_[26688a98999cif995532533}||||<|<1__|||359ccc9959flopoiiowHMIBtliflwwf90ltwBEAttAEEEAywtpqtttwyABAAAzBFLMNNKF", +"IBCCCBEAAwwuupppplifc77}}211114|33369909999ciptyAywtoof95599999filif9533|-->)///<39ciiiiifffc5<),>*%$$##@+.. ...++#@##&%*;;,!](}}2aaa66809a9fic9966333}:1<|1:<___||||3599999559flopliotBIIBwoffipAtf9foptABAywwywttttptpttwuuAAEBCCGHKMOOMK", +"KCCBEBEBEAywwwtppoiie97322|1||1|||||7589999cfiotyAAAwtpic55555359ffc53||||<<~~),>>->)/<||359fiiffcccc9|<~,>%$#$###+... ...++##$$&=-;'!^[_[266622aa86dcec9965334|1_<|}:<___|<||3399995559flopllpAEIEypifflwApcclooptyywtpojnoptttpspuuxyAEEGEIKMOOOON", +"MIJEEEHEIHEAAAwwtpollc9722|1|11<||_<|2695099cfiopyABAytof953333|39c953||||||>--,~/|35999cfcc9955553<~,-*%$#$$$#@@.. ..+@@$%%=-;','^^(_}6662269989bb900077574|||||<|1__|<||1399995559fopplowBIIEwofcfowwlcflolloopligceiopptqttwxuAAEHIJIKMMOOOOO", +"NMKKKKIKMMKIEEBAwtppplic96733|11<|_<<|||23350ccilpwyAAwpic53|33|||5553|<<<|||->,)~<399999c99953||555|/,>*%$$$%%$@+. ..+@#$&&**=;-;>'!{[[26622a8888dd0076777734333341|<||<|14599995555flooiowEIIEwl99fpwti9fiiiififcc9cellopqqpzyzBBEEEHHKMMNOONOO", +"OOOONMKKMMNMIEBAypppppolie0955|1|||||<<:<<|379dggilpwAAwpi933353|<|33||>>,)~<|59c99c99553||3595|/,>-%$####@+. ..++@@###$&%=*-;;,!!([[226aa88d00d077424633333574||||||||4599955339flolipyEHHBti99fpwoc5cff999ccdccffijoomptAAABBEBCCILLMNOONNO", +"NOONKIHHIIMNKHAAypolloollfe9090334|||<<_<::|25ciiifiptyAytlc55995|<|||<<~~~<|33|/),>>,)/<|3599c995553|||555|/)-%$#@@@@+.. ......+++@@+##$%*=*;'!!([[286660dd000a666224233355531|3||3||3999975359flolipAEEBAoc59fpwoc59c03439cddchfiloqqpxwyBAEEGCEFFKNNNONOO", +"NNNMHEAAABHKMKEBAwpoiliiifc999099953||<|<<|<}39fifffiptyAAyof9ccc9|'!([[286000ddbbca6622}}}43435311|||3|||3999995359flolltABAyti959itwl939c931409999cfiioqrpwwBEHEEHIKKMNOOOPOOO", +"MMMMIHAyzyAEKMMKIEAtooilifc955709995533|||<|||59cc99cfipwAAAtlfcff5<~~//~),,)/|33|/~),,)/<||13675334||<<(//<|3<)-*%$$$$$$#@+.. ....++@@##&%-;;'!{[[28a0a0dccceba60a6744444331||||||||3999995555flplltAAwtof539lwwi937905337675dfiimmopuxyEEIIKKMNNOOOPPPPON", +"IIIKKKEEBABEHMNNNMKEytppoiic9577790c99953|}}||35553755cfotyAAwoiiic|/~~{~,>>,,{<|||-*%$$##@+. ...++@@##&%&;;'!{[[26000abbchkgd00a64441114||||<||<||3599955335flployAytplc559oywi533553|1|246cilkjmmouxBEIIKKNNNNOOPPPPNMK", +"CGEIIKIHHEEHIKMOOOONIBywttolfc909999cccc963||2|433||||359ipwABAwpoi9|{]~)'>,>>,~/|3||*%$#++++.. ...+++@##$%&*;'^{[[260088bbggkkgd07744411355||<|||_<|3599995335flolpBEytoi955coAwf3|3|||<||279fiigikopxAEHIIHIKMMOOPPPONKIH", +"CGEHEIHIHEEEIIMOPPPPOMHEAwwtpliilifcccffcc86532||4|<_<<||3dotABBAtoic|~!)),,,,>,)/|33||%$#@+..... ....++@##$&&*;']{([28088bbkggkkgd07a46662553|||||<<_|3599995333clolwEEwpif535coAtc||31_<13769fffffjmpwAEBEBBEHIKNOOPPOONIFE", +"HIIIEEEHHEEEIKNOQQQQQPONKEBAwtppttplifgffc999a5||||1_/(/<<|9ftAEBytoi9|/~))),,>--'/|3331|<||39c97|555553|<<~,>->)<||~>%$#@+...... ....++@##$&%*;;!{^[280b8ggkgggklifd98676265334||||_<|3599995333clllyIEwlfc5|3coyt9||3|-=;,/|35533559cgf953333||-%*,~||/,*$#++............+++@##$&%==;!!([28abghggggmlligfd866533952||||1_||3599995333ciloyIEwlc9||3coyp93334;-=-)<39c9c99cfffc72|<<;*%%-)/|<)-%#@+....++.....+++@##$&%==;!!([280hhggglljmliffd9668a6952||||1|||35999953339ioowEEwic9||5cpyp93334|<<|769fillpxwwutwvxzDFIMNPPPPPOOONOO", +"KIIIKMNNOPPPONMKKMNOOOOPOPPQPPPOMKEBAtpoolif97565533|<<<<<|353|5citwwtpl93>>>,/|59ccccc9c99931>-%%*>~<|/,*%#@+...+++...+++@###&%*=;'!(:2a0ghhgllllmliffcd95607055|4|1||||3599c953339ioowBBtic9||5cpwo931|4555099filopttuqsrvxzDHILNPPPOOOONONOO", +"KKKNNNONOOOONMIEEEEEHHHIKMMOOPPPPONMIEwpppoic85555753|1<<<|5333|49iptwwtlc5|<~,,,>>>)~|359cc9999053|<_())!~~~),>>-*%%*,/||~>*$@++..++++++++@###&%*=;!!([280gghilllplmifdcd997868554|1|||||3599c953|39ioptAApfc5|39ftwo93||49filliiiottuommrtvxCFILMOPOOONOONOOON", +"KMOPPOOOOONMKEAywwwwAAAABBEEHIKNONNOONIEywtoic9975355573|||33|33435cotwwtof9|/,>>>>->)~<359dcc999572_(/),',,!)),,>>-%$%-~<|<)-%#@+..+@##@+@####&%*;;!!(:2abkgjjjopqlmkfcd90870600541||||||35999953339ioopywoc95||5fpwoc53|4cioppoioptpmhmqrvxBEFKKNOOOONNOONONNM", +"NOPQPPPPONIHEAwwpppttAAAAAAABABEIIIKNNNMKEAtpiiif955559053|||||333339lpttoif5<)>>>>>-')/||7ccfcc99721<(~]!'>,')),,,>-%$$%>/||/>%##@+@@#########&&*;;!!([28bknjjnrrrmlifcb90990850541||3|3|35999953|39foopwwi953||5fpwofc535copppoopwpmjmmrswzEHILKNOOOOOOOOOONMM", +"OPQPPPQPNKHBAAAwpooptyEHEEEEBBBBEHEEEHIKMMKEAtoolf995590953|||1437|||9ilpoli93/,>>>>;;,):<359iifcc964|,',)),,>-*%$%-~|3|)-%$##@@@##$$$#$&&*;'!{[[26bknmjmrrrmllggc9009d09055533333|35999953335flopwti953<|5ftypic9|3clppootwpnkjmrpxzBHHLKNOOOOOOOOOOOMMN", +"PQPPPQPOMIEAAABAwptttyEIKKKIIHHHIKKEBAAEHIKKIEytplf953335555||11273||35ciooif5|/)'>>';'']_|30fiigc95241<~!)',>;'',),,>--%$$*,/||~,*%$##@@#$%%$&%&;;'!{[[2abknlrmqrqmllkgc9089dddd055553333359ccc53335floptti553<<3ftytif9330lpplpwtlhghmrwyzFEILMNOOOOOOPOOOOMMO", +"QQPPQQPOKHEABBEBAywwywAEKMMNMMKMNOONKEAAAyABHIEBwpic953||35553345993||35ciiif95|/)>;',,!]/|26bcfiff9631|;>,,,,,,>>=%$%-)/|<~>*%%$$#$&%%=*=;;'!{[}20bkorqrqrrrlmifgc988cgfcd59555553559fff95559floptwl553/<3ftAwoif530lppotwpfggmmszzBFEIKNOOOOOOPPOOOONOP", +"QPPQQPNMIEEBBAEEEAywyyAEKNOPPPOOOPQQPNIBytpppwBEBytlf953|1|35555dfg9933359fifc95|/),,))]!(}269ccecfc9534|_(~!,>>>;>'>,,,,,>-**-,/||<~>-*%&&$%%*->;''!{[}60bkosrquusromliifc9cdggigc999955599ciiic9559foptwyo993/<3ftAytpi95cmoopwpihgemmtAzDEIIMNOPOOPPPPPPOOOOQ", +"QPPQPNKHEABBAACEEAyyAAEKOPPPPPPOOOPQQQPMEypliiowABAtoic931||359ccfiic953339cfc953|/!))~]{([}0accbcc999053|<<~!',>>>--;''!),,>-**>)<||/)>-=&%%=*;;''!^_[}a0bhutsuussuooolifd9dddfkigc99999599fiilic999fptwABpcc5||5iwAAAwofciooowtlhhgemqwzzBCHIMNPPPPPPPQPPOOOPQ", +"POOPOKHBEAzzwyAAyyABEHKNOOPPOONMMMNOQQQPNKBtlffiotyAwplf931||359dfiif9993||5ccc93||>;;;-',,),,;;;>)/|||(!'>-*=-;>'){]<}a6dkovtuuuusuroolifcccccdgiicc9995999filiic999fptwBEtic5||5iyBBBBwliopptwplehgjmqwyzDCHILOPPPPPPPQPPOOPQQ", +"POONKHBBzwxptwxwwAEHKMNMMMMKIIHHIIIMNPPPPONKApiccfltyywoic73|359cgiliic953|35ccc5|||||:<_}}}6bbebc8a5269977||-=*;->,)))''',,~<1|>>,'!]_126adknvtxuuusqqqoiifgc900ddiifc9955559cfiif9959clptAEtic5||5iwByAByoopptwwolfegjqwwyzBEJIMOPPPPPPPQPPOPPQQ", +"ONMIHBBywuurpttutyEKNOMIIKIHEBBEEEEHMOPPPPOONIyoiccfltwwtlf055559dillifcc93|55ccc53333|1|21668bheca97424375541<<({),>>-==%*->,)!~~),,)/<|||(!)),'!!^_228bbknruuuuuuqpqpokgga90009iifc95555559cfff95359iptyBti95|<3ftytpppopppwwpolhhknuywzzDEJKMOPPPPPQPPPPOPQQP", +"OMIHBEEzxuonpuupotAKOOMIKMIEBBBEEBABIOPQQPPOOOMEwpiccfowwwoic99559gioif99953|59cc9533537222a6dbbhba874111355553|<;=*=%&&=;,{{(((__1||||||<__[[}2268ekoruuuuqqqomolkfd900099cccc955353359ccc53335cltAEwi93/~<9lpplillfiopoiiifjmpwwzyADEIMOOOOPPPPPPOPOQQQP", +"MKHEHEAxprnnmpmkiopAKNMMNMHAABHHHHEBABEKOPONOOOOOONHwoifiotwtoicc990ciid3|355335cffc909c99dchgggghb8877}2__<|35554|<((),--==&&&%->)~{(<|55||<|34||}|4268dbhnvuuttuqqqnlnkhdda0999ccc9995353359ccc93335citBHyi93/~<9iooooofcilifggeeknrtwwyyEEINOPOOPPPPPPPOPPQPO", +"MIEHHHApprnkmqmhkjltEKKKKIByyAEHIHEAyyyBHKKIIMNOOOONMEtlffipttpifc9599fc9|<355559cfcfc9cccffkllkkeeb985321_<__|7555||_~)'>;==&&%*=>,)~/<|7|<<|14376786bbhhknquvtvvqqqqmmmkgd09b9cccc8995353359ccc953359itEHAi95/~<5floooicflifddfchkruqtwxzDEINOOOOOPPPOOPOPQQOO", +"NIIKKHtppnkkmqmkkjiotBHKKHBAyyAEHIEBAwwwAEEEBEHKMNNNONHwoicflppoifc955cfc3<<|3595cfiiiiffcfimppnmmffb953}}1_<(__|333|_;','{/<<(_<|436509cffgjmnrvvtvwwtuqmmmkfdccbccccc9599553359ccc953359itEHAoc5<~/3fiopliiloicabbbhknqqptxzDILNNOOOOPPOOPOPPQPOO", +"NKMNNEtpqlkkkmqmkeihlpwEIIHEBBBEHIIEBAwwyBEAywyBHIKMNONIApf9dioplifc90cgf92_:|5999fillliiiiimopppmljfc954}}1,,,,)~(/__|36709cfgiknnstssuwvvvttqmmmiifcbbcccc9999995599cffc9555citEHEpf5>''',,'!{((<|589cfcfiloqttxtutvvwvwwuppoliifbcbccc9999cd999cfiiic999fltEKIwi9|<<5fipwABAtlcb88bcimlmprsuDDJIMMONNOOONONOOPQOOP", +"OMMNMEwtpmnkejmpmmhbheiioppolooopwBEBAwttttwtollooptwEIKKIypg009flollifcfic953|35ccfilloolommnqopppoiibb953}[:((({))))~_||<;>''{<<11<<(/_/_((/{([[[:13669fhloptwyyyyAAAywsvwtttpolieeccbbc999dcdcccfiloic999ioEMIAl5<~~|95559dc89898ccnoonmrsuDDHHKMMNNNONMNMKKNNNKIN", +"PPNKEwpttpnnllloutwplhjijejif98cfilpttpoliiipwwtoiiffffioptwAytofcfltwwwqolif9956269cfoppttppuuqrqopmollifc9741[:])''>;;->;'{_<|1|44322}[[[[:_12|226bekopuwyyyyABBAyvwywtttrliffccccc8990999999fiifc99cioBMMEp9>,~<|35599652}[1142a6268abhiottwzyyyAABAyyAywwwpolifeccfcc990509999cffc9559ciyKMIwc|,~|49cccdd0755766aa8abhhjmpuxxxxwyAAAAABBAAywpoiifffffcc90999999ccfc93335ftHMIwc3|<|9959fgb968bbcioomkoruyDGGIKMNNNNNMMKKIIKNOKCE", +"INONHpjkloliinonmmmqrtwwwttwyytlc9909cfif9999ciptttppoic9999flpwyAAwtppwwyuopoifciifccfloptwzxyuuqqnonkjjiliifc5}:(!'';;*-=-==--'!_49ciifdefc898abbbbgehmptxwxxxxyAAAABEEBBAwpolieffiffcc909999cffc95335coBKIyf|>;;>>,,)~~/<<<<;>;;->->>,,)~/<|||||<<<11375cfiiowABHIKKMKIHHKKIHHECGEHGEHIIKIKIIIFIKKMMKKMLKKMOOOOOOMKKIIJKMMMKKMKNNNNNNOOOONLIJEDDwvsvnnhkkggb88aaa222222222274132259999953700adoswywxzzzAAAEBAAAACBABCCHKMMKHCzCGIIHEFGJIMMOOOOONMIHEzzwwytsuuttwwwwwwt", +"mhgghbiec8833|_[^{)!',>>;>>>>>>>,!!~/<|||33111|3779cioopwAEIKMMIHHIIIHHHEGEGGGGHHIKKKIIIFIIIKKKIKLLKKMNNNNNNMKKIJIKLMLLLLLLLMMNOONNNMIJEDzxvvnnnhggbbbaa7744411111112}411423599cc52200adiptwywzAzzzAEEBAABCBECCCGMMMMJCzCEEHEBFGIIMNNOOOONMKIEAzwwwttstttxwwwwtt", +"megbcfb906|1_(^^^!!',;>;;>->->>>,'!~~/_||3373||376acglpttzEIKMKIIHHHGEEHHHGGCCHHIIKKMKIFFHFIFKKKIIKKKKMNNNNNMMKKIJJKMMLKLLLLLLLLLMNNLIEEDxxvvnnkhgbbb0a7774441}[[[}111}11134459cc5220dadjpwwzwywzzAAzEBBAAEEECCCHMNNMIGBBEEEEDFGIJMMNNOOONMKFFzxzvwvssssuwwwwtum", +"edgebe8622_(((]]{'''>;>;-*-=---->>,))~/__1137337aa9dilptwzAHKKKKIHEEGEGHIHEECCHHIKIKMMKIHHHFFFKIHIIIIIKMMKKMKKIHHEEHIIIIHHHHLLLLLLLLLJEEDvuvrnkggaaba0aa222}}}}[[:}}[1_:1112239995345badiowwyzwwwzAAzBBEEEEHGGCGIMNNMKHCCGBEDDFEIJMMNNOOONMIFDzxzxwxsssstxwwussm", +"egecba62}__({^^^'''>;--=**======->',)){(__<|4508600chkptyACEKKKKIECCEECHIIHEEEHHKKIKLMMKFHFFFFFHHHFFIIIKMKKLKKIFFFDFFHFHHFEFHHHIILLLLHDDzvvvrnghbab00a6a6}}[[[[[[::[[_1_:11211|441247adhhmtwyzwwwvzzAzBBEEEHHGEIIMNNMKIFCCEEEDEEIIKMMMNOOOMLHFDzzwwxssstwwwtsumm", +"ggccaa2}_({{!!^^'';-=*=***&=====->>,,!){_<_|4609ddhbflowyAzEHIKKIECCCBzBHIHEEGHHIKKKKMMKFFFFFFHHFFFHHHHIKKIKKKHEEDBBBFFFFDDDFFFFFFHHHHDDwvvvrkghba0066622}}[[[::[::[:[[__[11|1|111135a0henpwyxwwxwwzzzBBEEHJHHIFKMNONMIHFHEEDDDEEIIMMMNNOOMKHFDzxzvvvsstwwwtmmme", +"ghfb62}[(^{!!!^!';;-=*&%%&&&=====->',!){(<1}2269cfhehjruABAEBHIKIECzAzzAEHHHHIIIIKKIKMMKFFHEEEBEFEEEEEEEIIIIIIIFBCAAzzAACCCzDDDFFDFFEFDDxvvrnkgbb00662222}}[[]]^]^^][[::__[1111111112a0hhjrwywxuwwwwzzBBEEGJIKFFKMOONNKHEHFEFBFEEIIMKKNNOOMKHEDDxzxvvsstwwwsmmme", +"kbb62}[(({{!!!!'';;-**&%%%&&&====->','){(_}}2770bhfinjnqyCBBEEHIIHCAzyAzBEEHIKKIIKKIKIKKIIHECCCCCBBFEEEEHIIEHHEBzzzxxzzzzzzzzzzzCCDDDDDzxvvrnkgbb00a22222:[[[]^]^^]^^^:^[__:|111111124abhjqwyyxuuxwwyyzBEEJIKKKFKNOOONKIHHHFEFFEHJKKKIKMMMKKJHFDzzzvvwtwwwttmmeg", +"icb2}[(({{!!!!!'';-=*&&%%&&&&====->','){(_}}7559bchlmrqszCECAAEHIIEAAzAAzAEHIKKKKKKHJIKKIHCCCCCCCzAzBEEEBEECCECCzzzzxxwzyyvzzzzzzzxxxzzxxvvrhkgb006a2222[[:[:]]]^]]]^^^]^:_[:1111114277bhjnuwwxuuuwwwzzBBEJIKMKKMNOOONKIHEFHEFFEHKKKKIKMMMMKIEDDzzzvvvtwwwummmjk", +"eb6}[[({{!!!!!'';;==*&%%&%&%%%===--;,'){(_}270aabhjnpqtxzEECAzzEHHEEAAAzzzAGIKKKKKIJJHIIHGCCGGCCCzzzzCCCCCGCCCCCAzyxwvwwyvwvvvvvvvvxxvxxxvrrhkbb00a2222}}:::]]^^^!^]]^{]]^:_[111[[124770hhnptwvuuuutwzzBBEGIKMMMMNOPONMIHFFHFEEEHKKKKKLMMMMKIJEFDzzzvwywwusmmjgk", +"b82}[(({!!!!!''';;==*&%%&$%$%%===*-;,'){(_}27aaabjhnqqtxAEEBBxzCEEHEBAzAyAzEIKKIIKIJGEHHEGCGEEEBAzzzzCCCCCCGCACBCzyzwwwvsttsssvvvvxvvvvvvvrrhhbba66222}}[[[:]]{!!!!!^]^{^]]__:_[_:}}47a0hhnpuwwtuuuwwzyzBEEJKMNMMOOOOOMKHFHFEFDHHKKKHHHKKKIHHEFEFBzzvxzwwtsmejkj", +"b2}[[({!!!!!''';;;==%&%%$&&$$%&==*-;,'!{(<}478bbhjjmmqxxABBBBCzzBEEEEEAzyyzEHIIIIKIIHEFECCCEEEEEAAzzxzBGCzCBBzCBCAAutusstuussssssrrrrrvvvvrrhkb0a6222}[}[[[:{{{!!!''!!^^^^]]_[[[[:}}26aahhhnttwtpuuuttzzBEEJLMLMNOOPOOOKIIHEEFEHHKHIHHHIKIFEFEFDFFzzzvAAttmmhkjc", +"82:[({!!!!!'''';;;=%%&%$$$$$$%&==*-;,'!{(_}45abhhjmmruxzAEBBBCCzBEHIIHBzyAAEEHIIIKIIHEECCCCBEEEEBBzxwwzBBABBBCAAyywtttsspmmmmmmmsrrrrrrrrrrkhbb0a6222[::[:(^]{!!!''''!!^^{^^:_}[:}}}466ahhjiputspuuuttxzBAEGKMMMOOOPPOONIIIFEFEHHHFHHFFFFIFDBDDCAzzzvvAwtmmejkhc", +"2}[[({!!!!''>'';;==%&&$$$$&$&%%&=*-;,'){(_}47abhjmmruuyzAEEBCCAAAEHIIIEBAAACEEHIKKIIHFEAzzzCBBEEEBBzwwyBEBCBBByyyywwtqmmmmmmmmmmmmmmmmmkkkkkhbb08622[[[[:((^{{!!''',''!!^^^^[_1__}}4a666hheipputrrruutxzBAEGIMMNOOPPPPONMIIHHHEHIHFFHEEHIIHEBAACCzvvvtwtmmjjkic9", +"2[[({!!!!'''''';==&%&&$$$$&$$$%&=*-;,'){(_}47abhjmruuwxzABEBCAAADBEHIIHEBAABCGEEIKKKHFEzzzzzAyAAABBBywzAEBBBAAyyyywqqqmmmmmmmmmmmmmmmmmkkkhkkbb08222}[[:::(^{!!!''','''!^^^^^:111}}47666bghhlptpppquuttxxAEGIMMNOOPPPPONMLIHHGHHHHFHEEFHIIEAzzCCBzvvtwwqmjjgkjb8", +"}[[({!!!!;''''';=*&%&&$$#$&$$$&%&*-;>',{(_}47abhjmuuwwzzCABBAAAAADEHIHHEEBzBECEEHIIKHEECzzzywyyAAyBBzzyAEEAAAAyyyuuqqqqmmejjjeeeeeeeeeeeebbbbba08222[[[[__^]^^!!''',,','!^]]^]11}}}47a68bhghjppqpnppustxxAEGHKMLNOPPPPPNMKLLHHHIHIHHFEEHHECzzzCBAzvsuwqmmhggeca2", +"[[({!!!!';>'';;;==&%&&$$$$$&&&%%&*-;>',{{([4aahhmnuuxzzACzBBAAAAAABHHEEEEBAACECGGJIIHEGzAAzwwwyAAwyywytwAAAAAAAuuuuuqqjjjjjjjgddeeeeeeeeebbbbb006222[[[[__({^^!!';;;'>,''!^]^^:1}}}78aa68bhgjnpppopqqqtxxAEGGKMLMOOPPPPOMKLLLLLLIIHFEDEEECCzzzzAAtstqqqmeeghcba2", +"[[({!!!';;;;;;;;=*&%&&$$$#$$&%&&&*-;>'!{{_[4aahemnuxzzzAzAAAAAADAABEEEEEEEBACCEGGGHHHHBCAzAuwwyyAyywwuutwAAAAAxuuuuunnljjggggddddddddddddddaaa00822}}[[[_({^^^^',';;;''''!^^^]_}}}3666a6a88hhoppqoopqqtxxAAGGKMNNOOPPPPOOMKLLKLKIIHFEDAACCCyAzzywusmqqmjhggfba2}", +"[((!!!!';;;;;;;;=*&%&&$$##$$$%&&%*;;>'!{]_:78ahjmnuxzCzzzCAzyzAAABBDEEEEEEBBBBGGGGGGEEBCAzwuxwyAAAAywwtttyAAAwxwuuuoonnkgggdbbb88888888888888888822}}[[(_((^]]!,'';;;;',,!!^^([}}2a66666aa8ahlpppnnpqqppxAACHIMMNOOPPPPOONMKLLKKIIHFFCAzCCCAzAzywumqqjjjggebb82[", +"[({!!!';;;;;;;;;=*&%$&$#$#$$$&&%%*;>>,!{([[788hjmnuxzCCzzBAAyyAABEBDBEFBEEEBCCGGGGGCABzzAAwxwwyAAAAyywuutwyAxwxxuuonllkkggbbbbb88888888866666666622}[[[[[(^^^{!''>;;;;;,,'!^^^[[}26a6666aa8abhopqnnppqssxxAEGIMMNOPPPPPPOONMLLKKIIHEFCzzBBCAAyAysmmqnjjghecb82}[", +"[({!!!';>;;;;;;;=&&%$&$####$$&$%**=>''!{([1468hjmvqwzzzzzCzAyyyABEBAABEEEEEEEHGGGGGBADxzAAyywywAAAAAyywtttwuwxwxuroolkkkebba66666666666666666666662}[[:[({]^^!!',>;;;>''!!!{^^[:}46aa226aaaabhoppoorrqssxxACGHKMNOOPPQPPOONMMMKKIIFEFBzzCBBAyyAuqmmjnjggbebc82[[", +"((!!!!;;>;;;;;;;=%&%%&#$####$%%%*=;-',!{([1488ejnvwwAzzzzCCAyyyyAEEAABEEEEEJGJHJGGGADDxxyAAyywyyBBBAAywwttqutxxwupnokkkeeb88866666666a666666622}}}}}[[[[((]^^!{!'',''''']{{^[[[}25a66a6668abbeottppprqupxwACCGKMNNOPPQPPOONNMMKKKIFEEAzzABCyyywtqmjnngdbebcb22[[", +"({!!!!;;>;;;;;;;=%&%%$&$$#$$$%%*=;-;,'!{_[168bbknvwAAAzzzABAyyyAADBBAAEHHEHJGGJIIHEAAxxxxzyyywyAABBBAyywttquuxxxppomkkhfa888866666666a22222222222}}2}}}__:^^{]]!!''',,''!]^^^^[}44a6666666a0cemtwtpppuuuxwAGCGKLNNOPPQQPPOOOMMMKLIFFFAzzABByyytuqjjnggabbhca2}[[", +"({!!!';;;;;;;;;==%&%%$$$$%$$%%%%==-;,'!{[[266bjhnqwAAAzzzAAAyyyADAADAABHIHHHGGIIKIEBxxuusptwywAAAAEEBAyywqquuxwxpppmkfheb888822}}}}}22}2}}}}}}}}}}}}}}}__(]^{~{]'''''','']^^^^[[}2222222266abckpttqpruuuxxABEHKMNNOPPQQPPOOONLNLLIIFFBAzBEAywquuqjjkggb8ceb22[[[", +"({!!!';;;;;;;;;==%&&%%&&$%%%%%&==-;'''{{[_468bjhnvwAAAzzzyAAAyyAAyyABBBHIIJIHJIIKKHByxurspstuuyAAAEEEBAAuuquuuxpprmmmjfbbaa8222}}}}2}}}}}}}}}}}}}}}}}}}_:]]]{{!!!'''',',!{]^^[[1122222622260abkotprrrqqtxxAAGJKMMNOPPQQPPOOONNLLLIKHECAABEAwtquujjkkgbb8cf62}[[(", +"({!!!';;;;;;;;;==%&&%%&&&&%&&&&&**;>'!{{[1468benqvwAAAAwwzzCAyAAxuuAABCEJIIIIIHHIIIBzxxsspquqquAAAAEEEBAxuuuuuxpppmmijbccb8222}[[[}}}[[}}}}}}[___[[[_}}::]^]({{{!'',,!!]]]:[_122aaa66aaaaaabfhlpttpppquuxxAzBGIMMNOPPQQQPPPOONLMLMKHEEzCBEAwqqunjjkkbbabfb62[[[(", +"({!!!';;;;;;;;;==%&&%%%&&&%&&&***;-',!{[[166bbknqsyAAAwwyAAAzAAwwuutACEEJKKIIJJHIIKEEAxwwuutquuyAAyABEEAyxuuuuxpspmmjjbbbb62}}}[[[[[[}}}}__[_:_:([(__[[___[:_//(({!!]{{((<1|1356988999a9cccfjiotyywttxuuzzAAEGHKMNOOPQQQQPPPPONNLMKFEHAAEEAwqqunikkkbb8bf62}[[[(", +"({!!!';;;;;;;;;==%%&&%*%%%&%%%**=;;''!{^_166bhknqsyyAwwwxAACAAzxutuuxBEEIKKIIKIKIKHHEAAywtttuuxyAAwwABEAyxxuuupppqomiicbb6a2}[[[[[[[[}}____(([((((((:_1:|1:}1____({{{{(((_1|}34688a8abda9ecchmptAAyyyAAACAEEHJIMMLNOPQQQQQPPOOOOMMMKIHBBEEAwqqunjjkeb88bc62}[[[(", +"({!!!';;;;;;;;;===%%&=%%%%%%%%==;;;''!{^_166aekvqwyyAwwwxzCBCBzxxuxxxAEHHKKKKMMMKIEEEAAwxtuuquuyAzxwyAyAyyxpprpppqqmjfbcba62}[[[[[[[[____((((^^^^:[:[[[1|}[[_<<__({{{{{((_<11|366a68899a8bbdflouwAAyyAAACCCEIIKNNOOPQQQQQQPPOOONONMKIHCCEEAxqqunjkkbb8acc62[[[[(", +"({!!!!;;;;;;;;;===&%*&&&&%%&&=*-=;;''!^^126bagjrtvyywwwxxzCEEAzxuuuxxCCHHKMMMMNNKIEBDyyxxuupqquwyAwtwuwyztprppprrqqlifbb6622}}[[[[[(___]]((^^^^[[[:[[[:[[1:[_<___{{!!{{(((_}_|266a6668668aa9filotyAyzzAACCCHIIKNOOOPQQQQQQPPOOONOMMKIIEEEHAyuuunjjkb88bb822[[[[(", +"({!!!!';;;;;;;;;===%***&&&&&=***;;''!{^_126bhgjqtvyywwwxxzBEBAxxuuuxxzEHIMNONMMMKHBByxxuxtspqrquwyxtuuttwtqmmmommmmljfbb662}}}[(((((__(](^^^^^^[(((((:[[:[:[}__<,'^^_122bbgjmstvvywwwxxzAEzxxxuxxzzzEIKMNOOMMKIECvvqqqronppoqtxywuqlnmptpoiiijjllliecba222}}(((((_(((^^^^^{{{{{{{((((((_:[:<<<<_]{!]]]^]]][[[[}}}2}222268a8bhipwwxuwwwzzBBEGJKMMOOPQRRQQQQPPPPPOONMKIIIHBwzwzppmkeabcc62}[[[[[", +"(({!!!!';;;;;;;;;===;=-=====;;;;'''^^(_2268hgjmvvvvywwwwyzABzxxxxxzzzBIIIMMNNMMKIGzvtqqqmnnnonquwyxuqnkklppoifiifiiifecb622}}_((((((({^^^^^!{{{{{{{{]{{]{(([:_((:<]]!!!!]^{]:[^[:[:_2}2}266a8ahimpwxustwzxAAEEGIMMMOPQQQQQQQPPPPPPPOOMMMKIEyyxxppmmjbbhba2}[[[[[", +"(({{!!!!;;;;;;;;;==*=;====;;;;;;,'^^^(_2288bgmmsvvvvwwxwyzzAxxxxxzzzCEHIIKKMMMKIEGCvsqqmnnnnnhmquwwuonkjiiooliiijiiiief86222}_(((({(({^^^^{{{!!]!]]{^{{{{{(](_((__]]!!!!^^]^(^^_[[1[[}}2226668gelqwttupwxxAACBGGKMMNOPQQQQQQQPPPPPPPONNNNKHAAxwpomkiififa22}[[[[", +"[(({!!!!';;;;;;;;;;;;;;;;;;;;;','!^^(_}228bgjmvvvvvvywwwyzAAAxxxxzzCEEHHHIIKMMKKEEAwuqqmnjnnnjhmqtuunkkjfiloiffffccbife8622}}_((({{({^^^^{!{!!!!!!!!{{{{]{](]((](<(!!]!]^^^]]^^[[[[[[122226668bgkqtwsrtuuuyyBCGGILKMOPQQQQQQPPOOPPPPOOOOONKIEAyxokkhjhifb622}[[[", +"[[(({!!!!';;;;;;;;;;;;;;;;;;;''!!!^(_}}2aabgjmvvvvvvywwwyzzAzxxxzzCEGHHHEIIIKMKIEEAvuqmmmjjjnhjjmuuonkheheiiifcfccc9bb98622}__(({{{({^^^^!!!!!!!!!!!{!!!{{{]]//(/_(]]!]!{^^]^[[[[[_[[222222888hghmwwsruuuuyxzACCHFIMNPPQQQQQPPOOOPPPOOOOONNMIIBAtpkkeffbb8622}}[", +"}[(({{!!!';;;;;;;;;;;;;;;;;;>!!!!!{__}}28bdjmmvvvvvvyzwwwyAAzAxzzzCEEHHEHIIIJKKHEBAvuqmnmjjjjjjhmqunkkhbb8bfffbccc999988a62}__({{{{({^^^{!!!!!!!!!!!{{!]!{^]{]:<:::]{]^]^^]]]][^[[[}2}2222668adghottsuuuuzyxzzACHIFKNOPQQQQQPPOOPPPPPOOOOOMMKIECwtqmiifbaa866a22", +"2}[(({!!!!';;;;;;;;;;;;;;;'!!!!!{{([[}2a8bdhmsvzzvvvvzzwwzAAzAzzABEEHHEEHHIIHHIHGEDvuqmnnjjjjjhhmquokfbbb888ffc9cc998866662}__({{{{({^^^{!!!!!!'!!!'!!{]]!{^]]:::::(]]]]^^]^]^[^[}}}}}2}2666a0dhjotxxuuuuwxxAzzCEIFILNPQQPQPPPPOOPPPPOOOOOMKKIHBBywtponc888826a2", +"222}_({!!!!';;;;;;;;;;;;;;'!!!!{{^([[26aabhmmsvzzzvvvzzzwzAAAAABEEHHEEEEHHHIHEIHHEDwuqmnnjjjjjhhmqomkjcb8a68bc99995555866222__({{{{(^^^^{!!!!!''!'''!!!!]]{{{(:_:::({]^]^^^]:[[[[}}}}}}266aaaaeejnuwxuuuwwwwzzACGIIKMNOPPPPPPPOOOOPPOOOOONMMKHHCAwwxwwplhba8a226", +"22222_{!!!!';;;;;;;;;;;;;;',!^^(([[[}266ademvvxzzzzvvzzzABzAACBEHHHEEEEHGHHIHEHEEBDwuqmnhjjjjjhkkmomjeh888a85095555335544222__({{{{({^^^{]!!!!'!]'!'!!!!{]]{{(:_:_<_]]]^{^^^[[[[[}}}}}226aaabbehmquywuuwwwwwzzzCGFHFKNOPPPPOPPPOOOOOOOOOOOOMKIEEAytwwxtpoheb8882", +"222}2<(]^!!';;;;;;;;;;;;';'!,^(([[[[}668bhhhvuxzzzzzvvzzzCCzzBEHHHEEEEHHHHGHECBCEBAyuqnnnjjjjjhkkmomifea6aa475534224443||||2__({{{{({^^^{!!!!!'!'')!!]{!{{]{{(_<<<1_(]]^{^^^::_[[[}}2227aaa8bbhkmquxxvwwvwwzAzACGHHFKNOPPPPOOOPOPOOOOOPOOOOMKIEEzxxtwwtppplifba8", +"a22}__(^^^^';;;;-;;;;;;;'''!,{([[[[}668abekrvuzDzzzzzzzzAABBABEHHEEEEHHHHHHHEEzBEBDyturnnjjjjhkkmnnmkjjc8a744432}22}}}}|1<_<<_(({{{({^^^{!!]!!!!'!!!]{{{{{{]](__|_1__]^]^^]::::[[[}2227778888hhkmquyAxwwwwxzzzACGHFFKNOOOOPOOOOPPOOOOOOOOOONIHHBBwxxwwuqqppolihh", +"h8a2__(^^]^!'';>;;;;;;>;'''!!{([[}}6668abkkqvxDDDzzzzzzzACBCCEHHIEEHHHHHJEHBEEzCGBDAxurmmjjjjkkkmmnmkhheba541}22}}22}}}::^(_((((({{({^^^{!{]^!]!')!]!!]~{({((:[<}|11_]]]^^^:::_[[22277777888bgkkmpuyyyxxwDAzyACCGHHFKMOOOOOOOOOOPPOOOOOPOOOMIHEEAAxxttpqqqnoplli", +"mfc61_{!^]^!!!!''>;;;;;;;;'!!{([[[2228abkhrvvxAADDzzzzzzzACABEEEHHHHHHHIHGHBCAAzAAAAxuqrnjjjmkkknmlmlfcfec74[}2221111_}:::]^]{{{{{{({^^^{{]!^!]!!]]!]!{]{/(((_1|}}111:::_([_::}222277777a888bghkqptyAywzyDAAyyCCGHFFFKMOOOONONOOOPOOOOOPOPONKGCByyuxyyppmmmmoopl", +"lifc9|_^]!!^{~{{'';;;--;;;'!!{(:[222600bkknvuDBBBDDDzzzzzAzABEEEEGEEHHHIHGEBEACCAAAAxxsqmjmnkkkmmmlmlifiic04}}}1_<<<<;-;;'''!{[[2260bagnnvuDDBECDBCzzyADzAAEEBAAAEEHHHHHEEECBBAADAyxxuummnmkkkkkmjmmifiic92}}_<|',''!{[[2260bhgmvutyCGEBDBzzzyDxyABBBAzAAAEEHHIHHHCBCAAADAAzzxupmnmmhkkkmjklifffd922}_<<<(((/{{{)),''>;;''!^^^^]({{{{{{{{~{{{]](____}11|4|221____1114446aaaa0adbeffehmmmqtwEECCAzzzzzzCEHIFFIMNNNNNMKLNOOOOOOPQQQQOMKFBzzwytusmmmqqurmf", +"e9aa7445cd95}<]^]!'''''';',''!{[:22a0ahnnvvvDBGBBDBzzwyzyDBEzxxAzAABHIIHHIHGCEABAAAAAAAzturmnhhkkkjkiidccd5221_<<__((({{{!'',;;;;;'''{^^^:{({{{{{{{{({]((__:__|114414}_____111226666aaaa9behjilqqqtyEECCCzCAzzzCEHEFFIKNNNNMMKLMOOOOOOPQQQQONKHFAzzyywprssmqqlif", +"e8a85375955743}:^]!''''''',''!]^[22608gnjvuvDAGBBDzzzwvwyABAzxxxzAABHIHHHHHEEBAAAAABAAAAwuqmnmhkkhkkiicccd963|<<<<_(~~~)),''';;;;;;'''{^:[{]{{{{{{{{{{{^(__::<|11442|}[[[_[}}222aaaa0898abbbejlquuwyBEEEEEEEBBBEEHEEFIKNNNNMIKLKNOOOOOPQQQPONMIFDAzzzvvvrrsmhgfb", +"baa777753}}}3437}_]!'''''!!!'!{^[2260agljqqwDADBBDzzzwywzAzzxxxxxABBEEEEBHHHBAAzyyAAAAAzwtqrqnmhhhkkiifcccc654|____~{~~))''>;;;==;;;'']{:[(({]^]{{~{{{(((_::<1|4443332}[[}}1222000aa9c9aaaabejoquuuyBEECHFIHHEGEEHEEEHKMNNNMKLKLMOOOOOPQQQPPNMIHFDAzzzvvvvrmegba", +"222|7572[<[:|1|742|[!)'''!]!!{]][22678gjjqqwDDDDDDxzwxvxzAzxuuuxxzBEEEEBEHHBAAwxyyyAAAAwttqrqqljkhkkkiiecdc954|___//{~)),>>>;-====;;'''{([[((]((]]{/(((((__<:11|4353552}}}42770ddabbdccccdhgiopptxwABEGEIHIFIFFFEHECEHIMNNNMKIKLMOOOOOPQQQPPOMKHHEEEAzxxvvrmedaa", +"2}}1774[[:[::[|4443|:{!''!!]^{([[}}6a8gjjqquDAADDDxzwwuwzwxuuuuxxxBEEEEEHHBAyyxxzyyyzAzwwtpqpooljjjkkiifcdc993|<__//)))),>>--*%%%==;;''!](:((](((]]/(((((_<_<1|435575955775700ddihhggfffikimopptwwxABHEEHIKKKIFFEIEECEIMNNNMFILMMNPOOOPQQQQPONKLHHHEFzzxxxrmed86", +"2}}131_^]:^::_14|1233}({'!!!](__:}2778gjjrquDAADDDxxwwwwzxusuuuxxzzBBBEHHByyxxxxxywwyyAwwupuqnoomkkkmiieffc995|<__//~))),>;--*%%%%*;;;,!{{(_((:(((:(/<:__<_1|4377590990775000ddijifikfiiimmmmpqppwwABHHHHIKKKIIIHIHECEIKNNNMIIIMMOOOOOPQQQQPOOMLKHIFHDDzxvrmed86", +"2}}1|_{^^]^_<_1111:}334<^]!!!{(:}22778dikmquwADDADxxwwwyyuuqvvuxzzzBzEEEAAwuuuuxxwwuxxxwwtrqooopmmmmmllffffc97||;-=%&&&&**-;'!]]([(__:_::/_<<<<|11|4355599900557909ciiiigggkfiikkkkmnnrtxxBHHHIKKLLKIIKKIEEEIKMNNKIFILMOOOOPPQQQPPPOOMKLKIHFDzxvrmed86", +"2}2__{{{{{((__111<_[}323|:]!!{{[}62088djjmqtwAADAxxxxzwyuuqvvvuxzzzzBEEAywuuuuuupstpuxxtwuqqlnnmmmmmmoliffc9673|_//~~),,,>-**%$$$&&=--'']{]_______<<<<||||3||47579999990099ccgiiiijgggcfghhgggijjquuyBEEEIKMKKKKKKIHEHIKNNNMIHIIMOOOOOPQQPPPPOONMLLMLHDzxvrmed86", +"222_({{!!{((_11311_[<:}2|11:({/:[220agdjmmqtvAADDyvxxywyuqqvvuuxxxzBEEAywutuxuspppsqutxuwtrnmlkmomliloonifc9663|1>>-**%$$$$%==-''!{((1<_<1<<|<||||||33347799ccffdccccfgjkkggddggcdbbdhheehmqqwAEECGIKFFLKKKKIHIKMNNNMKFIILOOOOPQQQPPPPOONNNMMLHDzxvrmed86", +"22}[(({{{{{{__2221__](:<11|||1_::220bghjmmquvyADDyuxwzyyvqqqqrruxxzGEAywxuxxtpprrppquuxtwtqqnjkjjillnilolif9a63||>>-*&&###$%%==>''{(_1<|<|111||||||33357709cccffcc99cghhhhjghddgdbbhbdgeehmmqwABBCBHIKIFIIKKIHIKMNNONKFFIMNOOPPQQQQQPPOOONLNMLHDzxvrmed86", +"22}[(({{{{((([}}2|__^](::<||752}}2609gglmnqtvyADDxvxwAyxqqqqsrquxzBEBAyxxuuxtutsssppstxtwtummkhkehijiilolij9aa3|1>>==&&####$%*=>>'!{(__1_111||11||33355900ddccfgc99ddhehhhhhhddddbbbabheeemmmtyCBCCHIFIFIIKIHEHKMNNOOMKFKKOOOPPPQQQQPOOOOOONMLHFzxvrmed8a", +"a}[[(((((({{[[[}}_1<<]^]^[_1459556678gglqqqtvyADyAvxxAwwqqqqvrruxzBEAywxwxxttwwyvvwwtxywyutpmmkheehhiiloilic9673|_<~~),>>;==&&####$&**;>,!{(_|||||1||1|33335599990dccfffddhhhghhhhhghdddabbbhheeehmmqyABBCEHFKIIIKIEEHKMNNOONKKKMOOOPPQQQPPPOOPPOONMKHFzxvrmed88", +"a2[[[(((((([:[[}[}<__]^^]^]_|3999990adgjqqquwAADDDwxwzwwmmqqunruzACyyywxwxwyAEEEEBAAAAAAAwwsomkhhbbbejliiiif9673|_;===%$@@@@$&&*-;'){{(_|11|||11133555569990cccghfebhhhghkkhjfgdgggbbehhhjjhmqqyABCCEFIIFIIKKIHIKMNNOONMKMNOPOPQQQPPPPOOPPPONNKHFzxvrmedb8", +"8}[[[[((([[[::1}}}_|__]/](^<<1599cfdbggkqpqwyAAADDxxyAwtsmqqquoxzzywwxwyAABEHKMKIIHEEBAAAAAwpmmjjbbbfiiiiiifc953||-==%%$#@@@#&%=*>>'!)(__1<1||43347555599999ddghfifghggklnjmmmiigghhfhghggjjqquyAEBCCHFKKIFKKIHIKNNOOONNMMNPPOPQQQQPQPOOPPPONNLLFDxvrmmhb8", +"6}[[[[[[[[::}22}}}}_<_<_:/(__137ccfgfigimmqvyACADDzzzAztsmqqqquxAAvtwwABEEHIKMMIEEBAAywwyABytqnjjgbhhhgiiiifd99531;==%%$@@@@#$%%=;;,,!~(__|_|||33555550999cccdggiiijkjlooommmollkkkffghghkjjnquAAEBCEFIKKKKKKHHIKMNOOONNMNNOPOPQQQQQQPPOPPPPONLLFDxvrmmjga", +"a6}[[[[[::[}22662}}(//<_<__<_}|580fiimomrqqwyAEADDAzAywusmqqqvxzAwtwxyBEHIKKKKEBAwwwxwtwyyAywqmoijijhfhfiijif8853|<<~)),;=%%%#@@@@##$%%*;;,!{/_<<||1|145559709cccffiillllllopprpppppoommiiikkkkkknmuuAAEECEFIKKKKFKFHHKMNNOONNNNNOOOPQQQQQQPPPPPPPONLLHDxvrrmhgb", +"66}}[[[[[}}2288864}}({{(1||1_}|298fgiopprqqvvACADDDzzvvsssqqquxzzttwyAEIIMKIHBAywtttxwwwyyAywtpmlmihehcfiiiff9973||'!~/_<<|||3355999ccdgfgiillllollnoorrpmoqoommoloompqpqttyyEHIHGHKKKKKLKKFFIKMNMNONNMNNOOOOPQQQQPPPPPOOOOONLHFzxvsmhdd", +"8666}222a6bbfeifif92[((/_|<_}}2269dfmmpwwwwwyABEBDEEzxvvtutqqxwxxwyABHIIHHHEEEEEHEEEEEBBABAAytpoliiiighceffgcc8953|;%%$#@++@###$&==;>,!~/<<<<||3335599ccggfiijllnnlloooopppqqpoomomlmmmopqqttyAEIKKIIMMMMMKKLKIKKMMMMNMMMNOOOOPPQQQQPPPPOOOPPOOKLFBxvsmmed", +"86666226bbbccjjefc6|[(((((/(::2669dckkptwwAAAACEGEHEAxxxwstuuxxxxwAEEIIHEHIKIKIIIHIIHIEEBEBAAwppojhfiffcddddc88653|;*%$#@++@@##$%%*;>,){//<<||||355599ccggfiijllonpppppttwwtxwttpttpppppputtwAAEIKKKKNOOONNMMKKKLNNNNNNMMNOOOOPPPQQQPPPOOOOPPPOMLIDzvssmed", +"d86688abcbccehgif86}}[(({{{^:[}659dekoouuwABEBEEEEHEEzxvvwswyDuxzBBEHIHHIKMMMKKIIEHIHIIIHHEBBAwponijijfcccccc98655||<~),>;*%$#@++@@#@#$%*->,,)//<<<||||35599ccfiiillooppttwwwwyyyyAAyywwywwwtxzzyyABCHIMKKMNOOOOOOOMMMMNNNNNNMMNOOOOPPPQQPPPPOOOOPPPOOMIFBzytmme", +"ddba88bbcciikggfc82}[:[{{^]^^::27dffkooptwABEHHGHIEEBAxzvvwwzyuxABBHHHHIKMKKKMKIIHHIHIIKIHHEEBAtpnjffefffcd9c996533|,)~///<|||335599cfiilopppttwwwwwwwwywwwwywwuppppptwwyzABEHMNNMOOOPPPPPPPOPPPPPOOONNOPPPPPPPPPPPOPOOOPPPOOOONMIEAzsmm", +"jjkkkhfhgkmmonkg6a6[::[:[[[:::2}60agkoupuwyABHIKMKIHBDDzzzACAyACEHIKHIIIIIHIIIIHHEBBAEEEEEHEEEBytoifbhcfdcccc9533|||,)~//<<||3355599cffillppptwwwwywwwyyyywyywwwutttttwwwyyABEIMMMNOOPPQPQQQPPQQQQPPOOOPPPOPOOOPPPPOOOOOPPPOOOONMMKGAwtq", +"qnokkkggggillqjg862[}[[:::[[[222788glouuuyAAEGGKNNKIEBBDzzBBAABEEIIKIIIKKIHHEHHEEAAyyAyyAAEEBEBAwpljeedcc9ccc953||||<<~),>;%$#@++++@@#$%%*--,)~/(<||||355999ccfiilopptttwwwwwwyyyyyAAAyywwwyyyAAAAzEEIKMMMNNOOPPOPQQQPQQQQQQQPPPQPPPOOOPPPPOOOOOOPPOOOOONMKGEBwq", +"xuronljeejjjqmhd8666}:[:[::[[22608ggjppuwyAAEEEKMNMIIEBDEBEEBEEHIIKKKIIKKHEEBBBBBAzyywtwwwAEBBBAwpoijedd99cc9953|||<<<~),>;%%#@++++@@##$%*-->)~/<<<|||355599ccffiiloptwwwwywwwyyAAAyyywwywyyAAAAACEHHKMNNNNOOOOOOOPPPPQQQQQQQQQQQQQPOOOPPPPOOOOOOOPOOOOOOMMKGEAA", +"Eywuoljeemmqmmed8aaa}}[[:[:[422a08ggioqqwyAAEEHKMMMKKIEEEEEGGHIIKMKKKKMKIEBAAAAAAAAAywttpuwAABAAwtolifdda8c995531|<<<<~~,>;=%#@++++@@@#$%*->,,~/<<<||||335599ccfiiloppwwwwyAyyyyyyywwwwwwwtwwxyyAEEEKKNOOOOOOPOOOOOOOOPQQQQQQQQRQQQQPOOOPPPOOOOOOOOOOOOOOONKHHHE", +"HHAyuqqmmqqqpmhdd8662}:[:[:2226788glinqqwAAEEEIKMMMMKKKHHHFHHFKKKMKIKMKIEBAABzAAABAAAwxupqtwyAAAwtpoljgd890999541<<<;=%$@++.+@+@#$%%->,)~//<<<|||3355999cfiilopptwwyyywwwyvwwuutttpstquuuxAAAEHIMOOOOPPPPPPOPPOOOPQQQQQQQQQQQQQPPOPPPOOOOOOOOOONOOONMMMJII", +"KHHEwuuqqqwtpkked82222[:[:22}267agglrrqtwyAEEHKKMMMMMMKKKIIIHKMNNMKMMKIHGEABBAAyyDyyyyuupttwwyyAywtpoifd09999953|1>=%$@++.+@+@#$%*->,))~//<<<||335599ccfiillopptwwwwwwwywwwvxxwwwwwwwwyAAACEGHKNOOOOOPPPPQPPPPPPQPPPOPPQQQQQQQQPPPPPOOOOOOONNNNOONNMNNMK", +"MKEEEBAyyywtpkmeda82222222222607aggkqrqvvAACEIKKMMMMMMMMMMKKKMNNNNMMMKEEEECAywwstsstzwuuutwwwwwyywtpplic98999953|<=&$#++.++@##$%*-->))~//<<|||355599ccffiilllpptwwyyyyAAABBAABBEBABBBBEEHGIIKMOOOOOOPOOPPPQQQQQQQPOOOOPQQQQQQQQQQQPOOOOOOOONNNOOOMNNNNN", +"MKIEEEBBABzypmkb0082266689889909ggkjmquvvABBEIKMMMNMMMMNMMMMMMNNNNONKIHIBBzzzxssrrruuuuuputwwwwwywwtolifcb955553|=&$#++.++@##$%*-->,)~~//<<<||35599cccgffiloptwwAABBBEEEEEEEEEHHHHGHHKKKMMNOOOPPPOPPPOPPPPPQQQQQQQPOOPQQPPQQQQQQQQPOOOOOOOONNOOOOMMMNN", +"KKKHHEHIIEAAtmme0088688cccfjiigfkglmnqtvwyBBIIKMMNNNNMNMNNONOONNNOONMIHEEAzxxuuuuuuqusuuttuwtwtwwwwtooiib9955553|<-&&#++.++@##%%*-->,,~~/<<<|||335599ccfiiloppwyABBBBBEEEEHHHHHHEEHHHIKKMMNOOOPQQPQQQQPPPPPPPQQQQQQQPPQQQPPPPPQQQQQQPPPPPPOOOOOOOONMMMM", +"KIJIKIIIIIHBwtmefd9ccffccfiilklqmporqqwvyCAEHIMMNNNNNNMNNOOOOOONOONNKKJEBzAxuuuuuvvqqqqtuspttttwwywwpoliec957533|<-&&#+++++@##%%*-->,,~~//<<|||333599ccfilopttwwyAABBEEEEEEEEIHEEEEEEHHIIKMNOOPQQQQQQQQQQQQPPQQQQQQQQQQQQPPPPPPQQQQQPQPQPPPOOOOOOOOMNML", +"FIIIKMKIIIHECwmmigkilifccffkkllpptupqtvvyCBHHIMMNNNOONONNOOPPPPOPOMMMIHHGAzAxuvuuuvqqqsttqutttwwwyywppliec95733||-*&#++++@@##%%*-->,,~///<<<||335599cfilloppptwwyyAABBBBEBBEEEEAACCBCCEIKMNNOOPQPQPQQPPPQQQQQQQQQQQPQQQQQPPPPPPPOOPPPQQQQPPPPOOOOOONMK", +"KIIILMNNMKEEEAupnomoijfeccgggjomttxxuvyAyCBBHIKMMNNOOOOOOOOPPPPPPONMKIJGECzyxywvuvuqqvsuupuwwwwwwyywtplif9997731<<({~!),,>>-*&$@+++@@##%%*->>,))~//<<<||335599cfiloooppptwwwAAAAAAAAAADBBBAAAAEEHIKMMNNOPPPPPPPPPPPQPPQQQQQQPPQQQQQQQQQQQPOOOOOPQQQQPPPPPOOOOOMM", +"MLIKKMNNNKHCBAxxttqoifbc9dddeekmpuwwyAAyAACBIIKMMMNOOPOOOOPPPPQQPONMKIJJECBzxwwwwwtttvstqstuwwwwwyywwtoifc9973||--**$@+++@@##%%*->>,)~~///<<||355599cfiloooppptwwwyAABBBBBBAAABEDBDEEHHIKMNNOOPPPPPPPPOOPPPPPQQQQQPPQQQQQQQQQQQPOONNOOPQQQQQPPPPPPPOOM", +"LMMMKKMMMKIGCAyBywpokgddd00bbggoostxAAADyABEEIIKMMNNOPPPOPPPPPQQPONMKKIGGGCzzzvvwttttsvsuvttttwywyyywtplicc053|||>-=**$@+++@@#$%%*->,,)~~~/<<|||355559cfiioooopptwyAAEEEBEEBEEEBEEEEEHFIKKMMMOOOPPPPOPPOOOOOOOPQQQQQPPPQQQQQQQQQQQPOONNOPPQQQQQQQQPPPPOO", +"ONMMMMMMKKHEEABABywmkgdd00bbgggmlpuwAAAADAAEHIIIKMNOOOPPPPQQPQPQPPONKKIIGGCCCzDytuutssvtvusuutvwwwwywttoicc973||<>--;=*$@+++@@#$%%*->,,))~~/<<<|||35559cfiilooopptwyAABEEEEEEEEEEHEHHHIIKMMMNOOOPQQPPOPPOOOOOOOPPQQPPPPPQQQQQQQQQQQQPPOOOPQQQQQQQQQQPPPPO", +"POOONLMLIIEEEEEAzwtpmgdd0bbbggllqruwAAAAAAAEHHIIIMMNOOOPPPQQQQQPPPOOMKLKIHGCCAAAxvvvvvvtwuusuttvvwwwwttplic973||--**=*%@++@@##$%*-->,,))~//<<<<||35559ccfiillmopptwwyBBEEEEHIEHHHIIIIKKKMMNNNOOQQQPPPOPPOOOOOOOPPPPPPOPPQQQQQQQQQQQQPPPOPQQQQQQQQQRQQQQP", +"PPOOOOOMIFECEEHAytpppligecbgggnmrqquwwADDAABHHHIKKMNOOOPPQQQQQPPPPOOONKKKIIGCBAAzvvvvvvtwxxvutwwwwwwwwtpoifc95||<-;**%&%#@#@@##$%*-->,,)~~//<<<<||355559cffiikllopppwwAABBBEHHHIHEGJHJJIIMMNNOOPQQQPPPOOOOOOOOOOPPPPPOOOPQQPPPPQQQQQQPPQQQQQQQQQQQQQQQQQQ", +"QQPPPOOLIFBCEEEAywppppoljekggnlrvqttttxDABDEEHGIIKMNNOOPPQQQQQQPPPPOOONKKKIIHGGCCzzzzxwvxxxuuwwwyytwwwtpoifc95|1<--=*%&$#@##@#$$%*-->,,)~~///<<<||335559cffiiiillooptwyAzAAzEEHHHIIJIIIMMMLNOOPPPQQPPOOOOOOOOOOOPPPPOOOOOPPOPPPQQQQPPPPPQQQQQQQQQQQQQQQQQ", +"QQQQPPOMIHECBEAwwwpooppolmmkknnquutuutuwDDEEEHEHIKKNNOPPPQQQQQQPPPOOPOONNMKKKKHGCCCCzzzxxxxxvwvyyywtttwtoifc9531--;=%%$$#@##@#$$%**->,,)~~///<<<||3355599fffiiillopptwwyAAzABEHHIJIIIKKMMOOOPPPPQQQPPOOOOOOLNNOOPPPPPOOOOPPOOOPPQQPPPPPPPQQQRRRRRRQQQQQRR", +"RQQQQPOMKIHCCAwwuuuoooppuqmmqmrruttqqqutwDBEEBGEIIKNNOOPPQQQQQQQPPPPOPOOOOMMFIIHGCzzzAAzzxxxvwyyAAywwtttolfc9531>-*=%&$$#@####$$%*-->,,)~~///<<|||3355599ffiffiiloppptwyyAAzBHHHIIKIKMMNOOOPPPPPPQQPOOOOOONMNNNOOPPOOOOOPPPNNOOPPPPPOPPPPQQQRRRRRRRRRRRRR", +"RRRQQPONMKKCzytuqqtuoooutuqtqqvvutuuuqqquwBEEBGEEIIKNOOPPQQQQQQQQQPPOOPPOOOMKIIHFECzzzAAAzzyyyyAAAywwtttplfc953|>-*%&&$##@@#$#$%%*->>,))~~///<<<|||355599ffifgiiloooppwwyAAABEHHIIKKMMNNOOOOPPPPPQQPOOONNONMMMMNOOOOOOOOPPPNNNNOPPPOOOOPPPQQQRRRRRRRRRRSR", +"RRRQQPPOOMKEAxutmqqutuuquuuwtxuuuuqquqqquwAEEBAECHIKMNOOPPQQQQQQQQQQPPPPPOOMLIFFHEEzAzzzABAAzAAABBAyywttpoic953|--*%%&#@##@#$#$%%*->>,))~////<<<||335599cfffgfiiloloopwwyAAABEGEIIKMNNOOOOOPPPPPPQQPOOONNNNMMMMNOOOOONNOOPPONNNNOOOONOOOPPPQQQRRRRRRRRRSS", +"SRRQQPPOONNHCyputmqquuutupwywyxxwuuqqqquuuyEEEBAEEIKKNOOPPPQQQQQQQQQQQPPOPNNMMKIHHEEDDDDABBBBABEEEBAywwtpoic9531-**%%&#@@#@#$$$%%*->>,,)~////<<|||335999cffifiiililopptyyAABEEEHIIKMNNOOOPPPPPPPPPQPOOONOONMMMLNNOONONNNOOONNNNNNNNNNNNNOPPQQQQRRRSSRRRSS", +"SSRQQPPOOONKEAyttmmqquuuupwwAAyxwuuuuqqquuyAEEBBGEHIMNOOOPPPPQQQQQQQQQPOPOOONNMKIIIHEDAAABBEEEEEEEEBAAwwpoic953|-**%%$#@@###$%$%**->>,,)~//<<<<||3335599cfffffiililooptyyAABEHHHIKMMNOOOOPPPOOOOPPQPOOONNONNNNMMNOONMMMNOOOMMNMMMNNNMKMMNOPPQQQQRRRSSSSSS", +"SSSQQPPOPONKJEAttmmqmqquuwwwAAAzyxuuuqqqquxyDDEEBEHHKNNOOOPPPPPPQQQQQQQPPPPPPONMKKIHHEDAABBEEEEEBEEBBAwwtplf953|-*%%%$##@###&%$%**->>,,)~//<<<|||3335599ccfcffiiiilopppwyyAAEEEHIKMNNOOOOOOOOOOOPPPPOOONNONNNLMMNONNMMKNOOOMMMKKKKMMMMKKMNOOPQQQRRRRSSSSS", +"SSSQQPPOOOMKIHEwutqqqmqqwwwwyAAAAyxxuuqquuwyyABEEEHIKNNNOOOOOPPPQQQQQQQQQPPPPOONMKKIHHBBACBDEIHBBABEBAywtpoic95|<-*%%%$##@#$$&%%%**->>,))~~/<<||||||3359cccfcffiiiloopptwAAAAEEEEIIKMNNOOOOOOOOOOOOPPOOONNOMMMMKKMNNMMKKKNOOMMMKIHHKKMKKKKMNNOOPQQRRRRSSSS", +"SSSRQQPOONMIIHHAwwwqqqqttwwAyzAABAxxxuuuuuwwwyABEEEIKMNNNNOOOOPPQQQQQQQQQQPPPPOONMMIIHEEBCCBEIHBAAAABBywwppif953|-**%$$##@@#$&%%%*-->,,)~~//<<||33333559cfffffiillloopttwyAAAEHEEEIIKMNOOOOPOONNOOOOPOOONNMMMLMIKMNNKKKKKMNMMMMKIEEJHIKKIKKNNNOOPQQRRRSSSS", +"SSSRRQQOOMKKHHEEywwwyywtttwAAzzABAzxxuuuuuxwwyyAEEHIMNMMNNNOONOOPPQPQQQQQQQQQQQPOOMKIHHEGBAEEHEBAAAABAAywtplfc53|>,))~~//<|||3333559cffiffiiilllopptwxAABBCEHHHHIKKKMMNOOOOOOOOOPPOOONNMMMMKIKKMMKKKIFMNMKKKKIHEECGHHIIKMNNOOOPPQRRSSSS", +"SSSSRRQQPMKFEGCByywwwywtppzAAzzDEBAzxxuuuxxwwwyABEHIKNMMMNNNNNOOPQQQQQQQRRRRRQQQPPONMIHEEEEEEEEEAAyyAAyyywpoic95||//~),--*%$$##@@@$&&**-->>,))~~/<<|||3335599cffffffiiiillooptwyABBEEHHIIIIKKMMNNNNNNNNOOPPPONNNMLLMKIIKMMKKIFKMNMKKMKFHEECCCEGHIKMNNOOOPPQRRRSS", +"SSSSRRRQPOMMIGAzAyyywwwtuxwxzAAEDAAAzyxxxxywtuwDBEHIKMMMMMNNLNOOPQQQQQQRRRRRQQQQPPPONKIIIHHEEEGBBAyywwywwwtpif993|-*%%$##+@@$%%*--->>,,)~~/<<||333355599ccfccfgfiiiiloopptwAABEGHIIKKKKMMNMNNNNNNOOOPOOONNMKLMKKIKMMKKIIIMMKIKMKFEEEzzzzCGGIKMNNOOPPQPQRRS", +"RSRSRRRQQPONMICAAzyAywwtxtttzABEEEAAAAxxxzyxuttxBEIKKKKMMMMMNNOPQQQQQQRRRRRQQPPOOOOPONKIHIIIHHEEAAyytwwttttplfc953|**%$##+@@#%&---->,,,)~~/<<||3|3335559ccc9ccffifiiiloopptwyABCEHHIKKMMMNNNNNONOOOPPPOOOONLMMKKKKMMKIIHFKMKIKKKFFFEzzzzzzEEHHKNNOOPPPPQQR", +"RRRRRRRRQPPONKHBzAzyAyzywttxxAEEEEEAAAAyzAyxutuxAEIMMKKKMMKKKNPPPPQQQRRRQQQQPPONNONOONMKIIKIIHEEBBAwttwttppplfc953|<--%$#@@#$&==--->,)))~~//<<||33333559ccccccdfffiiiilnrptwyyAEEHHHIKMMNNOOOOOOOOOOPPOOONNNMMKKKMMMKIHHFKMKIFKKIFHEzzzzzzCCCGGINNOOPPPPQQ", +"QQQRRRRQQQPONMIEAzAzBBBzywxxuzBEHDEDAAzAAAAxuuxyABIMMKKKMKKKKMOOOOPQRRQQQQPPPPOONNNMNNNMKKKKKIHEEEBywtttpppolfc953|>-%%##$&&*-->>>,))~~~~//<<||3333599ccfdcffcfffiinnrpttwyAABEHHHHIIIKMMNNNNNNOOOOOOOOOOOOOMKKMNNKIIHIKKFFHIIIIHEBzzvxxzCCCCGHKNOOOPPPQ", +"PPQQQRQQQQQPONKHEAzAABEBAzxxwDAEEHEDAAAAEBAxxuxxzEIMMMKKKKLKMMOOOPQQRQQPPPPPPPPOONMMKMNNMKIIKIIHHHBAytwtppoolic953|>-*%%$$&**;>,,,,))))~~~//<<||335559ccfccfffffiilnlnpptwyyAABEEHHEEHHIIKKKMMMNNNNOONNNNOOOOONMNOOMIIEEHIIEEIIIHIIBzzzxwxyzzCCCEKMNOPQPP", +"POPPQQQQQQPPPONKHEAAyAABBCAxwyAAEDEAAyzAEECzxxxzAEIMMMMKKIKKMNNOOPQQQQPPPPPQPQQPONMMKMNNNMIIIIEHEHEBAwwttpoolif953|>-*%%$###%=;>,)))))~~~~//<<|||355999cccccffffeiiiloppttwwwAAAABEEHGEGGJIIJIKKMNNNONMMKKMMNOOOOOOONKIEEHIHBEHIIHIICzzzwwvvvvyzzCCIKMOPQP", +"POPPOOOPPPPPPPONMKHAzxzzBBCzzyADEDDBAyAzBEEAzxxzAEKMMMMKIIIKMNNOOQQQQPOOPQQQQQQPPONMKKNNNNKIIIEHEEBAyywtwppoolic933|<~))>--*%$#++@#%*-,,))))~~///<<||33559cccffccffcfeiiilloopppptwwwAABBEEEHJHHIIJIIKKMNNOOMKIIKKMNOOOOOONMKIIIKIGCGIIEIIEzzzxvvvvvvxyzCCELNOPP", +"POOONNMNOOOPPPPOONMHAxxyzAACAzADDDEBAzAABCCBAzzzAEKMMNNKIIKKKMMOPQQPPPPPQQRRRRQQPPONMMMMNMMKIHHHHBAAywtttpooolif955||/~),>-*%#@++@#$%=->,,,,))~//<||335599ccfffcfffffiiiillllmmooqssvyADBEHIIHIIILIIKLKLMNNNNMKFIIIKMNOOPONKKIKKMKHGGHEEHIECzzvvwvvwwvxyAzCHMNOO", +"OOOOOMKIKNOOOOPPONNKBwxwxzABCzAABBAAAzAACEBBBAAzBHKMMNNMIIKKMMOOPQPOOPQQRRRRRRRQQPPOOMKKKMMKIHHHEBAAAywtpoolllifc9953|/~),>-%#@+++#$%%;>>>,,,))~/<<||335559cccccffffiiiijliiiiillmqtwwDABEHIKKKIIMKKKKKKMMNNMMKKKIIKMMNOPPNKIIIKMIHEGHECEHECzzxxwvvwvvwzyyzCIMMN", +"NNOONKIHIKMOOOOOOONMIBwxwwyACCCBBEAyzAzAEEAABBBBEIKKMNMMKIFKMNOPPPONOPQRRQRRRRRQQQQPONKIIKMKKIHIEEBBByywtpoiiiffc9553|'>,)))~/<<<||33555999ccfffiiiffffgfggkkmmqptwyDBEHIIIIIIIIIKKKKIKMNMMKKKLKKKMMNPPOMKHEIIIEEGJHHHHICCzwwvvrrrppwyzzCGHKK", +"MNONKIHJEHIMONNOONNMKEAAxxwzACBCBBAzzAzBEEBAABEHIKMMMMMMKKKKMNOOOOMNOPQQQQQQQQQQQQQPPOMKIKMMKIIIHEBAAAyttpoiiifc9953|<-%#++@#$%**;>'',){~~//<|||33355999ccfffffccfccccggkkmoqqutwyABBEEHHIHHHIIIKKKKMMKKKKKKKMMMMNOPONMIHIIHBCBEIJIIIECzxwvqrrrrrssxzzGGEI", +"KMMMIIHEEEHKKNNNNNNNKHEAzwxwyCBCBBAAyABBEECAAAEIKNMMMMKIMMMMNNNOOMMNOPQQQQQQQPQPPQQPPONMKKMMMKKKIEBAAywttpoiiifc995|<*%$@+@#$%%*->''){~{///<<||||3555999cfcccccccccccgggimmpquutuwyABBEHHIIIIIIKMKMMMMMKKIHIKKMMMNOPPOOMKKIHDzABEEIIIHGCyvvqrrrrrsssvzBCCE", +"EHIIIIHEEHHEHKNNNNNNKIEEAAwwwyACBCBBzCCGEBzACAEINONNNMIIKMNNNNOONKMOOPPQQQPPPPPPPPPPPOONMMNNNMMKIEAyywwtppoiiffc9953|<~),>*%$#+.+@#$%*>>)!~{/(/(<<|||3355599ccfccccc9cccccgggkkmmqqqqutuwyBEEHIKKKKKKMMMNNNNNMKKIIIKMMMNOPPOOONNKIDzzzACEIHHHEAAussrrrrssstzBAzC", +"CHHGCEHHHHEEEEIMNNNNMKIEBBzwwwyABCBBBCEHHBzzCEEIMOONNMIHKMNNNOOOMMNOOPQQPPPOPOOPPPPPPOOONMNNNNMKIEAywwwtppoliffc953||/~),-*%$#+..+##$&*>,){~//<__|||335559ccfccccccccfcccfggilmoomqquuxwyAEHIKKMMMMMMMMMNNNONNMMMKKMNNNOOPPOOOOOOMEBAzAzBHEEGEEBwtsummmmssswCAvz", +"CEECCBEEBBBEEEEHKNNNNMKIEBBAwwwyAACBEEHIIEAAAEHINOOOOMIFIMNNNOOONNOPPPPPOOOOOPOOPPPPPPOONNNNNMMKIHBywwwttpoliifc953|-*%$#@++@#$%&*>>,!)]~(((<|2335999ccfffffffffffffkilooooppptwxzACEEHIKMMMNNNNNNMMNNONNNNNMMNNOOOPPPPOOOOONIEABAABGEEEEEBwwummqqmmmtwwzvz", +"ABBAzCABBAABBBBBEINNNNMKIHEEAwxwxzzzBEHIKHBBBEKMNOOOOMIIIMNNNOPOOOOOOPOONNOOOPOOPPPPOPOOOONMMMMKIHEAywwwwtpliffc933|-*%$#@++#%%=*=>>,!~{](/__<|335999cccfccffffffffiiloloppptwzAABEEEEEHIKKMNNNNNMMMMNNNNNMNMMMNNNOPQQPPPPOOOMHEBEEEHGCCEBzxxwuuuqqmmqwwtwv", +"AAAzwwyABAAAABBBBEIMNNNMMKIEEAxwwwzzyBGHIHEEAEIMNOOOONKIKMNNOOPOOOONNNNNNNNNOPPPPPPPOOOOOONNMKMKIEEAywwwwwtplic9553|-*%$@+.+@$%**->,'!!~]/<__135999ccccccccfccfccdfiilllopptwyAAAABEEEEHIKMMNNNNMMMKMMMMMKKKKMMNNNOPPQPPPPOOONKIHHHHHGCCBAwttquuuuqmmqquspv", +"wwusuwyAABAAAAAAAAEIMNNNMMMKIEAzxwzzyyAEHEEEAzEKNOOOONMKKMMNOPONNOOMKKKMMMMNNOPPPPPOOOPOOONNMKKKIEEAywwtwwtpoifc993|*$#+. .+@$&%=->,,']/<<<1|5cfffccccffffffffcdfiililoptwwyyAAAAAEEEHHIKMMNMMMMKIIKIIIIIHHHIKMMMNOPPPPPPPPOONMKHIIKIECBBwtuqquuuuqqqqqssu", +"wwssstwyABBAAAAAABBEIMNNNNNMKIEAAyzAyyAEEEEECABHMNOOONMMMMMNOPONNONKIKKIKMMONOPPPPPOOOPOOONNMKMKIHEBAwtpttpoliffcc93|,')]]_1||79filiffffiiiiiiiiiiilllopttwwwyyyyyAEEEEEEEIKKMMKKKKIIHHHHHEEEEEHIKKKNOPOOPPOPPOONNKKKMKIHEEwtumqquuuuuuuqtsw", +"wwtssttwyAAAAAAAABBBEIMNNNNMMKHByzyAAAAEEEBBAACHKMNNNMMMNMMNOPOMNNMKIIKFKMNOOOPPPPOOOOOOOOONNMMMIHEBAwtpppplifcc99953|,')]_<1359dfifcfiilllliiiiiilloopwwwwwwwwyyAABBAAAABEIIKKKKKIIIHEHHGEBBACBEHEEIMNMNOOOOOOOOONNMNMKIHEAwtmqquuuutxxqmtw", +"uqmmmmstwyyyyABAAAAABEIMNNNMMKKHEywwwyyAABBBBBBHKMNNMKKNNMMOOOONNMKIKKKKMNOPPPPPPPPOOOOOOOONNNMMMIEAAwtpppplfc99553333|*$@...+#$&%*;>,')]_<|359900009dfiiiiiiiiiilooptwwwwwwwwwwyywwxxxzzAEEIKKKKIIIIHIIHEBAAzzCABEHKMKIKNNOOOOOOOOOONMKIIByuquuuomnpzyuqqu", +"uqmmmmmmswwtwwAAAAAABEHKMNNNMKKKIEAwwyABAyyABEHIKMMMKKKMONNOOOONNMIJIKMMMNOPQQQPPQPPPONOOOOONNMMKIEAywtpppolif955||<<<*%#@@#$%&**-''')~(<}357527755799ccffffilloppttttwwttppttwtttutxxxABEEIIKIIIIIIKKIEEBAAAyAABHKMIHIIKMNNNOOOOPPONMKKEEzyyAtrnnrtzxuuu", +"uqmmmmmmmsttuuwAAAAABEHHIKNNMMKKKIEAAABEBAyAEHIKMMKKKKKMNOOPOOOONKIIKMMNNNOPQQQQQPQPPOONNOOONNMMKIHAAwwpppplifc95||<-*%$##$%*;>>,,))!~](<|35772447777709cccfiiopptptttttptppppuwwwwwxwyyAEEEHHHIIHHIKKKHEEEEAABBBHMNMIIIIKMMMNOOOPPPPOMMIHEEGEytnlopxxuux", +"xqmmmmmmmssssstyAAABBEHHHIMNNMKIHHHEBABEEAAAEIKNMMMKKKMMMOPPOOOONKIIKMMNNNNOPQRQQQQPPOOMMNNONNNMKKIEAwwttppoifc953|-*%$#@++#%*>,,~~~~///<|2552243277777090ccgiloppopttttppppppptwyywwwwxxADBFFHHIIIHHIKKIEEEEABEEEHMONMKKIIKKKKNNNOPPPPOOMKEEHHEwprptxuuxz", +"xuqmmmmmmsssssswyABBABEHIIKNNNMKHEEEAwwAAywwAEMNONMKIKMNMNPQPOOPOKIIKMMMNMNOOPQQQQPPPONMKKMMONNNMMIHBywwttpolic953|-%$#+. .+@$=-,)~//<<11555575a7657509099cgfiooolopppppoloppptttwxttuuuuyAEEEEEHHHEEHIIIHEEEBEEEEHIMNMMKKKKIIIKKKNOPPPOOONIHEEEAtpptpuuxy", +"suuqqmmmmpspssutwABEBAAEHIKMNNNMIEACAwwwwwwwyBINOONKIKMNNNOPPOOONMIIIIIKMMNNNOPQQQPPPONMMKKMNNNNMMKIEAywttpplic953|*%$#+. .@#$*->,!~]<149999909a888999ddcffilollloppooooopptttppprqpuuuuwDEFEEEEEEEGHIKIIIHHEHIIIIIMMMMMKKMKIIKKIKNPPPOOOOMKHEEBwtttppppt", +"pnuuqqmmmrssusttyABEEBAABHIKMNNNMHEEEBywwtttwAEMOOOKIIKMNOOPPPPONMKKIIHIMMNNOOPQQQPPOONMKKIKMNNNNMMKHEAwttppoif953|-%$#+. .@#$%-->,)~/<|56596999cdccffggiilooliloppooloptttutpollqrqruquwAEBBDBDDABEIKMMKKKKIKKMMKMNNNMNNMMMKKKKMKMNOOOOOONNMIHAwwwwtpppp", +"njnquuqmmsssupuwBCEEHHHAABHIKNNNMKIHHHEAwtuttwBINNMIIIIMNOOOPPPOMMMMIHGHIMNOOOPPPPPPOONMKIIIKMNNNMMKIEBywppooifc53|-%$#+. +@#$%-;;'!](_||322565599gfffiiloppolllppplooptwwtpollllprprqquwABAAADDAABEIMNNNMMMKKMMNMNOONNNNNNNMKMMNNMOONMNNONOONMEwtwwwtppp", +"njhqqquqqssspuwACBBBEEHEAAEHKKNMMMKIIIIEypopptyEKKIEEHIINOOOOOPONMMMIGEEHKMOOOOOPPPPOONKKKIHIKNNNNMKKHEAwtpollic953<*%$#+. .+@#$*=;>,!](_<}}|346769099cfiiooppoilpttppoptwwtpplllooprrmqquyBADyDxxyAAEIMNNNNMMMKKMMKMNOONNNNNNMMMOOOOPPOMIIIMNONNKAwwwwuppp", +"nhjjmqquwttpsvwzABAwwyABAABEIKMMMMKIHEHEBwtptwAEEEHEEEHIMNOONNPPNMMKIGCCEFKMNNOOOPPOONNMKKIIHKMNNMMKKIEAwtpollif993|-%$#@...+@#%=-;',](_<|:|||776599989fiilooliiotwtttptwwttpooooollqrqquuABADxtuxxzAEIMNNNNMKKKMMMIIMNNNNNNNNMNNNOOPPQPOKIEHKNNNMIEBwutwtq", +"pjhemmqqwwwuvxwtwywtutxAAAABHKMKMMKKHEAABywptwAEHEEHHIIIKNOONNOONMKIHGCCBHIKKMNOOOOOOONMKKKIIIMNNNMMKKEAywpollifc953,)](_<1:}|4114700099filoolffiotttppttttppoopooolnqqvvuxABDxuuuxxxzGKMNNMNNMMKMMMHHKMKIIKKKMMKNNOOPQQQPNKGEEIKMMKKIBxuwxu", +"qnjhmmmqwwwwypsuwywtpqtwyAAAEIKKKMMMKEAAAtpptwAEEEEEIKMKMNOONNOONMKHEECCBGHIIKNNOOOOOONMMKKKIIKMNNMMMKHEAwtplliifc93|-%$#+..+@$&--')]((<<_1}|114770799cfilolfffiopttpppopoooopoolmllrvrruxEBzuxuutwwxBIMNMMMNNNMMMKEHKKKHEEHHIIIMNNOOPQQQOMHEEHHHIIKMKBywxx", +"uppnqqmmtwwwxtsmquuqmmmmwyyyAEIKKKMMMIEBxqoputyBBAABEKMMNOPONOPOONKIEEEBCGHHIIKMNNNOOOMMMKKKKKKMNNMMMKKEAywpoliifc953*$#+..@#&=;>,]((_::<|_114470770dflooiifcgmppppqpoiigglmolikjiimmnruwAAxussvvupptyHMNNMKKKKIIHHEIMMKIIIIHEABIKMOOPQPPONKEEEAtuwEIKKKHA", +"AwwyAAxwwuqqquuqlnnjmhmmmqwwwwyAIMMMMMKKEumlptABywttyAAHMOPPOOPPONKIJECCCEHIIIKKKKMMMMMMMMKKKMKKMONNMMKIHBywpoiiffc953|/),>*%#@.+@#&=->){((___<|__14770070cilpliggdflpppppplggggkoolikikjnmmqqwAAxsstunqqpptyEKNMMKIIIHEEEIMNMKIIIIEAAEIMOPPPPOOOMIHEAumotAEKMMH", +"HBAABAzAyqqqqnorooonjemmmqqwwwwuAIMMMMNMKApopwBEAwtttyyBINPOOOPPOMIIHGECCEGIIIKIKKKMMKMMMMKKKKKMMNONNMMKHEAytpoiffc953|<~),-%$@++#&&->'!{(((___|__1477770dgimoliiddglloppoigggggkkolikjkkmmnqqtwyzutvoonoppttyEIIKKKIIEEEBEKNMKKKKKIEABIMOPPPOOONMKKKHwolootAIMM", +"KHEBCAyxuuunnlmmmmmkifjjqqpwywwquCIMKMNNMHytpwBIHAtttwyAEMOONNNONKHHHJGBBGEIIKIIIIIIIIMNNMMKKKMMMNOONMMKIHBAwpoiifc955|*$#++#&*->!{{(((__<_[_1}23246dklopmliddfiilllifc9agkkiollillknqpuuuwxxwunnoookkmqwABBAEHHIHIHHEIMMMKKIIIHEEIKOOPOOONNMKMMKEwpojipyIK", +"IIIHEAzxxrookkmmqqqmkgjjjqquAyywqwBIKMNONMHAwtBKMHytuwyyEINNKKMMMIJEEEGBCEHHHIIIIIIIIIKMNNNMMMNNNNOONNMMIHEAytplifc995|*&#++#%*>'!{{((::___[_1}34226bkmppoliddciiigifc9a8akmkkollllmprsuuuuxwzxrnnkkkkmmqtwywwyyEHHIIHKMMMMKIHHEEEIKMOOOOONMMMKMMKAwpiiipyG", +"zEIMICztppmkkfjiloppmkkjjquwAAAyuuyEHMNOONMIBAEMNKBttttwyHKKIKMMKJHEBEEECCEHHHHIIHHIIIKMNNNMNMOOOOOOONNMKIEBywpoifc9953|/~)>-%#+@#%-''{{({](<:<__:<}3222adjouuqligd9fiddddd9aaakmkglolmomrqpuuuuuuyttqkkmmmmmmtwuqtutuAAEEEKMNMMKIHIHEEEIKKNOOONNMMMMMKIEApfhlpx", +"uyEMMJAwqqmjeecbcfopomkgjnwwwAAAuutABHMNOONKIHIMNNHwppptwEIIEHMMIHHEBCBCEEEEHEHIIHHHIIIKMNMMMNOOPOPOOONNKIEEAwtolicc953|<~),;*$@@$=;,){(~/]<:<:___:}422269iotwtmig9acgddgdd0788cmkgloooomqqqqsuvuswtwtmmmmkjmmuwuqmmppuwwyABIMMMMKIIHEEEIEIMNONNMMMNMMMKIIAoooop", +"mpwHIKHzuomiec9abbfiolkggluuuwyAAtuuyAHMOONMKKKKMMHypqptwEIEEEMNIEBEEAABEGEBEHHIHHHHIIIIIKMMMNNOPPPPOOONMIHEBywpolfc955|,!~(](/(:<::__<}211179iotxwpmg9a0ggggfd07a8cmkggoooooqrmqquurrtpwtuqmmmmhjuwwuqmmmutuwwxCIKKKKIIEEEEEEIIMKKKIKKMNNMKKKIAttpm", +"mmpwBHIEApmkifba88beinikglnqquwyAwuuutyEMNNNKKKMMMIBtomqtEIEEEMMIEABEBzAEHEBBHHIIHHIIFIHHIKMMMNOPPPPPOOOMKHEEBytpolfc953|<~)>;&##%->))~(]//<*%%*;,){/]/**;,)~((/::<<<<<_::11211147dipwAAztlgdddccca0008aemkklooputxussuuuuorpkmmqoppptwyAyttpuuuxxxxCEEEBBAABBBAAwAEHEywwwyAEKMMMMMMMNMI", +"KGzpooptAEBwpiif9a6aceiinqpnuuxAAAByxtopxEIKMMMNOONMIAwqtyHHEBEEEEEBABEEEHIIHEHKKIIKKMKKIIKKKMKKKMNNOOOOOMIEEAywwtoigc9953|-;>)~/(_||||1||__}|14434}470dkpyzEAzulfhffffgdddabmmmkkorppwyyxwuustprmmmmiikillmptplnjinqqqquAEEBEAwwwptttwAIHAtlilptwyAEIKKMNOO", +"NMIBwpiiiowEEAtliff98biilotwwAEIKIHEAywptyBEKNNNOOOOMKEywAIKIEHEEEEAAyAEEIIKKKIIIIIIFFKIIHIIIKMMKKKKMNOOPOMKEEyywtpoifc0531,!~/<_|}|___<_<:_<1422}}2770cilpuxwwwtplifggikmmmmomkoloouuwAABAAAwtmkkkbbbcdgmtplggddeijjnpwwvttqmoollllltABAwpoiillfflttyBIK", +"IKKIEAwpicccmwBBxpllliillootBIMMKKKKHHEAyABEEHKOPPONNNNNIIKMMHEHHEEBAywwyAEIIIKKHFEFFEIIFHIIKKMNNMKIKMNNOOOOMKIHBAwtpolid571_/';=;,)~/_<|}|<1<<__((<14222227770bhkmoptttupolkgjimmqqqqmkllmmppwAABBBwupkkkbbbbdglpumgddddgkknpxzwwwqlolnlifipyAAAwpolllifioopyBH", +"BHHHEEAtof57dipyypoiiillllotzHMNKKKKKKEEABBBEEINPPPONONNMIKMKEBEEBBAwwtttwAHIIKKHBBEEEFIIIIIMMOONMMKIKMNOOOONMKHHBAytpoifc96}_!;=;,~/<<||||11<|__::_1}222227777abdgekloptttpqmlimmqpqqqknnnorppwyAABwtpkkkkbbb0glppmgdddggmmmuwAAywtolnllecclwAAAywpoopoiiiiltyA", +"twBEEEByti0730gmutpiiiillilotCKMKIIIKIIEEBBAABEKOPPONMNNMIKKEEDAABAywttpptyEIIIKHEABAFGHIIIKKNOONNNMKKKMNOOOONMIHBAAytpoif952_!-;'!~/<<|||21|1|__:___}}22227777880888bfioopputpoqmmmpqqmomnnrppuwyAzAtpmkgkhcb0dkoqmgdddgkmmmqtAAyywooooif98fotyywwtpopplifcioww", +"optyBEBAxqf5347dltwoiiiiliifowEKKHEAEEHHEEAyyAAHMOPONKKIIIIIEBAAyABAwtuuqutAIIIKIHBAzACFHIIKKNNOOOOONKKMOOPOOONMIHBAywtpoif97:);;')~/<|1||3114|<1:[_[1}12267000a0aaa66aadfloqutttppommmmprnoopqpwxwyywtpkkkfehddkmqmggggkkkkkmqtwwwpolollic89ilotwwwtqptpoiccipp", +"oilpwABAAuld3||7dlutoiiiififioyEIJAwwABEHEBywwwAINOPNIEHHHIIEAyAyABAwqprpptyEIIIIHECzAABEGHIKMNNOOOOOONNOPPPPOONKIHBAywttlif5}{';'~/<1|1453442|11::___:[}227000bdaaaaaa6a8cfkmutwxtuqmmmqprnnopptwxxzzwtmmmmheedgmpmkbcfffbbbeipttopllillif99fcipyywtpopmpof9flp", +"liilptAAAyuid7|47dmwtoiifffbilwAEEAtppxAEEEAwpwAHKOOOMHCBEIIIBAwwAEEwqmprptwEHHHJHHBzzzzABEEIKNOOOOOPPPONOOOOOONMKIEEAywtpol92[,'!~<<|347555333311:___1:[}47770008a6aaa66a0adglowwyxuupmpppronpppwxxwywwtmmqjjedgmoojeeehbbbbhfoooooljfiiifccddcowywpilommplccil", +"iifilptyAAytmf0770itzwpliiifcipwBEypolqtwBHEwppyEKNOONKBABHIIEyywxAEwumpqqtwAEHHEHHECzzzzzCCGKNOONNOPPQPONOOOOOONMKIEEAywtpof7}!!~(||355055957|211}}__1}[}447787066aaaa8668a0degmuwwxwwuttppqrqppwwwxxywwqqpllidgkmpjffhfb9bhbfiopooofccffcb50ccitAypiglllppiffi", +"fifiioqtyAAzwpmd77dmwAwmgiiiffotAAwtoiilpyEIBtotAIMOONMHyABEHHAtwwyBytqppruwAEHHHHHHECzzzzzCCGKNONNNNOOOONONOOOONNMKHEBAAwtpi93:~/1435990999577314}}1111}44247a76222666a6868ddbkkmquuwwwywttpprrqxxxzxwtwpqqqonggkmqljfeea8bbb8elponifccccc770dcfpywoffiiklpolii", +"iffiiimptwAAAyulc0dkuAAwoimoilotwwtplifcipAEIAtpyHKNOONKBwyzEEBxwwwAxwutrpptyEHIIHHHHECCACzCCBHMNNNMKKKMNOONOOONONNMKIEBAywplc|:~<|7599cddcc099544}22114244477776}22226a66a8ddekkkkmmquwAzywwupqqwwxzyxttwuutlliggmqoiiheb8ba88clpoolibcccc5750dfltwofdfifimpppl", +"iccfffgouwABEEBwpifipwAAwpppqppwyytpplffeioyHIAttBIMNONNIywAAEAzxtuwwwuwsrpuwBEIIHEEEEGBCCCAABEIMNNMIIHHIKNNNOOONNNMKKHEBywpid3]]<|5559ccdfcc9a90772244444477776622222226268ddekkkkkkmmqwAAAywttpwwxzzzytwquuojigkmooljieb8a888ciopoli999cc95|399fowpf9cfdglotwt", +"ofcfiiiotAAEEHHEApliipwAAyttttpwAytpppliccipAIIytyHMNOONMEwyAEBAwwwzwxuytprptyBEHIEEEEEEBAAzAABHKMNKHHHEEGIMNNONNMNMMKKIEBypli5::|35099dfdgbc0d9975224477777787a2222[}22622a00bkkkkkkkmmtwyAAAywtwwvxzzzwuwqtuljkkmmoliifb678889fopliic88c097||59clwwofcfccilqww", +"wlfiopootyAABEHHEwpiiiowAAytututyytolopoiiiltHKHzwEKNOOONKAwAEEAyyAzwtuwwtrrpwABEEEEEEHEBAzAzABEEMOMIEEEBGGKMNONNMKKKKIHHEAwpic4}6599ccfffgfc0dd9706657777777776222}1}16666800bkkkkkkkmmpputAAAAyAwwxzzyytuquuoojkmmooiihc666888elpllic9999951|45clwywpif99cgipw", +"BypopppoptwyyAEEEAtmifglwAAtpqptwAwlcfiooifflwIIEABKNOOOONIAABEEwyyAwuuwywpppswzAEEEBEEHEAzyzzAAEKNNKEFEBCCIKMNNNMMKKKHHEEAtoib5|609cgiiiliiecdd0000675777708066266}2226a66800bkkkkkkkmmqpuqwwAAABAzzxywyttqquppoklmqoljheaa68aabjplllic99055|||5fotyAwoi9599glw", +"EEypoppplotwwyAEEAwplf99itzypompwAwofcfqoliffoAIIEAHNOOOPOMHABHHBvxwuuutxwtppptwwAEEEBEHECyyvwwzBHMMMIEECCCHIKMMNNMMKIIIHBAwpi81_}599fgiklliifgd9c006665500cb0aa6a4242228aa8dehkkkkkkkkprqrsstwyACBAAzzvxxttquxppmmoppojifb666aabfolloic99575|1|5iptyAtoic509clw", +"AEAwpoppootwAAABEBAyulf99iwzwpllpyAtf9ioolkdfipAEByBKOOPPPOMHBHKHytwtuquttwtqqtwwyAEEBBEHEAytwwyAEIIKIEECCGIIKMMMMMMMMIIHEAwpj82_|290cggiiiiifdcdc90d0899bcfdgc9807a666a8a8bghemkkkkkkkrrrqpuuutwBEEEEAzvxtwquxttpmppppniee866a88elllllf997553115iptwAtliiccfilp", +"pyAAtooppopyEEEEBEBAwpf979iuxulgipyti9ciolffcdipABAwENOOPPONMIHKKBwppuqqutuqmmpswwyBBEBEEHEwxwwwyzABHHEEEEHKMNNMMMMMKKKIEEAwpj9}}478dcggfiiiifdchd00d09cdfffggeff9b99999fccfhjmmmmmmkkkprrrpruptyAAGEHEzxwttquutttqqttpojfeb668a8ciillif885553335fpwABApoooliigi", +"otwwwpoppptAHIEBAAAzwpg5413guuogditwlc9cillfc0cipyAyAINOOPOONKIKKIAtppopttupqmmqqwyABDBBEHEzxxwyuxzAAEEEHHIKNOONMMMMKKIIHHBwpj8}[458ccfgiiiliifhfffdggcfffiigffffcc9dcccffhimnqqmmmmmmprqrrrrrqqwvzCGIIECzwttquupttttxwplfehb6a88bfllliic885557339lwABEAwwtoic9f", +"loppxwtpptwyEHEyxwwwwpk0|<_4gqpicfpwticcktttld9dltAAAEKNOOOONMKIKIEwttppppptqmmmquuyABABEEEByxxzuxyzzAABHHIIMNONNNNNMKKKHHBwulb}[659cffiiilllikiiiigkkfffiiigc9cc8956aa9bfgimouuqqqqmmpprpprrrrrxxzzBIKHGAzttqqupptuwwwtnifhbb6a8aclloiic9959994}6ftwAEIHAticccf", +"filotAAtpwwwAEEAwwpppqmd4_/<9kqofcmyApifoAAAwof9iqwBAAHMOOOONMKIHKHAwuttttttpolmquuuwABAABEEAywsuxxyxwAAFEGHKMNNNOONNMKKKIEAtqc6}6addfgiillolllmlilikikffffdd96622|2327689ahknqquuuuqttutrrrrprtvwxzAEIHHEAttuqquppuxAzypjfhbbb888bioollfc909954[3cpwAHKHyof9ccc", +"ciiopyAAwtttwBEEAwpoomif5|<_49mqkfiwytiipAAAAtlfcfpwBABKNOOONMKIHIIBwwwtutwwwtooouttuxBBABEEEAuuuuxzxuyyyCBGKKMNNOOONNMKIIEAtqh6669ddfiilmmpooollilffffg9bc0d056}}:}[}2}a68dhhmnmqpswwwwtttuprrvvxxAEDEEGGEBwtmqqopstABCyoifbbbb88bfllollfcfd95333cpAEIHBtlfccc9", +"9clpptAEAwttyEEEAwpmkmmg93<<<|9mmgfmwwoiotwttwplccfqyAyBKNOOONKHHHIHAwtpttwyywttppttuxAEEEEEEExxxxxzzxywwAzCEIKMNNNNNNMKIIHEzrk86abfiikllmpqppomlmiigffgf9906622}}[[::[}66addbkmmmmtttxvwwwttuwvvxxzBFEEBCEEAwqmqqnotyEIEwmhbbbb888cipopoiff995756cpEHEytpliif95", +"5cloptyEHyttyBEywpoomlmld7|_((|dolcfqupllliilptpicfipyyyEMOOONKIEEHIEwtppptwwwwwwyywwyzEEEEEHBAzxxxzzyxywAAzCHIMMNMNNMMKKIHEzxk86bhilllomppppppmllilgggig997a222}}}_[[:[22adbbkkkkrrquttwwwwvyxvxxyDBEFEBzCEAAwqqqooptBIICtlgbbaba8biooptofcb90799ftEEypopplifc5", +"69iotwwEIEwtwyAtpooomopplc51_(/3goicippliiiflpttpfciowAyAIMOOOMIBABIIBwoilpttttyAEEBAACEIHHEHBBAxwyzzAyAyAzzCFIKMMKMMMMMMMIHBxnd8bjilooopppppppmloiifgkkica76222}}2}}[[[2280bkkkrrqrrrrpttwwzzzyzxzDDEFEEzzAEBAuqqqoppxEKHymkggbdb88fltttof990900flwBAtiiopoifc5", +"59fopwwAHKBwtwwplmllmoptpod7|>>->!<1<(_||||/~/4cilkggiddfoxAtpic7||3fpAEIKMMKMKIAwyHKMNMMKIBAywoilpwwwtpotAHKKNNKHBABBAxwuwACEIKKMMKKKMNNNOOPPOONNMNMNNMMJIEDDzxvvtuwwuuuuunokkhebbbddehmmqwwvwzzzzEFFFFKKMMMOOOOPPONLKHDzxvrrsmqquqqmmmqwyABEIMMICyplc99575floppppoootwytppttt", +"ppwwof5|(~~),>>-=='!<_{)///~~,,{3gklkgiigfotyytpi95335fpwBIKIIKKIBwyEKMNMMKKIIHEyplloptwywyBKNNNNNKIEEEEzuwwzCGGKKKKIIIMLMNOOPPPOOLNNNNNLKIIEDDzxxwtwwwuuqqqqnigggggggeemmrrvvvwxxzzDFFFIIMMMNOOOPPPONLHFDzvvprmmmqquuqmmmqwyAIIKKIBypof997735illooliiiloptppttt", +"llptof3<())))'>;=&*>~<~,)~~)),>,~5ilkiliiiopuyywpf95599kowEIIHHIIEwwAIKMNNMKIKMMIAtolllpwAyEKNNMNNMKKIKIEzAwwCBEHIKKKIILLLMNOPPPPOOOOOOMMJIJEEDzzwywwwwqqqmmmjhjhggggiijmmtsvvvvzzzDDFFHHLLMMOOOOQQQOOLIFCzvpsmmmmmjnuuqmmmtwAHHIHEEztpic99542cllopoiiiiilpppppo", +"ffilli5|~),,'-*==%%;~11(~//~)~),);**=-,)),)~<<~~/<<<|<))<5fluqqoommuxAyticcf9335itEKIIKKIAttyHIHHHHHIKMNOOMBwoliowBHKOOOOMIHIIMNMKIHIIHHIKKKKMMMNOOPQRQPPPOONNLLHFFFCzzAzssssmmmmmmmmmeeeeemmmssvvvwxzzzFFFIIMMMMOOOOPQQQPOMKKECAtummmjjjjhjjouuqquwAEIEBABBywplf00725fotwywtollliliff", +"lif99flf3~,>***-,),-*-)~~),)~~~~)>)<3clqqmmikmtyytlfffc5|39lAIIIIKKIAtwEIIHEEEEHKMOONMEwpoptABEMNOOOKHIHIMMIIHKMMKKMMMMNNNNOPPQRRQPPOONLLLIFFFECCyvtsrrmmmmmmrmmmmmmmmmpssvvvvvzzAEFFIILLLMOOOPPPPQOOLKFECAwwqqjjjjjjjjnpxuqqwyBHEEEEEEAtpic0975cipwwwtplilillll", +"lid3}5fi9/)>*&*-->*#@#*>,>-->,',,>>)/|dlqqmkggmtxuiccffc559itEIIIIKKHytyEIIHHHHEHKMNNMIEywwyBEEIKMNMKIHIIKMKIHHMMMMOOOOPPPPPQQQRRQQOOONLLIFFFGCzyxvsrrrmmmmmmmrmmmmmmmmrrvvvwvzzzzFFFIKKKLOOOOPPQPPOOLIFCAzwuqqjjjggggjjnuuuqwyAEBCBBEEAytof009669ipttplifiioloo", +"ii93:<5ff|~,-=***%#+.+@%--*%-),,,---,{|foqqmkgkqtul959fif99fpEKKKKKKKEwwBEIIIKKIHHIKKMMKEBEBEIKIMKKKKIHEIIKKIHHKMMMNOOPQQQQQQQRRRQPOOOMLLIFHFECzvvvssssmmmmmmmssmmmmmsssvvvvvxzzzCFFIILLLMOOOPPPQPPOMMFFzyzxuuljjggggggjjjuuuqwABEAAyABAwtpi0097269lppoifffiliil"}; diff --git a/hacks/images/timetunnel2.xpm b/hacks/images/timetunnel2.xpm new file mode 100644 index 00000000..f87144ef --- /dev/null +++ b/hacks/images/timetunnel2.xpm @@ -0,0 +1,599 @@ +/* XPM */ +static char * timetunnel2_xpm[] = { +"256 512 84 1", +" c #100A08", +". c #120C13", +"+ c #171021", +"@ c #18112D", +"# c #1C150F", +"$ c #18103A", +"% c #1A1049", +"& c #1B105D", +"* c #1B1076", +"= c #241492", +"- c #21149D", +"; c #2012AC", +"> c #2112C7", +", c #332A1C", +"' c #382A2F", +") c #36245C", +"! c #39274A", +"~ c #331F8A", +"{ c #372375", +"] c #2714F8", +"^ c #2B15EE", +"/ c #2E17E3", +"( c #4021D9", +"_ c #441DFC", +": c #4B2AC6", +"< c #5031B4", +"[ c #5728F7", +"} c #6822FD", +"| c #5A4382", +"1 c #5B3CAE", +"2 c #5E439A", +"3 c #5E34ED", +"4 c #60514F", +"5 c #655D38", +"6 c #7A2FFA", +"7 c #665471", +"8 c #9027FE", +"9 c #7540F9", +"0 c #8D38FB", +"a c #7748EC", +"b c #6E4FE4", +"c c #784ED8", +"d c #9447F8", +"e c #AB3BFD", +"f c #A340FC", +"g c #9559FA", +"h c #B052FC", +"i c #9A64E7", +"j c #9267F5", +"k c #8D72CE", +"l c #8E6EE3", +"m c #BF5AFC", +"n c #AC64FB", +"o c #907EBF", +"p c #9386A0", +"q c #999C57", +"r c #D066FD", +"s c #B978FB", +"t c #AD83F7", +"u c #CD72FC", +"v c #A19F91", +"w c #CF84FB", +"x c #B197F3", +"y c #C793F9", +"z c #B2A8C4", +"A c #B2A8E4", +"B c #DE8FFC", +"C c #CAACF7", +"D c #DAA7FB", +"E c #D1BEF8", +"F c #CDC7EB", +"G c #DFBCFB", +"H c #CED1C5", +"I c #CECEDA", +"J c #E5CBFA", +"K c #DBE2A4", +"L c #E6D7FB", +"M c #E4DEF9", +"N c #E6E9DF", +"O c #EAE7F6", +"P c #EDF1D0", +"Q c #F2F0FC", +"R c #F9F8FC", +"S c #F9FAF6", +"_[[0nDJMOOOMMMMMOOQQQQQQOMJCysngggitCJLMMLLGDwumhff0000fhsyCCCtc~%$$$&=:agc). ..+$%&**=-;>>/////>;=****=-;;>:blAFOOOOMMMOQRRRRRSSSSSSSSSRRRQMFCtjad9ddnniic2!'# ..++@$%&&&&%$$$%&=>///^^^", +"__}0gBGLLMMMLLMMOQQQQQQOMLGysngdggixELMMMLJGywmhdf006660hsyCCDtccclxFORRRRRQQQQQQQQRRRRRRRRRRRRRRRRQOMLLLLLLJJDBumf93(={%%&~:3dhg~+ ..+@%&*=-;>>//^^^^^/>;-==--;;;::lAFOQQOOMMMOQRRRRRSSSSSSSSSRRRQOLCtjg999dgggb1)+.# ...+$&&**=**&%%$%&=;///^^^", +"__[6dsyGJJJLLLMOOQQQQQOOLEDtngd9dgsxELMMMLJDyshd006}}}60hsyCCCxlllxFORRRRRRRQQQQQQRRRRRRRRRRRRRRRRRQOLLJJJJGGDBurhf63(-~{*~:(dhmd:).. ...+$&*->>//^^^]]]]^^//>;;;;;>(blAMOQQQQOOMOQQRRRRRSSSSSSSSSRRRROMEyjg999999:<)+.# ...@%*=;;>;;-*&&%&*=;>//^^^", +"]__[0hsyDDGJJLMOOQQQQOMLGysnd9399gtCLMOOMLGDwnh006}}}}}0hsDGECCkkxEORRSSSRRRRRQRRRRRRRRRRRRRRRRRRRQQOLLJGGGDDBurhf063(:=~=:(0dmmh3~@+............+@&=;>//^^]]]]]__]^^//>>>>((bkFOQRRRQQOOOOQRRRRRRRSSSSSSSSRRRROMEyja93333(<)@+. ..@%*;>////>>-=*&**=;>>////", +"^]_}6dhuwyDGJLMOOOOOMLJCysg96[[39jyELOOOMLGysgd06}}___[6dsDEJEACCAMORSSSSRRRRRRRRRRRRRRRRRRRRRRRRRQQOLJGGDDBBurmef063(::::33dmrmh0:&@+++..++.+++@$&=;//^^]]_______^^^///(((alxFORRRRRQQQOOQQRRRRRRRRSSSSSSSRRRQOLCtj933((>=%@.. ..+%*;/^^^^^/>>-=**=--;;;>>>", +"^^^^[6dhmuBDGJLLMMLLJCysg93[[[[3aixFOOOOMLGysh06}}____}6gtCELFEEEFORSSSSSSRRRRRRRRRRRRRRRRRRRRRRRRQQOLJGDDBwurmef00633:::33dhrrrh0(=&%$@@@@@@@@$%*->/^^^_______[[[[[33333ackFMQRRRRRRRQQQQQRRRRRRRRRRSSSSSRRRRQMExja3(/>-*%+.. ..+$*;/^]]]]]^/>;-=========--", +"//^^[}60dmuBDGGJJGGDysg96[[[[/(3btEMOQQOMLCynd06}_____[6gtGJMLFFFMORSSSSSSRRRRRRRRRQRRRRRRRRRRRRRRRQOLJGDBwurmeef00033::3adhmuurm03>-**&&&******-;//^^_____}[[669999aaaaclAFORRSRRRRRQQQQQRRRRRRRRRRRRRSSRRRRROLCla3((;=&$+.. ..+$*;/^]]]]]]^/>;-==***&&&&&&", +";>/^^[}60dmuwyyyywsng96[[^^^//(3iCLOQQQOMLCtnd6[[_____[6gtGLMMFFMORRSSSSSSRRRRRRRRQQRRRRRRRRRRRRRRRQOLJGDBurmhee000093aaaddmruuume6/>>;;;;;;>>>>//^^^[[[}66660dgnjtjiiltCFORRSSSRRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMEtb3((-*%@+.. ..+$*;/^]]]]]]]^/>;-=**&&%$$$$%", +"-;//^^_}}0dhmnnngd06[[[^^^^^//3bxJOQQQQOMJCtnd6[_____^[6gtELMMMMMQRSSSSSSSRRRRRRQQQQQRRRRRRRRRRRRRRQOLJGBwummeee00099aaaddhruwuume6[/////////////[[[[660000ddnsyDCCCxCAFMORSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQOFxj93(;=&$+... ..+$*;/^]]]]]]]]^/>;=**&&$@@++@@", +"*->/^^^__}6600066[[[^^___^^^/3atEMOQQQQOMJCwn06[_____^[3gyELMMMMOQRRSSSSSRRRRRRQQQQQQRRRRRRSSRRRRRRQOMJGBwrmeee00009daaddhmruuwume6[////////[33399aggnnnnnnswyGJLMLLFFMORRSSSSSRRRRRQQQRRRRRRRRRRRRRRRRRRRRRQMCta3((;~&@+.. .+@&;/^]]]]]]]]]^/>-=**&%$@++++@", +"*->/^^]_____[[[_^________^^[39iCLOQRRQQOLJDwg06[[_^^^^[9nyEMMMMOQRRRSSSSRRRRRRQQQOQQQRRRRRSSSRRRRRRQOMJDBurmfe000099dddddhmruwurme6[[////[33ajitxxCCCCCCDDDCGJLMOOOOOORRSSSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMExj33((;=&$+.. ..@&->^]]]]]]]]]]^/>-=**&%$@++++@", +"*-;>/^^]]_______]]]]]___^[[[9jxJOQRRQQQOLGysh06[^^^^^^[9sCLMMOOOQRRRSSSRRRRRRQQOOOOQQRRRRSSSSSRRRRRQOMJDBumhee000099aadddhmruuurme6[[//(3ajtxEFMMMMOMMMMLLLLLMOQQRRRRRSSSSSSSSSRRRQQQQRRRRRRRRRRRRRRRRRRRRROLCla3[//>-*$@+......+%*>/^]]]]]]]]]]^/>;-=**&%$@@@@@", +"*->>/^^]]]]]]]]]]]]]___[[[39jyEMOQQQQQOMJDwnd0[[^^^^^^[gtEMOOOOQRRRSSRSRRRRRRQOMLLMOQRRRRSRRSSRRRRRQOLJDyumhff000099aaddhmruuuurhe6[[(3abtCFMQQQQRRRRRQQQOOOOQQQRRRRSSSSSSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMEtj93[//(;~%@+.....+$*;/^]]]]]]]]]]]^/>>;;-=*&%$@@@$", +"=;>//^]]]]]]]]]]]]]]__[[39ajtALOQQQQQOMJGBsh06}^^^^^^[3nCLMOQQQQRRRSRSSSRRRRQQMLJLLOQRRRRRRRSRRRRRQQOLJDyumhf000009daaddhmruuurme06333bckEMORRRRRRRRRRRRRQQQQQQRRRRSSSSSSSSSSSRRRQQQQQRRRRRRRRRRRRRRRRRRQQMExia96[[//>-&$@+...+@&->/^]_]]]]]]__]^^//>>>;-*&$$$$$", +";>>/^^]]]]]]]]]]]]]__[[39ajtCJMOQQQQOMLGDwnf6[_^^^^^^[9sEMOQQQQQRRRSRSSSRRRRQOLJGGLOQRRRRRRRSRRRRRQQOLJDBumff0000099adddhmrrurrhe033:<1kAIRSSSSSSSSRRRRRRRQQQQQQRRSSSSSSSSSSSRRRRQQQQQRRRRRRRRRRRRRRRRRQQMExsg936[[[/>;*%@+++@@&=>/^]]_]]]]]___]^^^^///>;=&%$$%%", +">>/^^]]]]]]]]]]]]]]__[39gjtxEMOQQQQOMLGDwrf0}__^^^^^^[gtJMQQQQQQRRRSRSSSRRRRQOLGDCJMQRRRRRRRSRRRRRQOMLJDBsmff000099999ddhmrrrrme003:<1koINNSSSSSSSSSSSRRRRQOOMOQQRRSSSSSSSSSRRRRQQOOQQRRRRRRRRRRRRRRRRQOMExtgd966[[[/(;*%@@@@$&~;//^]]]]]]______]^^^^^^/>-*&%&&*", +"/^^]]]]]]]]]]]]]]]__[39gitxELMOQQOOLJGDwrh06}__^^^^^^[gyLOQQQQQQRRRSRSSRRRRRQMJDyDGMQRRRRRRRSRRRRRQOMLEDBsmhff00099999ddhmmrmme003:<2||pINNSSSSSSSSSSRRRRQOMLJLMOQRRSSSSSSSRRRRQOOMOOQRRRRRRRRRRRRRRQQOLExiga93666[[/(;*%@@@$&~;(/^]_]]]]]______]]]]]^^/>-*&&*=-", +"^^]]]]]]]]]]]]]]]__[[9gitxEFMOQQOOLLGDwuhf6}__]]^^]]^[gDLOQQQQQQRRRSRRSRRRRRQMGyByGLQRRRRRRRSRRRRRQOMLGDBsnhdf000099900dhhmmme063:<{||7pHNNSSSSSSSSSRRRRQQMJGCCGLMQRRSSSSSRRRQQOMLLMOQRRRRRRRRRRRRRRQOLExiga9900666[/(;*%@@$%*;>/^^_]]]]]________]]]]]^/>-***-;>", +"]]]]]]]]]]^^]]]]]_^[9gjtxEFMOQQQOMLJDBumf0}___]]]]]__6gDLOQQQQQRRRRSRRSRRRRROLCywyCLQRRRRRRRRRRRRQQOLJGDBsnhdf000009900fhhhhe06[(:~{)!7pvNNSSSSSSSSRRRRRQMJCtsstDEMQRRRRRRRRQOMLJJJLOQQRRRRRRRRRRRRQOMExigd9999d006[/(-&%$$%&=>/^^]__]]]]_____^__]]]]]^/>-==->>/", +"]]]]]]]]]^^^]]]]__[9gjtxEFMOQQQQOMJGyumd06}__]]]]]]__[dyJOQQQQQRRRRSRSSRRRRROLDwswDLORRRRRRRRRRRRQOOLJGDysnhdd000066660fffff06[[(-{)!!7pzHNSSSSSSSSRRRQOMEDwnggmsyGLOQRRRRRQOLJGDDGJMQQRRRRRRRRRRRRQMJCtja999ddddd6[/>-&%$%&*;>/^]]]]]]]______^^^^^^^^/>;--;>>/^", +"]]]]]]]]^^^^]]]__[9gtxCELMQQRRQQOMJDBuh06[[__]^^]]]__[dwEMQQQRRRRRSRRSSRRRRROJDwswDLORRRRRRRRRRRRQOMLJGDwumhdd0006666600fff06}[/>=))!!77zIRSSSSSSRRRRQOLEDsnhdddhnwDJMQQQQQMLGDBBBDJMQQRRRRRRRRRRQQMJCtjg999dhgmhd06/>-&%%%*->/^^]]]]]]]____[[^^^^^^^//>;;;>>/^]", +"]]]]]]]^^/^^^]]_[3gtxEFMMQRRRRRQOLGDsnd06[__]]^^^]]]_[9sGMQQRRRRRRRRSSSSSRRROJysnsDLOQRRRRRRRRRRRQOMLJGDwumhf00066[[[6000006}_^/;*%!!!77zIRSSSSSRRRQQOLGyshdd0000fhsyGLMOMLJDyuuuBDJOQRRRRRRRRRRQQMLGysgd99dhnnnnh06/(;*&&*=;>/^^]]]]]]]____}[^//////>>>;;>>/^]]", +"____]]^^///^^^^[3gtCFMMOQRRRRRRQOLCtnd06[___]^^^^^]]_[9sGMQQRRRRRRRSSSSSSRRROJysssDLOQRRRRRRRRRRQQOMLJGDwumff0066[[[}}60006}__^/-&%$!!|ozIRSSSRRRRQOMJCyshd00000000dnwCJJJGDwumruwDLOQRRRRRRRRQQOMJCysga999dhnnnmd0[/(;=**=->/^^]]]]]]]_____[[//>>>>>>;;;>>/^^]]", +"____]^^////^^^^[atELMOOQRRRRRRRQMEynd66[___]^^///^]]_[9sEMQRRRRRRRSSSSSSSRRROLCwwwDLOQRRRRRRRRRRQOOMLLEDBumff066[[[}}}}66}}__]^>=&$@!)|ozORRRRRRQQOLEDwnhd0000086660dmsyDDywummmuBGLOQRRRRRRRQQOMECtjgd9000ddhggd9[[/(>-=-->>/^^]]]]]]]_____^//>;;;;;---;>>/^^]]", +"__[^^^//>>//^^[9lCLMOQQRRRRRRRQOLCsd0[}___]^^/>>>/^^^[9tEOQRRRRRRSSSSSSSSSRROLGyByGMQRRRRRRRRRRRQOOMMLJCysmf006}}}_}}}}}}}___]^>*%$@!)|oIORRRRRQQMLEDsndd00000886}660dmswwsrmhhmuyJMQRRRRRRRQQMLEDsng996666000096[[//>>;;;>>//^]]]]]]]]_____^/>;-----==-;;>//^^^", +"[[[[//(>>>//^[3jxFMOQQRRRRRRRQQLGtg0[}____]^>;;;>>/^^[gyLORRRRSRSSSSSSSSSRRRQMECDDJMQRRRRRRRRRRQQOOOMLJCysnf006}}____}}}}___]^/;*%@@!|ozIQRRRRQOMJCysgd000008888}}}}60hnusumhhhmwDJOQRRRRRRRQOLEDsn9966[[[[[[[[[[////>>>>>>>/^^]]]]]]]______^/>;;--=====-;>>//^^", +"[[[[/(>;;;>//3atEMOQQRRRRRRRRQMJyn96}____]^/;=*=->/^^3jCMQRRRRSRSSSSSSSSSRRRQMJGGGLOQRRRRRRRRRRRQOOOMLJGywnf06}}______}_____]^/-&$@@!|pzORRRRQOMJCtjgd0000088886}}}}60hnsuurmmmuBGMQRRRRRRRRQMLCtja9[[[[[[[[[^^^///>>>>>>>>/^^]]]]]________^^/>>;;--=***=--;>>//", +"////(>-=~-;((3jxFMQQRRRRRRRRQOLCsd6[____]^/;=&&*=;//[atJORRRRSSSSSSSSSSSSRRRQOLJJJLOQRRRRRRRRRRQQOOOOMLGDwnd06}}___________]]^>-&$@@!|pIORRRQOMJCtng906600088886}}}60dnswBwwuuuyDJOQRRRRRRRQOLEyia93[[[[^^^_^^//>;;;;;>>>//^^]]]___________^^//>>>;-=******==;;>", +"(((>;=*&&*->(atEMOQQRRRRRRRQQMGtg3[^__]]^/>=&%%&*;>/3jCMQRRRRSSSSSSSSSSSSRRRQOLLJLMOQRRRRRRRRRRQQQQQOMLJDwnd06}___________]]]/>=&$@!!7zIQRRRQOLCtja9666600088886}}66dmwDCGGDDDDGJMQRRRRRRRROMExlb93([//^^^^^^//;-==-;;>>//^^]]]_____}}}}____^^///>>;=**&&&&&&**=", +"----~&%$%&=:3jxFMOQQRRRRRRQQMEyn3[/^^^^^/;=&%$%&*;>(ayJORRRRRSSSSSSSSSSSSRRRQOMLLLMQQRRRRRRRRRRQQQQQQOMJDwnd0}[___________]]^/;*%@@!!pzIQRRROMEyia96666600888886666dhsCJLLLLLJLLMOQRRRRRRRQIFxlc:((((////^^//>>-=*=-;>>//^^]]____}}66686}}__^^^^^/>>-**&&&%%%%%&", +"&&&&%$@@@%*>>>>>>-*&$$$%&=;(3jCMQRRRRRSSSSSSSSSSSSRRRQOMMMMOQQRRRRRRRRRRRQQQQQOMJDwnd6[[__________]]]^/;*%$@!7pINRRROOFCtg93[666000888886660hsCLOOQQQOOOOQQRRRRRSSNIzok11<==--;>(////>>;-==-;>>/^^]]]___}60feeee06}}__^^^^^/>;=*&&%$$@@@@", +"@@@@+++++$&1cxFOOQQRRRRRRQMJxi<~{&&&****&%$@@$%*->(atEOQRRRRRSSSSSSSSSSSSRRRQQOMMOOQRRRRRRRRRRRRQQQQQOMJDwnd6[___________]]^^>-&%$!!7zHNNNQOMExia96[6600088888060fhsDLOQRRRRRQQQRRRRRRSNNHp77))))%&&{~-;>(((>>;;;;>>//^^]]]___}0fhmmmmhe06}}_^^^^^/>;-**&%$@++++", +"........+@)2kAMOQQQRRRRRQMExl1)$@@@@@$$$@@@@@%&=;((ayJORRRRRRSSSSSSSSSSSSRRRQQOOOOQQRRRRRRRRSRRRRQQQQOMJCwg96[[^________]]]^/>=&%$!7pHNNNNQOFAtja3666000eee88800dhuyJOQRRRRRRRRRRRRRSSNHvv4''!@@@@@$){~-:>((>>>>///^^^]]]____}0fmuuwwwumh06[[^^^^^/>>;=*&%@+++..", +".........+!|AFOQQQQRRRQQMFxl2)@+....+++++++@$&*;>/3gyLOQRRRRRSSSSSSSSSSSSRRRRQQOOQQQRRRRRRSSSRRRRRQQQOMJDsg9[[[^_______]]]^^/;=&$$!7vHNNNNNOFAtja366600eeeee800fhnyGMQRRRSRRRRRRRRRRSNHv54'''++++++@!)~<<:(((////^^^]]]_____}0dmuwBDDDBwnh0[[[^^^//>>;=*&%@++...", +" ..''pzIQRRRRRRQQMFxk2)@+........++++@%*->//3gyLOQRRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRSRSSRQQRQQQOMJDsg9[[[^^^^^^^_]]]^/>;*&$!!pHNNNNNNOFAtca936000feeeeeefhnyGMQRSSSSSSSRRRRRSSNHv5,,##....++@!){21cba3(//^^^]_______}}0fmuwBDGGGGDwnd6[//////>>;=*&$@+....", +" #'4vHNNRRRRRQQMJxl2)!+.. ....++@$&=>/^[6gyJOQQRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRRSSRRQQOQQQOMJCsg9[[[^^^^^^^^]]^^/>-&%$!7vHNNNNNNIFAtca9900000ee0e0edmwDLORSSSSSSSSSSSSSSNHv5,,##....++@!)|2kkliga3[[^^_______}}}00hmuBDGJLLLJCtga33(///>>;;=*&$@+... ", +" #,5KHNSSRRRQQMJxl1{)+.. ...++@%*;>/^^6gyGMOQRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRSSSRQOOOQQQOMJDsg9[[^^^^^^^^^^^^^>;*&%$!7vHNNNNNNIFClca990000000000fhnDJORSSSSSSSSSSSSSSNHv5,,##...+++@))22kxxytia9[[[[_____}}}600fhmuyDJLMOMLExib33(((>>;;-*&%@+.... ", +" #,5qPNNSSRRRQOFClc1{$+.. ...++$&=>/^^[6hsCLOQQRRRRSSSSSSSSSSSRRRRRQQQQQRRRRRRRRRRQOIIOOQQOMExia3[[^^^^^^^^^^^^/>-*%$!!4HPPNPNPNIzxlba366600000000fmwGMQRSSSSSSSSSSSSSNHv5,,##..++@@$%{11lyDxytng96[[}}}}}}}66000ffmsyGLMOOOMLCtiaa3((>;;-=*&$@+... ", +" #,5KHNSSRRRQOMAlb:~%@+.. ..++$&->/^^[6dsDJLOQRRRRSSSSSSSSSSSRRRRRQQQQQRRRRRRRRRRNIIIOOOOOMExja3[^^^^^^^^^^^^//;=&$$!7vHPPPPPPHIzklb9366666666660dsxJORSSSSSSSSSSSSSNHv44'#...+@@$%{~</^^[6dnyCJMOQRRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRRRRIIIIIOOOMFAtb93[^^^^^^^^^^^^/>;*%$@!4vKPPPPPPHIAkia93[[[}}66666dgtGMQRSSSSSSSSSSSSRIvp4'#...+@@%&*=-:acittwssnhdd000666686886800fhwCLMQQQQOMExtiga::;-=*&$@++... ", +" ##4vHNRRRQQOMFxja-{$+... ..++$&->/^^[6dgsyGLMQRRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRRROFzzzIIIIMFxla3[^^^^^^^^//^//>>-&%$@!4vPPPPPPPHzAkca36[[[}}}}}60dnxFORSSSSSSSSSSSSNIzp4''...+@@%&*-;:(3agnissnnmhhdff00068886}6600hwGLOQQQQOMExtljba:;=*&%@++.... ", +" .'7pFOOQQQOMLCla:~%@.. ..+@%*->/^^[60hnsyGLORRRSSSSSSSSSSSRRRRRRQQQQRRRRRRRROIzppzIIIIIAxia3/^^^^^////////>;*&%$!!4vPPPPPPHHzolca3[[[[}}}}}69gtCMORSSSSSSSSSSSNHIp4''...+@$%&*=;;>((3agnnususurmhffe0066}}}}}6dnyJMQQQQOMLExytica:-~&%@@+...... ", +" ..+!2kAFOOOOMLExb:-&@+.. ..+@%*;>/^^[60dgnyCJORRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRQOFAoppvHHIIAkca(/^^^/////////>>-*%$@!7vHPPNNPPHIzxlcd3[[[____}[6diyJMQRSSSSSSSSSNNHHp4''...+@$%&=-;;>>((33dhnwByyywwumhf006}}}}}}0gwGLOQQQQOMJGCCxtib:=*%$@+........ ", +" ..+${/^^[69dhnsDJOQRSSSSSSSSSSSSRRRRRRQQQQRRRRRRQOMAooopvHHIzAkc3(/^^////((////>;=&%$$!4vHNNNNNNNIAxlg93[[[____[[9gtEMORRRSSSSSNNNNHvp4'''+++@$&*=;;>>>>((30dmwDDGGGDDwumhf06}}}}}6dsDJMQQQQOMMJEECCxlc<~{$@++.........", +" ...+@&-:bxCJLLLExia3-&@.. ..+$&=>//^/[660dhsyJORRSSSSSSSSSSSSRRRRRRRQQQRRRRRRQMJxkkopvIHIzAkc3(/^///(((((//>>-*&%$!7pHNNNNNNNIIAxlga3[[[___[[6aiCJMORRRRRNNNNNHHvp7'!'++@$%&=;>>>>>((((3dnwDGJLLLJGDwuhf06}}}[69nyJMOQQQQOMMLLLLECxl1~)$@+..........", +"...+@&=>(alxEJEExta3(=%@.. ..+$&->///[[669dhsDJORRSSSSSSSSSSSSRRRRRRRRRRRRRRRQOMExkkozzHIIFAkca(///(/(((((>>>;-*&%$!7vHNNSSNNOIFExtja9[[[__[[[9jxEMOOQRRQNOIIHHvp77!!!@@$%&~->>////////39hsDGLMOOMLJDysmd06[}}[6gtEMQQQQQQOMMMMMMLJCl1{)!@+..........", +"..+@%*;/(9ixCEExtg3(:*$+.. ..+$*->///[339ddgsDLORSSSSSSSSSSSSSRRRRRRRRRRRRRRRQOMCklkozIIIIFAkca3///(((::(>>>>;=&%$$!pHNNSSRRQOMFECysgd6[[[[[[9jtCFMOOOOOIIFzzzpp7|)))))%&~-;>////////[3dnwDJLMOOOOLJGysgd6[[[[[9sCMOQRRRQQOOOOOOOOMAk2{)!@++.........", +".+@%*;>/[9ixCECyja3(-&@+. .+@%*;>///[39dddnwCMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRRQOFAxkkozIIIIFAkca3//(((:::>>>>;-*&%$!7pHNNRRROOMMFECytjgd6[[[[9gtxEFMMMMIFFAAooo|22{{{{~~~=;>(///[[[[[39gsyGJLOOOOOMLJCysh0[[[[[9gxLOQRRRRRQQQQQQQQOMFo2{)$@+++........", +"+@%*;>//[atCEECtj3(;~%@.. ..+$&=>///[39ddddnyGMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRRQMFCxkkAzIIIIFAtb33//(((::::>>;-*&%$@@7vHNRRROOMMLJJECDtsg99669ajxCEFMFFFAAokkkl11<<<----:::((([[[[[[39gsyCJLMOOOOOMLJCysg96[[[[[9tEMQRRRRRRRRRRRRRRQOFo2{)$$@++........", +"$%*;//^[6gtCEECta3(-&@+.. ..+$*;>///39ddddgsyEORRSSSSSSSSSSSSSRRRRRRRRRRRRRRQQMJCkkoAzIIIFFxlb33//(((::::;;;=*%$@@+4vHNNQOOMLLJJJJECDtng9999gtxCEEFEACxkkllicc::((((((::a33333[639gsyCJLMOOOOOMLLECysg9[[[^^[[atFOQRRRRRRRRRRRRRRROFk2{{)$@++........", +"&~;(/^^[9nxEEExla(;*%@.. ..@%=>///[6ddggdgsyGMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRQOMExkkoAFIIMFAxja33[/((:::;;;;-*&%@@++'vHHOOMLJJEJJJJEGCysgd999gjxCCCCCxxklllicba333(333aaaaa993339gntCJLMOOOOOMLLGCysnd6[[^^^^^3gxLOQRRRRRRRRRRRRRRQOAk1~{%$@++........", +"=;(/[[[[9jyCECxja:=&@+.. .+@&->//[39dddddgsyJMQRSSSSSSSSSSSSSSRRRRRRRRRRRRRQOLCxlkoAFIMFFCtb33[//(((:;;;;-=*&$@++''4vIILLJGCCGEEJEGDysg9999ajttxxxxxtktttliga933339abbjbba9999gntCJMOOOOOMLJGDtsgd9[[[^^^^^^3jxLOQRRRRRRRRRRRRRROMAl1~{)$@+........+", +":(([[[[6djtyxtia(;*%@... .+$*;(/330ddddddgsyJMQRSSSSSSSSSSSSSSRRRRRRRRRRRRQOMExlllkAFFFFAxia3[///(((:;;;;-*&%$@+++'4pzJJGDDyDDCGGGDywnd96[39ajitttxxxCCCxytjga999abjjiijbaa9dgnsDGLMOOOOMLECysgd96[[^__]]^^^3jxLOQRRRRRRRRRRRRRQOFxl<~{$@+........+@", +"(([[[[[69gjssja3>=&@+.. ..+%~:(330dddddddgsDJOQRSSSSSSSSSSSSSSSRRRRRRRRRRQQMJCtjclkCEFFECtb33[^^///(>;;;;-*&%$@+++'7pAADywwwwyDDDDDBshd6[[[39abiltxCAEEECCytjgaagjjillijbaaaggnwDELMOOOMLGDwnh06[[[____]]]^[[gyJOQQRRRRRRRRRRRQOFAlc<{)@+... ..+@$", +"(([[[[[[69dga93(-*$+.. .+@)<:339ddd9399dgtCLORRSSSSSSSSSSSSNNNRRRRRRRQQQQOLExibbilxAEECxia3[^^^^//(>;;;;-*&%$@+++'77oyysiinswwyyDywnh06[[[[39ajitxEEFFJECxtijjjjltllljjbbjgjnsyDGJLLLLECyshd06[[[_____]]__[6gyEMOQQQQQQRRRRRRQMEkc<~{$@+.. ..@%{", +"[[[[[[[[[[66[[(;~%@+.. .+!{<:aaddda3339dnyGMQRRSSSSSSSSSSNNHHIINRRQQQQQOOMExlbabblxCCCxtj93[^^^^//(>>>;;-=&%$@+++'!|2linggdgnswBywsnd0[[[[[[39gitxEEFFJECyttiillttllliiilltstwyyDGGGGDysnh0066[[[_________[6hwGLOOQQQQQRRRRQQMExib<~%@+.. ..+$*-", +"[^^^^^[__[[[[/>=&@+... .+@)21ccgdaa33339gsDJOQRRSSSSSSSSSNHHzppzIOOQQOOOMLECtjaaabltxCxtig9[[^^^^^//>>>>;-=&%$@++++!)21caa39dhnswwwsnd0[[[[[[[9ajtxCEEEECxyttiitttlllllltxxxyyyyyyyyywsnhd066[[[[__________}6hsDJMOQQQQRRRQQQOLClb:<~%@+.. ..+@&->", +"^^^^^_____^^//;&$+... ..+!22lligaa:::(39gtCLORRSSSSSSSSSNHvp777pzIOOOOMMLECtja99agitxxytna3[[^^^^^///>>>;-=&%$+++.+@){1<::(33dhnuwwsnh96[[[[[[69gjttxxxxtttiiiiiliiilltxCAECCDyywsssnhdd0666[[[[[__________}0hsDELOOQQQRRQQQOLEyib:-*%@+... ..+@&=>/", +"^^^________^/>*%@... ..+$)2kkktic::::(3aiyEMQRRSSSSSSSSNHzp7777ozIOOOMMLECtjg999ajityytig9[[[^^^^^////>>;-=&%$+++.+@!{~<:::((3dhswywsgd6[[[[[[[39gjjjiiijjjjjjjjjjjilxCEFFFJECyysnnhd0066}[}[[[[[[________}0fmwDGLOQQQRRRQQOMJCtb::-*%@+.....+@%=>//", +"__________]^/-&@+.. ..+@)2koACxtic<<::abtCLORRRSSSSSSSRIzp7!!!|ozFOOMMLECysg9999ajittttig9[[[^^^^^^///>>>-=&%$++..++!{~==--;:(9giwywsnd0[[[[[[[669dggggaaaaaggggjjjlxCEFMMMLJCywshd0066}}}}[[[[[[[______}}0dmuyDJLOQQRRRRQQOMJxib::-~&$@+...+@%=>//[", +"_^________^/>*%@.... ..@%~1kAFFAxlc<<::aixEMQRRSSSSSSSNIzp|!!!!)|AFMMMLECtjg99399ajitttsnd6[[[^^_^^^////>>;=&%@++..++@%{*~===-::anwwwsnd96[[[[[[6699999999999aaaabjitCEMOOOMLJCysnd066}}}___[[[[[[[____}}60hnwyDGJMOQRRRRRRQOMExlc::-~&$@++++!{=:(/[[", +"[[[}}}____^/;*$+... ..+${>;=&%@++...+@$%&&&**~=:aisttsng906[[[[[6669999999999999aajtCEMOOOOOLECysg966[}____}[[[[[[[}}}}}60huBDCGJLMOQRRRRRRQOMGxlc:<=*&%@@+!){1:3366[", +"6666[}}}__^/-&@+... ..+@%~>;=&%@++...++@$%%%%&&~<:ciwtsngd96666666999993366663339aglxEFMOOOOMLCysnd06[______}[[666[[}}}}60hsyDGJJLLMQQRRRRRRQOLEkl<<=~{%$$!!)21cgddd00", +"000066}}__/>=%@... ..+$&=cxFOOOIAk1>;=*%@+.....+@@$%%%%%{~*$+... ..+$&>;=*%$+.....++@$$$%%%&{1clttsingdddddddddd99936[[[[399ajtxCJMMOOMFExtng9[[[______[[6666666}}60fnwDGJJJJLLMOQRRRRRRQMFCl1<~~{&)))|ooCCDysnhdd", +"dfff06}}_^/;&@+.. ...+${>;-*&$+.....++@$%%%%%%{11kxyttinggggghhgddd993[[[[699gjstyCELMMLJCxsgd0[[[______[[669000666660dnBDGJJJJLLOQQRRRRRQOMAkl1~~{{{{{2oAEJJCywnhdd", +"fff006}__^/-&@... ...+${1kFOQQNIAlb:39aiyEMQRRRRRRRIzo|)!@+++@!)|oAAxtj93[[[[3339aaaa93[[[________]]^^^//>>-*&$++....++$%&&&%%%{2kkxxytsssssnnnnngad93[[[[69agjttyDCCEEEGDyig96[[_______[[660ddd000000fhsyGJJJLLLMOQRRRRRRQOFok11~~~*~~1kAFMLLGysnhfd", +"ff006}}__^>=%@.. ...@${1oINRQIFola333ajyEMQRRRRRRIFpo|)!@+++@!)|oAAAtj93[[[[339aaaa99[[[[_________]^^^///>;-*%@+....+@%&***&&%{2koCCxxttttssssinga933[[[[9ajjttyyyyyDDytsgd96[[[______[[[69dddddd000ffnwDGJLLLMOQQRRRRRRRQIAk2~~~~~=<1kAFOOMLEDsnhdf", +"ff00}}__^/>*$+.. ..+@%{2AINNNIFkca3339jtGMOQRRRROIAo|))@@@+@@!|oAFFAtj93([[339aaaa993[[[[_________^^^^^^//>;=&$+++++@%*=--=*&&)|2oAACCyytttwtsngga33[[[[39gstyyyyywwssngd96[[[^_______[[69ddgnhhfdfdhnsyGJLLMOOQQRRRRRSSSNIo|{{~~==-;*&$@++@%*-;;;-*&&){2oAEECDyyywtsngaa33(/[[[9gjtyyyyyssnggd93[[^^_______^[[69ddgnnnhhhhmnsyDJLMMOQQRRRRRSSSSNHp7|){{~-::cxFMQQQOLEDwshhh", +"ff0}}__^/>*%+.. ..+${1kzIOOIFxia3[[[6gsCLMQQOOIAo||))$@@@@@!)|zIIFFxia3((33aabbba996[[[[___[[[^^^^^^^^]]^^/>;*%$$$%*->>>>;=&&%{2oAEEECDyttsnga33(((//[[9gstyyyysnghd06[[[^^________[[[99gnnnsnnnnuwBDCJLMOOQQRRRRRRSSSSNHp7)){~=::cxFOQQQQOLJCysunm", +"hf0}__^^/;&$+... .+@%~1kzIIIFAkb33[[[6dsyJMOOOIzo|))!@@@@@@@!)7zIIMExia3(33aajjjgad966[[}}}[[[[[^^^^^]]]]]]^/>-*&&&*;>///>>=*&%{2kAFFECDytigaa3((>>(//[39gsyyyysnhd06[[[^^^]]]]]___[[[69ggnnssssswyDGEJLMOQQRRRRRSSSSSSNNv7!)){~=%@+.. ..+$&~1kAFIFAxla3[[[[6dnyELMMFzp|!!@@@+@+@@@!|pzIIIFxlb:33abjjjjgad000666}}}[[[[^^^^^____]]^^/>-==-;>/^^^/>-*&%{2kAFFJECysga33((>>>>(((3djstytsngd06[[/^^^^]]]]]___[[69dgnsssswwyDCELLMOOQQRRRRRSSSSSSSNHv7!){~<;*%@... ..+@%*=;;>//^^^^/>=&%%)2kAFFJECtia3((>>;;;;>((3ajsttssgdd6[[/^^^^^]]]]]]__[[69gnjsttyyyDGJLMOOOQQQRRRRRSSSSSSSNHp7|{~<=&$+.... ...+$&=-:lkAAAxklja9000dhsyGJFzp7!'++++++++@@$)|pFIIFAxlcbbbittttsnghhffeeeeeee066[[[[_______]^^/>>>//^^^^//;=&%$){2oEFJCxiba::>;;;;;;;>(3ajsttsngd96[[//^^^^^^]]]]_^[[99gjstyDDCCGELLMOOOQQQRRRRSSSSSSSNNHp|211ckAMORRRRRRRQOMLJEGCDy", +"d0[[//>;*&@+.... ...+$&*;>:blkxxxxttigdddhnwDGEFzp7''.+...+++@@)||AFIFFAklcccitxxxytsnmhhhheeeehff06[[[[}}}}____]^//////^^^//>-*%$$!)|oAEACtcb::;;;;;;---;::acittingd33[/////^^^^^]]]^^[[9gjttDCGGGEJJLLMMOOOQQRRRRRSSSSSSNNIpk11lkAMORRRRRRRQQOMLLJGCDB", +"0[[//>>-*%@+... ...+$&*;>((:clkxxCCCytnmmnsyDGEzp74''....+++@@$)2oAFFFExklccitxCCCxytsnmmmmhhmmmmmff06[}}}}}____]^//////////>-*%$@@+!!|oAokl<<===--;;;--==-:bcitlingd33/////////^^^^^^^[39jtyCEJLLLLLLLLLLLLMMOQRRRRSSSSSSNNzokllkAFORRRRRRRRQOMLLJEGDBw", +"[[//>>-*&$++... ...+$&=;>///(ablxAEJJGDywsswDCGEzp4''.....++@@$){2oAFFFAxllcilxCCCCDywsurmmmmmmrrrrmhff0066}}}___^^//(3333((>-*%$++++''77oo22{{{**=-----====<>-*&%@+.... ...+@&*;>////(3alxEMMMLJCDyyDDGGzzp4''#....++@$){2koAFFEAxliiltxCEECDywuurrrrrrrruuurrmhhfe00}}___^^/39ajga3:={)@++.##''4477|)))%%&*=---=***~~>>>>>>>>>////[9jtCFMOQQQQOMLJCDyyxCEMOQRRRRRSSSSQIAokxAFORRRRRRRRRQOMLJJEGDysn", +"[/(>-**&$++... ..+@%*;>/^^^//3alAMOOOOLJGDDDGGEzp44''#...++@@$)22kAAFEACtliilxCCEECDywwuurrrrrruuwuuwuumhffe0}}__^[[9gtytlc<{)!+.###,,,,447!!@@@$%&*===*****~~1cilicba:(>>>>>>;;;;;;>>/(3atCFMQQRRRQQOLEDttttCEMOQRRRRSSSSROFAoxAFORRRRRRRRRQQOLLJEGDywnh", +"//>-=*&%@++... ...+$&->//^^^^/3atEMQQQQOLJGGGGJJzp44''#...++@$){2koAEEEAxliiltxCEEECDyBwuurrrrrruwwBBBBwwurhf06}}_[[9gtxDxtl2)!''###,,,,,44'''++@@$%&******&&*~<1ccccb:::;;;;;;-==**=-;>(3ixJMQRRRRRRQOLEDtttxELOQRRRRRSSRRROFAAAFOQRRSRRRRRRQQMLJEGCDysh9", +"/>;=*&&%@+.... ..+@%*;>/^^^^^/3bxLOQRQQOMLJGGJJJzp4'''#..+++!))22koAAAAxtliiltxCEEEGDyywuurrrrruuwBBDDDDDBwrmf06}}[6dntDCxk2|!'''##,,,,5544'''+++@$%&&***&&&&{{~<;=*&&%@+.... ..+@&=>//^^^^/[9iCMQRRRQQOLJJGJJFzp4,''#..++!!)||oooCACxtijjjlxCEEJEGCDywuuurrruuwBBDDGJJGGDBumd06669ditxxtk2|!'''',',,555544''+++@@$%&&&&&&&&&{~<<<<<<==~*****&&&%%%&*=:blCMORRRRRRRRRQMECxCEMOQRRRSSSRRRRQOMFFMOQRRSSRRRRRRQQOLJGCDysnd0[", +"/>-**&%$@+.... ..+$&->//^^///3atFORRRRQQOLJJJJJFzp44,,''''!!77ooooCCCxtljbjitxCEJJJEGDDBBuuuuuuuwBBDGJLLLJGDyumd0009gnstll2|)!!+''''445vvv477!++@@@$%%&&%%%%%%&*~=<--=~*&%%%%%%%$$$$%*-:cxEMQRRRRRRRRQOMJEEFMOQRRSSSSSRRRQOMMMMOQRRSSSSRRRRRQQMLECDysnd9[[", +">>-**&%$@+... ..+$*->//////(3jCMQRRRRRQOMLJJJFFzv44,,,''477ppzzAAACxxtijbjlyCELLLLJGGDDBwuuuuuwBBDGJLMOOMLJDBuhdd9ddgnic12))!!!!!)77ppvvzpp7!!!@@$$$%%%%%$%%%%&*~==~*&%$$@@@$$$$@$%&~:biCJOQQRRRRRRQOMLJJLMOQRSSSSSSSSRRQOMMOOQRRRSSSSSRRRRQOMLGCywsg96[[", +">;=*&&%$@+... ..+%*;>////>((btFORRRRRRQOMLLJLLIIvv555555vvHHIIIFFAAxtljjjitCELLLMLLJGDDBwuuuuuwBBDGLMOQQOMLGDwsghdddaab12)))))){22|ozzIIIzpo|))$$$$$$$$$$$$$$%%&*~**&%$@@+++@@@@@$%*-:aiCJMOQQRRRQQOMMLLLMOQRSSSSSSSSRRRQOOOQRRRRSSSSSRRRRRQOMLGCysnd9[[^", +";=*&&%%$++... ..+@&=;>//(>>::iAIRRSSRRRQOMLLLLMIIHvqqqqqKPPNNNNNIFEAxtljjitxELLMMMMMLJGDDBwuuuuwBBDJLOQQQQOMLGDwngddda:<2)))){21///>;;<1kFQSSSSSRRROMLLLMOOHHKKKKKPPPNNSSSROMJAxtljjiyCJLMOOOOMMLJDDBBwuuuwBBDJLOQQRQQOMJGywngaaa<2{)!||21cclxAFMOOOOMFAk2{)$$@@@++++++++@@$%%%$@@+++.+++++@@%&->3ajtDGLLMOOMMLLLLMOQQRRSSSSSSSSSRRQQQQRRRRRRRSSRRRRRRRQOOLLGDtnd[[^/", +"%%$$$$$@+... ..+@&=>>//(>;-12oINSSSSSSRROMLLMMONNNPPPPPPNSSSSSSSRMFExtljitxGLMOOOOOOMLJGDDBwuuuwBBGJMQQRRRQQOLJGDtigbc12|777okktxxEFMOOQOOOIzo2{)$@@++++++..++++@@@@@+++....++++@@%*-(3djsyCGJLLLLLLLLMOQRRRSSSSSSSSSRRRQQQRRRRRRRSSRRRRRRRRQQOMLEDtg9[///", +"@@@@@@@@+... ..+@%*;>//((:;=12zISSSSSSSRROMMLMOQRNNNNNNNSSSSSSSSSROFCxtiistCELMOOQQQOMLJGDBwwuuuwBBGJMQRRRRRRQOMLECyti1277ppzzAACCELMOQQQQQOOIAo|!@@++..........+++++++......++++@@%*;(3ajsyDCGEJJJJLLMOQRRRSSSSSSSSSSRRRQQRRRRRRRRRRRRRRRRRQQQOMLGysa3[//;", +"+++++@@++... ..+@%*;>///((:;<1kzNSSSSSSSRROMLLMORRSSSSSSSSSSSSSSSSROFCttiisyCJLMOQQQQOOLJGDBwuuuuuBBGJMQRRRRRRRQOOMJGCxopvvHHIIFFJFLMOQQQRRRROIzp|!+++........................++++@$&=>(3antyDCGEEJJLLMOQRRRSSSSSSSSSSRRRQQQRRRRRRRRRRRRRRRRRQQOOLJCtg9[//>=", +"++++++++... ..+@%*;>////((>:<3djsyDCCGEJJLLMOQRRRSSSSSSSSSSSRRQQQRRRRRRRRRRRRRRRRRQQOOMJCtn9[[/>;*", +"....+++.... ..+@%*;>//////(>::=&", +"........... ..+@%*;//^^/[[/((>(:lFORSSSSSSRQOMLLMRSSSSSSSSSSSSSSSRRRQMCtsinssyDJLMOQQQOMLGDywurrrruuBBDJMQRRRRRRRRRRRRQONNNNSSSRRQOMMOOQQQQRRRRRRNIp7''+............ ...++@$%&=:3gsyCGGEJLLLMOOQRRRSSSSSSSSSSSRRQQQQRRRRRRRRRRRRRRRRQOMMLECynd6[^^>-&%", +".......... ..+@%*;//^^^[[[//(((3iEORSSSSSSRQOMLMORSSSSSSSSSSSSSSSRRROLCtsnnswyDJLMOQQOOMJGDBwurrrruuBBDJMQRRRRRRRRRRRRRNNNSSSSSRRQOMMOOQQQQQRRRRRNIz4''++.++......... ...+@$%*-:bixCGEJLLLMOOQQRRRRSSSSSSSSSSRRQQQQRRRRRRRRRRRRRRRQQOMMLJCysg9[^^/;*%@", +".......... ....@%*;/^^^__[[[/((((3bCMRSSSSSSROOMLMORSSSSSSSSSSSSSRRRRROLCytssswyDGLMOOOOOLJCywwurrruuuBBDJMQRRRRRRRRRRRRNSNSSSSSSRRQMMMOOQQQQQQRRRRRIzp7!+++@@++++..... ...+@@%*=&@+", +"..............+$&->/^^__}}[[/(((/3bxMQRSSSSRROMLLMORSSSSSSSSSSSSSRRRRROLGCytwwByDJLMOOOOMLGDywwurrruuuBBDJMQRRRRRRRRRRRRSSSSSSSSRRQOMMMMOOQQQQQRRRRROIp7!!@@@$$$@@++.... ...+@%{=&@+.", +".............+@&=>/^^__}}[[(((>(/(axLQRRSSSRROMLMMORSSSSSSSSSSSSSRRRRROMLGCDyyyDGJLMOOOOMJGDywwuuruuuwBBDJMQRRRRRRRRRRRRSSSSSSSSRRQMMLLLMMOOOQQQRRRROFo|!$$$%%%%%$@+.... ...+@){1ctDCEJLMMOQQRRRRRRSSSSSSSSSSSSRRRRRRRRRRRRRRRRRRRRRRQQOOLJDwn9[/>-&$+..", +" ...........+@%*;/^^__}}6663((>//(9tEORRSSRROMLLMMORSSSSSSSSSSSSRRRRRRQOMLLEGCDGJLMOOQOOMLGDywwuuuuuwBBDGJMQRRRRRRRRRRRSSSSSSSSRRROMJEEJLLMMMOQQQRRQOzo|)$$%%&&&%$@++... ..+@${1clxCGJLMOQQRRRRRRRSSSSSSSSSNSRRRRRRRRRRRRRRRRRRRRRRRRQQOMLGyn93(-&$+...", +" .........+@$*->/^^_}}60003(((//[9lEMQRRRRQOMJJLMQRRSSSSSSSSSSSRRRRRRQQOOMLLJJJLMOOQQOOMLGDywwuuuuuwBBDGJMQQRRRRRQQQRRSSSSSSSRRRQOLEGGGEJLLLMOQQQQOFA2{)$$%%&&&%$@+.... ...+${/^^_}}60fd03(((//[3jxMOQRRQOMFEGJMORSSSSSSSSSSSSRRRRRRRRQQQOMMLMMOOQQQQOMLGDywuuuuuwBBBDGLMQQRRRRQQQQRRSSSSSSSRRRQMLEGCCGGGJLMOQQQQOFo2{)$$$%%%$$@++.... ...+$&<:bixCJMOQRRRRRRRSSSSSSSSSNNNNRRSSSSSRSRRRRRRRRRRRRRRRQQQMLCwg3(-&@+.. ", +" .......++$&=>/^^__}}0ddd03((////3atEMOOOOMFGCCGLORRSSSSSSSSSSRRRRRRRRRRRQQQOOOOQQQQQQOMLGDywuuruuwBBDDGLMQQRRRQQQQQRRSSSSSSSRRRQMLEGDDDDCGJLOQQQQMEk2)$$@$$$$@+++...... ...+$&-(ajtCJMOQRRRRRRRSSSSSSSSNNNNNNSSSSSRSSRRRRRRRRRRRRRRQQQOLJDsa3>~%@.. ", +" ......++$&=>/^^]__}60ffd03(///^^[3iCFMOMMJCDyDGLORRSSSSSSSSSSRRRRRRRRRRRRRQQQQQQRRRQQOMJCywurrruuBBBDGJLMQQQQQQOOOQRRRSSSSSSRRRQMLEGDDDDDCELOQQQOMAk2)$@@@@@+++........ ....@$&-(3gtCLMQQRRRRRRRSSSSSSSNNNNINNSSSSSSSSRRRRRRRRRRRRRQQQOMJCwg9(;*$+.. ", +" ....+++@%*;/^^]___}60ef03((//^^^/3axAFMFFAxywyDJORRSSSSSSSSSRRRRRRRRRRRRRRRRQQRRRRRRQOMGDwurrrruwBBDGGJLOOQQQOOMMOQRRSSSSSSRRRQOMLEGDyyyyDGLOOQQOFCl{)$@@++++.......... ...+@$*;(3bxEMOQRRRRRRRRSSSSSSNNNHHINSSSSSSSSSRRRRRRRRRRRRQQQOMJGynd3(-&@.. ", +" ....++@%*->/^]]__}}60e003(//^^^^^[9lxEEEAxtsswDJOQRRSSSSSSSRRRRRRRRRRRRRRRRRRRRRRRRRQOLGysrmmmruwBDDGJLLMOOOOMLLLMOQRRSSSSRRRRQMLJGDyywwwyGLMOQOMFx1{)$@+++............. ...+@%*;(3jxFMQQRRRRRRRRRSSSNNNNHHINNSSSSSSRSSRRRRRRRRRRRRQQOMLGysg93:*$+. ", +" ...+@$&->/^]]]__}}800063///^^^^^[3btCAAxysissDJOQRRSRRSSSRRRRRRRRRRRRRRRRRRRRRRRRRRQOLCwummmrrwBDDGJJLLMOOMLLJJJLOQRRRRSRRRRQOMJGCDywuuwyGLMOQOMAk1{)@@++............... .....+@%*;(bxFMOQRRRRRRRRRRSSSNNHHHIINNSSSSSSRSSRRRRRRRRRRRRQQOLJDwnd3(=%@.. ", +" ..++@%*;/^]]]___}}66666[//^^^^^^^3alxxxxtinnsDJORRRSRRRRRRRRRRRRRRRRRRRRRRRRRRRSSRRROJDwnmmmruBDDGJJLLLMMMLJGGGGJMQRRRRRRRRQOMJGCDywuuusyGLMOOMFAl1{%@++........................++@%~:alEMQQRRRRRRRRRRRRRNNHHzzIHNNSSSSSSRSSRRRRRRRRRRRRQQOLGysg9(-{@+. ", +" ..++$&->/^]]]____}}}6[[[//^^^]]^^39jtxxtijnnwDLORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSRRMJDwrmmmrwBGGJLLLLMMMLJGCCDGJMORRRRRRRQOMJCDyywwurrsyGLMOOMExl<{%@+.......................+++@$&=:lAMQRRRRRRRRRRRRRROIzzpppzHNNSSSSSSSSRRRRRRRRRRRRRQOMJDtna3:~$+. ", +" ..+@%*;>^]]]]]___}}}}[[[/^^^]]]^^[3bltttinnsyGLQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSQMJDwnmmruBDGJLLMMMLLJJGDDDDCELOQRRRRRQQMJCyyywwuumrsyGLMOMLAkc<~%@+... .....+++....+++++@@$&*:jAMQRRRRRRRRRRQOFAk12{))!7vHNNSSSSSSSSSSSSSRRRRRRRRQOJCtg93:~)+. ", +" ..+@%*;>^]]]]______^^^^^]]]]]]]]_^[[9gnistDGJMQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSNNOLGywuwwBDJLMOOOMLJGDBwwyDGJJLLMMOOOMLGysnnruwBwwwuwyGJLLLExj3(>-&@+... .....+@$%&*=-;>>>>>>>>(alAMOQRRRRRRRQQOLAkl1{)))|pvHNNSSSSSSSSSSSSRRRRRRRRQOMEDsa9(-{@+. ", +" ...+$&->/^]]_____}[^^^^]]]]]]]]]__[[9dgntyCELOQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSNSNROLGywwwBDGLMOOOMLJGDwsstDGJLLLLLMMMMLEDtnnnuwBBBBwwBDGJLLExia3/(;&$+.........++$%&*-;>>////>>>/(atEMOQQRRRQQQOMLExl<1{{))7pHPNSSSSSSSSSSSRRRRRRRRRRQOLGyia3:~)+. ", +" ..+$&->/^]]___[[[[^^^^]]]]]]]]]__[[69gntDCJLOQRRRRRRRRRRRRRRRRRRRRRRRRRQQQRRSNNNSQMLGDBBBBGJLMOOMMJGDwunsyCJLMMMMLLLLLECtsnnswBDDDBBBBDGJJECtb3///;*$+.........+@%&*-;>//////////(atCLMOOQQOOOMLJExlc<<~{{|7vHNNSSSSSSSSSRRRRRRRRRRRRQMJCtga3<{@+# ", +" ..+@&=>/^^]_[[[[[[[^^^]]]]]]]]]___[60dntDGJMOQQRRRRRRRRRRRRRRRRRRRRRRRQOOMOORNNNQOMJGDyBBDGJLMMMMJGDwumnsyELMOOMMLLLJECyssnswBDDDDDBByDGGGCtj93^//;*$+........++$&*=;>>//////>>>/(aixELMMMMMMLJECxlca:<~{{|pHNNNSSSSSSSSSRRRRRRRRRRRQOLGysga:~!+. ", +" ..+@&=>/^^^^[6666[[^^^^]]]]]]]]____}0dntCELMOQQRRRRRRRRRRRRRRRRRRRRRRQOMLFFMOOQQOMLECDBBDDGLLMMMLJDwughgsCJMOQOOMLJEGDysnnnuwyDGGDDByDDCCDtj93^^//;*$+........+@%&*-;>>/////>>>>//3btxCEEEEEECCxtlba::<~~2ozHNNSSSSSSSSSSSRRRRRRRRRRQMJCwna:<)@+# # ", +" ..+$&->/^^^[[6666[[^^^^]]]]]]]]____[0dntCELMOQQQRRRRRRRRRRRRRRRRRRRRQOMJGCCEFMOOMLJGDDBBDGJLLMMLJDysngggtCLOQQQOMLECytsnghnsBDGGJGDDDDDDDyja3[^^^/;*%+.......++$&**-;>>>>>>>>;;>>((9jityxxxxxxttiba3(:<<12pIHNNSSSSSSSSSSSSRRRRRRRRQQLGDsna<{!+. ", +" ..+%=>/^^^[[6666[[[^^^]]]]]]]]]]___[6dntCELMOQQQRRRRRRRRRRRRRRRRRRRRQMJCytyxCEFFJEGDDBBBDGJLLLLJGDwngdgiyEMOQQQOMJCysngddhnuBGJJJJGDDDDyysg9[^^^^/>*%+.......+@%&*==-;>>>>;;---;;>((3aggjiiiiiibaa3((:<<2ozHNNNSSSSSSSSSSSSSRRRRRRRQOLGysb:~)+.# ## ", +" .+$*;>^^^^[[666[[[^^^^]]]]]]]]]]___}60ntDGJLOOQQQRRRRRRRRRRRRRRRRRRQOLCysiistDCCCCDyBBBBDGGJLLJJDBshddgixJMQQQQOLEDtngdddhuBGJLLLLJGDDywsg9[[^^^^/>=&@+.....++$%&**=---;;--=***==;>((333aaabccba:(((>:<12oINNNSSSSSSSSSSSSSSSRRRRRRQOLCyic1{!+## # ", +" ..@&->/^^__}[[[[[[^^^^]]]]]]_]]]_____69gsyCJLMOQQQQRRRRRRRRRRRRRRRRQOMGDwngggiswyyywwwwwBDDGJJJGDyundaaaiCFOQQQQOLEDsndddhuBDJMOOOMLJDDBsgd6[^_]]^/>-&$+.....+@%&***======***&&&&**=;>>((::::::::((((>::1ozINNNSSSSSSSSSSSSSSSRRRRRRQOLCyic2)+.#### ", +" ..+%*>/^]]__}}}[[[^^^]]]]]]]]]_]______[0dntDGJLMOQQQQRRRRRRRRRRRRRRRQOLCysndddgnnsssuuuuuBBDGGGGDywnd93abiCFOOQQOOLGDsnghhrwDJMOQQQOMJGysnd6[[__]]^^/;*$++...+@$&**======***&&%$$$%%&*=----=<<<::((((((:blAINNNSSSSSSSSSSSSSSSSSRRRRRQOLGyl1)!'#### ", +" ..+$*;/^^]____}}[[^^^^]]]]]]]___]_____}[9dnsyCGJLMOQQQRRRRRRRRRRRRRRQOMEDsnddddddhgmnrrruuwBDDDGDBwmd93::bixFOOQQOMLEDwsnnswDJMQQQQQQMLGysg9[[^__]]]^/>=&@++++@$&*=---===***&%$$@@@@@$%&&***~~=<::((((((:ckAIQNSSSSSSRRSRSSSSSSSSRRRRRQOJCk2|!'##### ", +"..+$&;>^^]________^^^^]]]]____________[[69dgswyCEJLMOOQQRRRRRRRRRRRRRQOLCyuhd00660ddhhmmrruwBBDDDBwrd03::::ixJMOOQOOLJGDBwwBDJMOQRRRQQOLGynd6[[^___]]^^>-&%@@@@$&*=;;;;--=**&%$@+++++++@@$%%&{*~=-:((((33alxFORRSSSRRRRRRRSSSSSSSSRRRRRQMJCk|!'#### ", +"++$&->^^]]_____________]_____________[[69ddgnsyDDGJLMOOQQRRRRRRRRRRRQQLEDsmdd0666600ffhmmruuwBBBBwrh03(:-<>>;;;-**&$@++......++@$%%&{~~<::(333aixEMOQRRRRRRRRRRRRSSSSSSSSRRRQOMAk2!'### # ", +"@%*;>^^]]___________________________[[6dggnnsswyyDGGJLOOQRRRRRRRRRRRQOLDBrhd0666[660ffhmmrruuuwwumh03(:-===*&%&&*-;>>>>>;;-*&$@+..........+@$)){{~<<:aaagitCJMOQRRRRRQRRRRRRSSSSSSRRRRRQMJxk|!'## ", +"&=;/^^]]___________________________[[9gnsssssswwByDDGJMOQQRRRRRRRRRQOLGysmhe066[[[60ffhmmmmrrrmmhf03(>;===-*&&&*-;>>>>>>;;=&%@+..... ..++@$)){211cccityCJMOQQRQQQQQQRRRRRRSSSSRRRRRQOFCl2!'## ..", +"->//^^________^____________________[9gsyDDDyywwwwwBDDJLMOQQRRRRRRRRQOLDBuhfe06}}}[60fhhhmmmhhhff033((;-===;****=;>>>>>>>;=*%@+.... ..+@!!))|2kkkkxDGFMOOQQQQQQQQQQRRRRRRRRRRRRRQOLEt1|!'# .+@", +"(((/^^[[}}[^^^^___________________[6gsCEJEGCDywwsuwBDGJLMOQQRRRRRRQOLGDwrhee066}[[60dhhhhfff0063(((>>;===-:cyGLMMOOOOQQQQQQQQRRRRRRRRROLGytsjjnnng96[[//>;**&*=;>>>>>>;=*&$+.... .+++!!!!||ooCAEFMMOQQQQQQQQQQQRRRRRRRRRRRRRQOMExl1)@. .+@)", +"ba93[[[6[[[[[^^^__________________[dsCJLMMLJGDywsswwBDGJLMMOQQRRQQOMLDBumhee066}}660dhhhdd0633(((>>;-=~==-:ixGJMMMOOQQQQRQRRRRRRRRRRRRQMJCyyyyyttng96[//>-*&&*=-;>>>;-=*&$++... ..++!!!77ppzzFMOOOQQRQQQQQQQQQRRRRRRSRRRRRQOMLCtc1)+. .+@)~", +"xtingdddd066[[^^_________________[0gyEMOOOMLJGDBwsswBDDGGEJLMOQQQOOLJDwumhee866}6600dddd0663((>>;;-=***=-:bixELLMMOOQQRRRRRRRRRRRRRRRRQMLECCCCCDysgd6[//;=*&&&*=;;;;-*&%$@+... ...+@@!!77pzzFIOOOQQQQRQQQQQQQRRRRRRSRRRRRQOOLExi:~)+. ..@)21", +"JECyttsnngd96[[^________________}[9sCLOQQQOMLEDywsuswwBBByDCJMMOOOMLGywrmhee066666099d9033((>>;;-==****=;:btCELLMMOOQRRRRRRRRRRRRRRRRRQOLJEGGEGCysg9[[/>;*&%%%&*=--=*&%$@+.... ..+@@!!!77pzFIOOOOQQQQQQQQQQQRRRRRRSSRRRRQQOMJCtb:~$+. .+!|2o", +"OMLLECDytsgd3[[[________________[6dtEMOQQQQOLJCywsuuuuunnnntxELMMLLEDywrmhee006666699333(((>;;-==*****=;:3gtCELLLMOOQRRRRRRRRRRRRSSRRQOMLJJEGGCDtn9[[//>=&%$$$%&***&&%$@++.... ..+@@$))||opzFIOOOQQQQQQQOOOQQRRRRRRSRRRRRQOMLExja<&@+. ..+)|oF", +"RQQOOLJGDtna96[[_______________[[6gtEMOQQQOOLJCywsrnmhhd999ajtCELLJGDywrmmee80666[66333/(>>;-===***==-;>(3iyCJJLLMMQQRRRRRRRRRRSRSRRROMLJGGGCDysn9[[^/>-*%@@+@$$%&&%$$@++.... ....+@%&*~22kAEFMOOOOQQQOOOOOOQQRRRRRSRSRRRQQOMFCtb:~$+.. .+!|oFI", +"RRRRQOMJGxig93[[[}__________^^[[[6dsCJMOOOOMLGDwsnmhhd06[[[39jtCEEGCDywummhee0066[[[[//(>>;-======-;;>>(3asyGJLLLLMQQRRRRRRRRRSSSSSROMJECDDyttjg9[[^//;*%@+++++@@$$$@@+++.... .....+@%*=-:>;-=====-;>>(//[3gtCEJLLLLOQQRRRRRSRRSSSSRROFEDytsnngg9[[^^^/>=&@++....+++++++++..... .. .....++$&=;>(actCEJLLMMMOMMMLLLMOQRRRRRSRRRRRQOMMFClc<{@+.. .+!7INSS", +"SSSSSSQOFCtja9066}}}}}_[/////((>>((:bilkxxxytigdd0066[[/^^^^/3ajtyDDDyBwurmhhd006[[////>;;-===-;;>////[6dsDGJLLLLLOQRRRRRRSRSSSSSQIExljggdd96[[[^^^^>-&$++.......+++++++...... ......+@%*;>((ajtCCEJLLLLLLLJJJLMOQRRRRRRRRRRQOMMFAtc<~$+.. ..+!7zNSSS", +"SSSSSRROFAxigd9066}}}[[//(>;;;------<<<<1cccaa33333[[[/^^^^^^[9gttyyyyBywwummhd06[[////>;;----;>>//[[[3dnyCJLLLLLMOQRRRRRSRSSSSSQFAlba336[[[[[__]^^>-&$++.........++++@++.............+@%*;(/39jtDCGGEJJJEGGCCELMOQRRRRRRRRRQOMFECxib<{$+.. .+!7pHSSSS", +"SSSSRROOFAxtjgdd066}[[/(>;=********~~~~~~~<<::(((///////^^^^^/3ajsyyyDDDyywurnd96[[////>>;;;;;>(/([39dgntCELLLLLMOQQRRRRRRSSSSRQIClb3([[[[[^__]]^^>;*$++..........++@!!!@++...........+@%=;//3aitDCCCCCDCDDyyyCJMQRRRRRRRRRQOMJExtjb:=&$+.. ..+@!pINSSSS", +"SSRRRQOMMJECysnhd06[[/>;=*&%%%&&&&&****{{**~=-;>>((//////^^^^^[9gstyyDDDDDyBsng93[[////>>>>>>>((33agjstDCELLLLLMMOQRRRRRRSSSSSOIxla((/^^^____]]^^>;*$@+.........++@!)))))!@++.........+@%*;(/3aiyDDDDyyBwwtstyCLOQRRRRRRRRQMLECxtjb::=&@+.... ...+!|oINSSSSS", +"RRRQQOOOMMLJECyshd93(>-*&%%$%%%&&&&*&*&&&&&**==-;>>>>////^^^^^[9gjtyDDCGGGDywsg96[///////(>>(((39gitxCGELLLLLMMMOQRRRRRRSSSSSOFCla((/^^^]]]]]]^^>;*%@+.........+@$){22222{)$@++.......+@%*;>/3gsyDDDywwunnnisyELOQRRRRRRRQMFECxtjba(:=&$@+.........+@!|ozNSSSSSS", +"RQQOOOOQQQOOMLGysh93:-*&%$$$%%&&&********&*****=-;>>>///^^^^^^[3gjtyDCGGEGGDysg9[[///////////[39gtCEJLLMMMMMMMMOQRRRRRSSSSSSQMAla3(/^^^]]]]]]^^/;*%@+........+@$&~1<1lcc<<~{%@+........@%*;>(3gsyDDywsnmhhgntxEMQRRRRRRRQOLECxtiba3(:=&$@++.....++@$)2kzIRSSSSSS", +"OOOOOQQRRRQQOMLCyia:;~*&%%%%%&&**=====********==-;>>>//^^^]]]^[3antyDCGEEGGDysd9[[[[[[[[///[[69gtCJMOOOQOOOOMOOQRRRRRSSSSSSRIAkb3(/^^^^]]]]]^^/>=&$+.......+@$%*=::bbbcb::-~&$@+.......@%*->(3gsyyyBsnhdddgiyELOQRRRRRRRQMJCxtljba3(:-*%$@+++++@@%&~1kAIRSSSSSRR", +"MMMOQQRRRRRRQOMExia:-~*&&&&&&**=--;;;;;---====--;;>>/^^^]]]]]_^[9nsyDGGEEEGDwnd6[[[[[[[[[[[669gsDEMOQQRQQQQOOOQQRRRRSSSSSNNIzkc33/^^^^^]]]]]^/>-*%@+......+@$&~->((33aa3(:-=*%@+.......+$&=;(3gsyywsnhd09djtCJMOQRRRRRRROMExtiija33(>-~&%%$$$$%&*=-:lAIRRSSSRRRQ", +"FLMOQQRRRRRRQQMExib:-=**&***==-;;>>>>>>>>>>;;;;>>>//^^]]]]]]]_^[9nsyCGGEEGCysg9[[[[[[6660600dgsyELOQRRRRRQQQQQQRRRRSSSSSPPHzo1:((//^^^^^]]^^^/>-*%@+......+$&=;>(((333((>;-=&%@+.......+$&*->3aitssnhd069diyELOQRRRRRRRQOLExtija93((>;-=*&&&**=-;>(cxFORRRRRRQQO", +"EFMOQRRRRRRRQOFCtc::-=~****=--;>>>>///////////////^^]]]]]]]]]__[9gsyCGGEGCytnd6[[[[60dfdhhdhmsyGLOQRRRRRRRQQQQRRRRRSSSNPKKv7|1:((/////^^^^^^//>-*%@+.....+@%~;>(/////((;-=~*&%@+.......+@%*-:(aninnd06669gtCJMOQRRRRRRRQOLCytjga33(/(>>;;--;;>>//3bxFOQRRRRQQOMF", +"CELOQQRRRRROMFAklc:-=~*****=-;>>>///^^^^^^^^^^^^^^]]]]]]]]]]]]^[9gsyCCGGCDtsd96[[[60dhmrrmmruwDJOQRRRRRRRRQQQQRRRRSSSNPKq54'!{=;>(//////[[[[(/(;=&%@+...+@%*->((/[///(;-**&&%$@+.......+@%*=;:agggd06[[39gtCLMOQRRRRRRQOMEDtiga33(/////>>>>/////3bxEMOQRRQQOMFEC", +"xEFMOQQOOOIFAolc<<<~~*&&&**=-;>>//^^^]]]]]]]]]]]]]]]]]]]]]]]]]^[3gsyDCCCDtsgd06[660dmuwwwuwwBDGLOQRRRRRRRQQQQRRRRSSNPKqq5,,'@){=;>(((33aabbbaa3::~&$@+++@$&=:(333[[/(>-*&%%%$$@++......+@%*=;(aagdd3[[[39gtCLMOQQRRRRRQOLCyiga33[////////^^^^^[3btEFOQQQQOMFAxtl", +"tCEFMMMIFAokk211~~~{&%%%%&**-;>/^^^^___]]]]]]_________]]]]]]]]^^[ajtyDyytsgd906600dnuwBBBBwByDJMQRRRRRRRRQQQQQRRRSNNHq5,,##.+@%*-::abblxCCACxtib:<{%$@@@%*=:33aad333(:=&%$$$$$@@++.....+@%*=;:3ada33(/(39jtCJMMOQQRRQQOLGysga93[///^^^^^^^]^^[3btCFMOOOOMFAxijba", +"ltxCAAAoo||22{{{{{&%%$$$%&*=;>//^^______]]]]]__[[[[[^^_]]]]]^^^^[9gjtttsngd99000dhnuBDDDDBBBDGLOQRRRRRRQQQOOQQQRRNHv5,,### ..@${~//^_______]]]]]__[39999[[^_]]^^^^^^[3dgnnggd990090dhnsBDDDDDDBDDJMOQRRRRRQQOOMMOOQOOIv4,### ..+${1clxEMOQQRRQOMEyi1{))%{=::aityxxttja::={%%%%&&&&%$@++++@%&*=-:::a:3((((39gsyDGJLMOOOOLEDsg9[[^^^^^^^]]]]]_^[3gtCELMMFFECxja99339", +"9aaab<1{{))))))))))%%%%&*=;>//^_________]]]__[9ajjjg93[^^^^^^^^^/[39dd99666609dhnswBDGGGDDDDGJMOQQRRRQOMLLLLMMMMzp4'## ..+${1lkAMOQRRRRRROJx22{)&*=:agtxCCECCxtja:=~&&&&*****&%$@@@$%&*~=<<:::((((33dgityDGJLLLLLGDsg9[[^^^^^^^]]]]]_^[9gtCEJFFFECxtja9936[6", +"333(::=~~{{{{{{{{{{{{*~=;>(//____}______]]__[6ajttttj9[[^^^^^^^^/[[6366[[[[660dgnsBDDGGGDDDDGLMQQQQQQOMLEGCCCECoo7'## ..+${>;;---<<<::<:-:::((/[[}}}}}}_____]_]__[9nsyyytja3[^^^^^^^^/[[[[[[[[[[60dhnuwBBDGGGDDDCGLMOQQQQOLECyttttll2)!'. ..@%~:ctEMQRRSSSRRIzo2{{{~::gtCELMMMLLECtb::;--;;;>>>>>>;-=~~~~~~~~1<<::((333dggnnswyDDDysnd6[[___]]]]]]]___[[3aitCAACxtljbaa99999936", +"[[///////((333aa93333333[[}}}}}}}}_____]]__[[djtyyysnd6[^^^^^^^^^[[[[[[[[[[60dhnuuwBDDDDDDDGJLMOQQOMLGDsjgaac1{)++.. ...@%~:aiAMQRRRRRRIzo22{{~::btCJLMMMMMLECtb:::>>>>>////^//>>;;--=~~~11<::33339dghggnsswwsng96[____]]]]_____[[[3ajtxxCxklcbaa9dddddd996", +"[[^^^^^[[[69dddhddd00066666}}}}}}}____]]]__[6dnswwsnh9[[^^^^^^^^[[[[[[[[[[[60dhmuuwBBBDDDDDGJLMOOOMLGyja93(:~{!@+.. ..+@&=>3bxFOQRRRROIAk2~~<::btCJMMOOMMMMEClc:(>>>////^^^^^^///>>;-=~~11<::33399dddhhgnnsnng96[[^___]]___^[[[[69agittkkllcbaaaddhhhhhd06", +"[[[[_[}[660dhmmmmhhfee0008888}}}}____]]]]__[6dgnnngd06[__]^^^^^^[[[[[[[[[[60dhmrruuuwwBByyDGJLMMMMLGyja3((-*%$++.. ..+@&->(atEMOQQOOFAk1<<::abtCJMOOOOOMMLExlb:(((////^^^]]]^^^///>:-<111cba3999ddddhhhnnngg96[[________[[[699dgggjiiliccc:aadddhmmnmhd06", +"[____[}60dhmmuuurmhfeee8888888}}____]]]]]__[60dhhdd06[___]]]^^^[[66[[[[[[[60dhmrrrruuuuuwwyCELLMLJGysa3((-*%@+.... ..+$*;((3jxJMMMMExlc::((3aiCJMOOOOOOMMFExia:(((///^^^^]]]__^^//((:<<//3aixEEAxtca3((33diyEMOQQQOOOMMJCtb:(((////^^^]]]]___^^//((:-&$@+... ...+@%*;///^[[[999933[/[[[6dsDLOQQRQQQOMLJCtja3((/////^^^]]]_____^^[(((:abnitwyyDCGEJJJJGDysnhdf006600dmsyCGEECylcc:::::300fhmrrrrmhe06}}_", +"___}}60fhmuuwuurmfee00086}}}}}___]]]]]]]____}}}}}}_____]]]]_^[0dhmmhdd0ddhnwBBwwrmhe0000dntCGJJEDtj93[/>-&$@+..... .....+@&=>///[^^[[[[[[[^^^[[6dnyJMQQRRRQQOMLExlba3((////^^^^]]]]]]__^^[/(33agisyyDGEJLLMMMMLGDwsnhhfffefhmsyCGEECxlcb:::(3300femmrrmmhe06}}__", +"____}60fhmuuuurmhf000666}}}}}____]]]]]]]____}}}}}______]]]__[60hmmmmhdddhuwyDyBumhe06660dntCEJEGytg93[//;*&@++........+@$*->//[[[[^^^[[[_^^___}0hBGMQQRRRRQQOMLExib33(////^^^^]]]]]]]__^^[/(3aansyDCGJLLMOOOOOMJCywurrmmhhhhnsyDCCCxlca::(33660eemmmrmmhe06}____", +"____}}0dhmuuuurhd00666}}}}}}____]]]]]]]]___}}}}}_______]___[[6dhmmmmhhhmuwyDDDBumf06}}60dsyGEJECytg93[//>;*%$@+++++++@@%*;>/[[[[[[[^^^_______}6duDLOQRRRRRQQOMJCtja3(////^^^^]]]_]]]]___^//(3agsyDCGJLLMOOQQQOMLGDBwwwurrmmmnswyyytiba33336660eemmrrrmme06}}____", +"____}}0fhmuuuumhf0066}}}}}}____]]]]]]]]____}}}}____________[}0fhmmmmmmnuwDCGGDBrh06}}[69gtCEJJECytg93[[//>;*&%$@@@@@@$&*;>//[666[[[/^^______}6fmBJOQRRRRRRQOMLGxia3((///^^^^^_____]]]___^^/(3aitDGJJJLLMOOQQQOMLGDDyyBwwuurmniiiicba:33336660eemmrrrrmhf06}____]", +"____}}00hhnrrnhd006}}}}}}}_____]]]]]]]_____}}}}__________[[[60fhmmmmmnsyDGJJGDwnd6}}_[69jyCEJJECytja9[[^^/>;=&&%$@@$$&*;>//[[6663////^___}}}60hwGLQRRRRRRRQOLECtg93(///^^^^^_____]]]]]]]^^/(3atDGJJLLLLMOOQQQOMLGGCDDDDBwunnggaaa::(((3[[660eemruuwuumhf06}____]", +"___}}60dhhnnnhd0066}}}}}}}____]]]]]]]]____}}}}}_______^[[[[600fhmmmmrswDELLLJDwh06}_[[6atxEEJEECytjg9[[^^//>-*&%%$$$%*=>///[6633(((/[[}}}}60fmuDLOQRRRRRRQOLECtg93(///^^^^^______]]]]]]]^^/(3btCJLLLLLLMOOQQQOMJJGGGGGDDBwngaa::::((([[[660efmrwBBBBwrh06[[____]", +"___}}60dhhnnhhd0666}}}}}}}____]]]]]]]____}}}}}}}____[[[[[6600fhhmmruswDELMMLJCsh0[[^[[3gtCEEEEGCxttga9[[^//>;*&%$$$%&*;>/^/[333((((//[[600dhuwDJOQRRRRRRQOMJDtg93(/////^^^]______]]]]]]]^^//3cxGJLLLLLLLMOOOOMLJJGGJJGGDysic:::::((([[[660ehmuwBDDDywnh06[[____]", +"___}[60ddhhhhd0066}}}}}}}_____]]]]]]____}}}}}}}}}_}[[[6999ddhhhmruuwBDELMOOMLGwg0[[^[[9jtCEEEEECCxtjg9[[///;=*%$$$$%&=>//^[[[3((>>(([66dhnwyDJLOQRRRRRRRQOLCtn93(//////^^^]_____]]]]]]]]^///3bxGJLLLLLLLMOOOOMJJGGGJJGGDBic<<:::((([[[60efhruBDGGGDysnd6[[[_____", +"___}}60ddhhhdd0666}}}}}}}____]]]]]]____}}}}}}}}}}}6699ggnnnsssswwwyyDELOOQQOMEyn9[[[[39jtxCCCCCCCxtsg93[(/>-*%$@@@$&*->/^^^[///(>>(/[6dnwDGLMOQQRRRRRRRRQMJDjd3[///////^^^]]____]]]]]]]^^//((bxGJLLLLLLLMMOMMLJGCCGGGGDysic<:::((/[[660fhmuwDDGJJGDysg9[[[______", +"___}}00ddhhdd006666}}}}}}____]]]]]____}}}}}}}}}}6609gnstyyDDDCDDDCGEJLOQQQQQOLDsd3[[[3ajtxxCCCCCCxyig93((>-*%$@@@$%&=>/^^^^^^///////6dnyGLOQQRRRRRRRRRRRQMEyg93(/((/////^^]_____]]]]]]]^^//((cxELLLLLLLMMOOMLJGDDDDDDDytic<::>(//[[60fhmuwBDGJJJJGysg9[[[______]", +"__}}600dhhhdd00066666}}}}____]]]]____}}}}}}}}}}609dnstDCEJJLLLLLLLLMMOQQRRRQOMGtg93339ajittxxxCCCxtib33(;=*%$@@@@$&=;>/^^^^^^^/////[0myJMQRRRRRRRRRRRRRRQLGtg3(/(>>////^^^]_____]]]]]]^^//>>:lxJLMMMMMMMOOOMJGDwssswtttic<::((/[[[6dhmuwBDGJJLLJGDwn9[[[______]_", +"__}}60ffhhfdf00006666}}}_____]]]]____}}}}}}}}6600dnsyCELMMOOOOOOOOOOQQRRRRRRQMJyia93399gjjiltxxCxysja::-~&%$@@@@$&*;>/^^^^^^^^^^^^[6hwJMQRRRRRRRRRRRRRRQQMCta3(((>(////^^]_______]]]]]^^/>>>:lCLMOOMOOOOOOOLGDtingniiiicc::((/[[60dhuwBDGGJJLLJGCynd6[[_____]]__", +"_}}60fdhhhfff00000088}}}_____]]]____}}}}}}}66600dnsyCJMMOQQQRQQQQQQQQRRRRRRRQMJxia999999aaajityyytib:<~{%%@@@@@$&*;>/^^^^^^^^^^^^^[dsGMQRRRRRRRRRRRRRRRQOLCta3((((///^^^__________]]]]^//>;:bkEMOOOOOOQQQOMJCticaaacciccb:3([[[60hnwyDGJJLLLLJGDysd6[[______]___", +"}}}60ffhhhfffe0000086}}______]]______}}}}}6000dhnsyCJMOQQRRRRRRRRRRRRRRRRRRRQMExja933333339ajistiib<<~{%$@@@@@$&*;>/^^^^^^^^^]]]_[9nCMQRRRRRRRRRRRRRRRRQOLCtb93((((//^^____________]]]^/>;;-ckFMOOOQQQQQQOMExl1<:::ccccba336[60dhsyCJJLLLLLLJGDysg9[[___________", +"}}60efhhhhffee008086}}_____]]]_______}}}6600dhnstyCJMOQQRRRRRRRRRRRRRRRRRRRQOLCta93333[[3333abjjbb<1{)$@@@@@@$&*->/^^^^^^^^^^]]]^[gCLQRRRRRRRSSSSRRRRRRQMExtga99333[[[[____}}______]]^^/>;-<1kFMOOOQQQQQOOFAk21<<::acccgad9099hnwDGLMOOOMMLJGDBwnd0[[___________", +"}800ehhhhhfeee0806}}}}__^^^]]]]______}}600dhnssyDEJMOQQRRRRRRRRRRRRRRRRRRRROMEtb933(///////3333a:<~{!@@+++@@$&*->/^^^^^^//^^^]]^[atLQRRRRRRSSSSSSRRRRRQOLExtjbggggad966[}}}}}}_____]]^^/;-==1kEMMOOOOQQOOMzo211<:::aagggggddhnsyCJMOOQQOOMLJGDwuhd6[[___________", +"880ehhhhhefee0066}}}[^^^^^^^^^]]____}[60dhgnsyDGJLMOQQRRRRRRRRRRRRRRRRRRRQOMEtj93((/(//////((((:<~)!@++++@@$%*->//^^^^/////^^]^^3sEORRRSRRSSSSSRRRSRRRQMJCytiiitstsjndd0066}}}______]^//;-==////^^^^^[[[60dgnstyCELMOQQRRRRRSRSRRRRRRQQQQQOOMFCtba3((((>>(//////(:={)@++..++@$%*->>/^^^//>>>//^^]^[axMQRRSRRSSSSRRRRSRRRQOLExttittyyDDytsnhdd006}_____]]^//>-==>>;;>>///^^^[[[9dgnstyDCELMOQRRRSSSSSSSRRRRRRQQOMMLJCxlba::::::;>>(////(>-*%@++..++@$%*->>//^///>>>>>/^^]^[jEORRRSRSSSRRRRRRRRRQOMExttistyDCCCCCyyssnhd06}____]^^//>;-<>>;;-;;;>///^^[[[9gnsyDCCGJLMOQRRSSSSSSSSSSRRRRQQOMLGCylccc:<<<<<-;;>/////>;~&$++...+@@%*->>//^//>>;--;>/^^]^3tLQRRSRRRRRRRRRRRRRQOMExtjnnistyDCGGGCDyywshd6[___^^^///>;-<>>;;----;;>(///^^[[9gstDCGGJLMOQRRSSSSSSSSSSSSRRRRQOMLGDtic<1111111<-->>/////>-*%@++..+@@%*->>/^^//>>-===;>/^]][9yMQRRRRRRRRRRRRRRRQOLEDsnggdgnswyDGGGGGGCDysg06[^^^^^///(>:::cityyDDyytic1<=-;>(/36660dhnsyDGLMOQQRRRRRQQOLGywsnggd9966666}}}}}}", +"}}}}}[[////(>>;;;-----;>>/////[[[6dntyCGJLLMOQRSSSSSSSSSSSSSSRRRRQOMJCyic<1222|221<<:>//////>-*%@++++@$%*->>/^^^//>-***=;>^]]_[axMQRRRRRRRRRRRRRRQOMJDtndd0ddhnuwyDCGGGGGCDynd6[^^^^/////(((abittyyyttic<<~=-;>(/[[6600dhnwyGJLMOQRRRRRQOMEDwnnggdd99666666}}}}}", +"___[[///>>>>;;;-----;>>/////^/[[[6dnsyCEJLMOQRSSSSSSSSSSSSSSSRRRRQOMJDtic122|oook1<:(///////>-*&$@@@@$%*=>>/^^^//>;=***=;/^]]_[gxMQRRRRRRRRRRRRRQQOLGyshd0000ddmmuwyDGGGJECysg9[[^^^/////((3agistwwssic<<~~=->(//[[}}660dhswDGJLOQQRRRQQMLCtngdddd999666666}}}__", +"^^^//(>>;;;;;;----;;>///^^^^^^[[[0dgsyDGLMOQRSSSNNNSSSSSSSSSSRRRRQOMJDti112|ooooklb((/^^^^//>;-*&%$$%&*->>/^^^^//>-****=>/^]__[gxLOQRRRRRRRRRRRQQOMJCwnd0000000fhmrwBDGGJJGDtnd6[[[[[[[[[339agissssincc<~~~=;>(/[[}}}}660dgswyGJMOQRRQQOLCtnd9909999966666[}____", +"^//>>;------;;;;;>>>//^^^^^^^^[[[60hntyCLMORSSNNNNNSSSSSSSSSRRRRRQOLExli1122kokklca3/^^^^^^//>;-=*&&*=->//^^^^//>;-***=;>/]]__[gyLMOQQRRRRRRRRRQQOLEDtnh00000000fhmuwBDGJJGDynd9[[[[[[66639agiisssinga:<~**=;>//[}}}}}}660dnstDGLMQQQQOLCtg96[[[66366[[[[[[____]", +">>;;-=***=-;;>>>>///^^^]]]__^_}}}60dgsyGLOQSSNNNNNNSSSSSSSSRRRRRRQOLCxlcc<1lllllba3[^^^_^^^^///>;;---;>//^^^^^//>;-==-;>/^]]__6gyELOOQQQQQQQRRQQQOLECtsgdd000000ffhmuwDGGJGDysg99660999ddagjisttsinga:<~{{*-;(/[[}}}}}}}60dhnsyCJMOOOOLCtg9[[[[[[[[[[[[[[[^_^^^^", +"-==******=;;>>///^^^^]]]_____}}}}60dgsyEMOSNNNNNNNSSSSSSSRRRRRRRQOLExlibbbbbccbb93[[^___]^^^^^////>>>//^^^^[[[//>;;;;>>/^]]___6dtGLLMMMMOOQQQRQQQOLECysngddddddddfhmuwDDGGGDysngdgggnnnnniistyytsngaa:~{&{~->//}}}}}}}}}00dhnwyCELMMMFAtb3((////[[[[[[[[/^^^^//>", +"**&&&&**=;>///^^^^^]]_____}[[}}6600hsyCLOQSNNNNNNSSSSSSSRRRRRRQOMLECticbaaaaaa933[[[^____]]^^^^^^^///^^^[[[[[[/(>>>>>//^]]]___6dsDGJJJJLLOOQQQQQQOLJGDtsnngnnnnnnnmuuwyDGGGDyssnnsswttttttyxCCCxtiga:<{%%&~;(/[}}}}}}}}60fhnswyCELLMFAxl::>>>>>(((((((/////>>>;;", +"&&&&&**->>//^^^^]]]___^[[[6600000dhnyCLMORSNNNNNSSSSSRRRRRRRQOOLJGxxtijgaa99933[[[[[____________]]^^^^[[60dd063(((>//^^]]]____6dnyDGGGGJLMOQQQQQOMLJGCytsssstyyywwwwwyDDGGCDyywwyyDDCDCDDCCEEEECxtcb<{)%%&~;(/}}}}}}}}800fmuBDCEJLLLFAk1<--------;:::::::;;;--=*", +"****=-;>//^^_________[[[09dhhhhhhnsyGLMORSSSSNSSSSSRRRRQQQOOMLECDxytttsigga993[[[[[_________________[[0dgusnnd3((///^^]]]_____60nuBDDDDGJLOOQQQOOMLJGCytstyDGGGGCDyyyyDDGGCDDyyDDGEEEEGGGGELLMLJCxic~))$%&=>/[}}}}}88880ehuBDGJLMMMMFAk11=========<<<<--======~*", +"--;;>(//^^__________[[9answtwwwwwyDGLMOQRRSSSSSSSRRQQQOOMLLECDytttyxDDxytijgd93[[[[[_______________[60hsByDysnd3(//^^]]_______}0huwBBBDDGLMOOOOMLLJEGCyttyCELLLLJEGDDDDDCCDDDDDCGJLLLJEGGEJLMMMMJCk1{)!$%{->/[}}}8888880fmwDGLLMOOOOMAok1<======<<<<<<111<<=----", +"((////^__}}_______[[[9ntDCGEEEGGGJLLOOQQRRRRSRRRRQOMMLJGCDytsiiisyDGEEGCCytjga996[[[[___[[[[[[}}_}}6dmwDGJGCysg33/^^]_________}0hmuwBBDDGJLLMLLLJEGCDyttyCELMOOMLLJGCDDDCDDDDDGGJLLLLJEGGGJMMOOOLAk2|!!!%*;(/[}}6688880efuyGLMOQQQQOOFAkc<<::::::>>", +"[[[[}}}}}}}______[[6ajxGLLMOOOMMMOOOQQQQQQRRQQQOMMFECxtsnnggagjiyCELLMLLECytsngd99[[[[[[[[66666}}}6dmwDJLLLECtg93[^^__________}0dmuuwBBDDGJJJGGCCDDyysssyCJMOOOOMLJGCDDCDGGGGGGJLLLLLJGCCCELMOOOMFo|!!!!)~;([[}}68888800hsDJMOQQRRRROOFCtca3333aacitkxCCxkiba333", +"[}}}}}}}}}}}____[[3ajxEMOQQQQQQQQQQQQQQQQQQQOMMLECxtiga993399gixGFMOOOOMLJGCytjng9966[6660dddd0000fhuDJLMMLJCtg93[^^__________}6fhrruwBBDDDDDDBBwwwssnnstCLMOOOOMLEGCDDCGGGGGGJJLLLLJGDyyDCLMOQOOFA77!!!&=>([[}688866660hwCLOQQRRRRRROMJCwngdddgitxCEFFFECxigd66", +"6}}}}}}}}}}}}__[[3aixEMOQRRRRRRRRRRRRQQQQOOMLLGCytjg93[[[[[3aixEMOQQQQOOMLJECytsjgd9999ddgnnnmhdfdhuyGLOOOMJDla3[^^____________60hmruuwBBBBBwwuuumnnhhhnwCJMOOMMLEGCDDDCGGGGGJJJLLLJGDywttCEMOOOOIzp7!!){<((66600086}}60hyGLOQRRRRRRRROMJDysnnnswyGJLMMMLECtnd00", +"666}}}}}}}}}}}}66ajtAFOQRRRRRRRRRRRRRQQQOOMLJCytjg93[[[//[3aiCFOQRRRRQQOOMLJECytsjggdggnswByBwummmuBGLMOOOLExia3[^^____________}0fhrruwwBBBwuummhhhhddhnsyGLLLLJECyyyyDDGGGGGJJJJJJGDyssnsyEMOOOOIzp77!)~:(360000006}66dnyJMQQRRRRRRRRQOLGDBwsswyDGLLMMLLGDsgd00", +"666}}}}}}}}}}}60dgtxEMORSSSRRRRRRRRRRQQQOMLJGysnd9[[////((alCMORRRRRRRQQOMMLJECysjnggnswyDCGDDBwwwBDJMOQQOLGtg33^^_________]]__[6fhmruwByyBBurmhfff000ddnsyCGGCxytssswyDGGGGGGGJJJJDywnggntCFOOOOIIpp7|21:addhhhhf00660hwCLOQQRRRRRRRRQOLJDBwwuwBDCJLLLJGDwnd006", +"8888}}}}}}}}6600gjxCFINNSSSSRRRRRRRRRQQOOMLGDynd93(/(>>::blAIRSSSSRRRRQOOMMFJECytsnnnstDCEJJJJGDDDGJMOQQQOLCta3[^^______]]]]]^^[6fhmuByDGGDDwumhd0006600dgnstssnnggnswyDGGGGGGGGGGDDwngddgtCJMOOOIIvpp721innssuurmhd00hsDJOQQRRRRRRRRRQOLJDBwuuuuwyDGEEGDwnh0000", +"66888888888800dhntxEFINNNSSSSRRRRRRRQQQOOMLGDsgd3((:--=<>>>(3dsDJMOQQQOMLGysh06[[^^^^______[[[69dnsBDDDBBwuuuuumh06[[[3alCFFIIzzzzzFFLMOOOQQQOMLJEELMOQRRRRRRRRRRQQOLGDwuhffffhnwyDDDywsnddf0", +"66686000effhmuwyDCJLMOOOOOMLLLLLMMOOOOMMLJCyib::<~{{||pzHNNSSSSSSSRRROMFAzAFEECxtsnswyCJLLMMMMMMMOQQRRRRRQOEtb3(//^^^^^//>;==;(aiDJMQQRRQQOLGysh06[[^^^^_______[[60dnswyBBwurmmhhd006[[^/(3btCAzzzzAAzFMOORRRRRRRQOMMMMOQRRRRRRRRRRRQOMJDBumhfffdhsyCGGGCDtsnhdd", +"[[[[[6660fhmuwyCGJLMMOOOMFJGCCCGJJLLLLLLECxiba:<~~{||pzHNSSSSSSSSSRRQOFAAAAAEECCtssstyGEJLLLMMMMMOQQRRRRRRQMCia3(//////>;=*&*=:cxJOQRRRRRQOLGysh06[^^^^^_^[[[[[[600hnuuwwwumhff0066}___^//(aikooooooAEFOQRRRRRRRRRQQOOQQQRRRRRRRRRQQQOMJDBumhffdhnyCEJJJGCysngd0", +"////((336ddmsyCGJLMMMOMMFECxywwyyDCGGGGCxtja::<<~22ozINNSSSSSSSSSRRRQMFAooAFFFECytssyDCGJJJJLLLLLOQQRRRRRRQOFxc::((>>>;-*&%%&~;;=&%$@@%{1CMQRRRRRRQOLGysh06[[[[/[39gjjjjnnnnnmmrrmmhff06}}_____]]^/>>:<11222kkxEMORRRSRSSRRRRRQQQRRRRRRQQQQQQQQOLJDwumhddhnsDGJJEECxlca:::", +"**&***~=<:ciDELMOOOOMMLJCywsnhdddgggggga33(:--<11kAINSSSSSSSSSSSRRRQOEoooozFMMMJCyttyyDDDDDDDDDGJLOQRRRRRRRROFAk1<:--~&%$@@@${kEOQRRRRRQOMGysg96[[[//[3btxCEECDywwuurrmmhee0}}_____]]]]^/>;--<1111llxAMORRRSSSSRRRRRRRRRRRRRQQQQQQQQQOLJDwumhfddgsyDCCDxlcc<<-=~", +"%%%%%&{~<;--=<1kAIORSSSSSSSSSSSRRRQMAooopzIOOMLECyyyyyyBBwwwwBBDJMQRRRRRRRRROFok1<==*&$@++@!|kEMOQRRRQOLCtng96[[[//(3bxELMMMLJGDywuummhe00}}____]]]]]]^/>;--=<111clkAFOQRRSRSSRRRRRRRRRRRRRQQQQQQQQOOLGDwnhdddddgistiicb<<~~*&&", +"%%&&&*~~<1kALOOQQQOMLLGDBumhd0333((((((>;--==<1kAIORSSSSSSSSSRRSRRROFoo7pzIIOOOMJCyytyBBwwuuruuwBGLORRRRRRRRROMAk1<~*&%@@++@!{kCFMOOOOFExig96[[[///(3btFMQQQQOMLGDBwurhee0}}_____]]]]]^//>;;--<<<>;-===<1kAIORRSSSSSSSSSRRSSRROzp77pvINRQOMLEyttssuurmmmmrrwDJOQRRRRRRRROLCk11{&%$@+++@${1kxGEEACklba3(//^^///(3lEMQRRRRQOLJDBwrmhe0}}_____]]]]]]^//>;;::<<::bclxEMQRRRRRRRRRRQQQQQRRQQQQOOOOOOMLGysgd063[((3333((>>;---==*", +">>>>((3alCLOQQQQQOMLJCysnhd66[///(((>;-=~~~11kAIORRRSSSSSSRSSRSSSSRIzpppvHNNRQQMLCyssnnnmhheeehmrBGMQRRRRRRRQMJCk1{)!@+++.++${1cittlicb::((////////(axFQRRRRRQOLJDBurme06}_____]]]]]]^^/>>::::::::bbjtAFOQRRRRRRRRQQQQQQQQQQOOMMMMLLJCysh96[[//(((((/////>>>>>>>", +"^^^^/[9iCLOQQQQQOMLEDBsmd06[[///((((:-=~~~1koFOQRRRSSSSSSSSSSSSSSSSIzppvHHNRRQOMFCtjgdddffeeeeeehuDLOQRRRRRQOLGk22)@++....++${~>(////////(axMQRRRRRQOLGDwumhe0}}_____]]]]]]^//>:::bbbb:::bblxEMOQRRRRRQQQOOQQQQQOOMLLJGGCCxtia93[///(((///////////^^^^", +"]__^[9nyJMOQQQQOMLGDwnh006[[[//((((::<1122oAIORRSSSSSSSSSSSSSSSSSSSNHvvvHNSRRQOMExjg990000088880fmyJOQRRRRQOLCy12)@+.......+${~>>(//^^^^^^/[gxMQRRRRRQOLGBwrmee6}_____]]]]]]^^/>::ccllccb:::bclCFOQQRRRQQQOOOOOOOOMLJGCyttsijga3[/////((///^^^^^^^^^__]]", +"___[6gtGLOQQQOOLJCysg006[[[[[/((3abc112oozIIRSSSSSSSSSSSSSSSSSSSSSNNHHHHNNSRRQOLCtg96[[[}}}}}}660hBGMOQQQOMJDtc1)@+.......+@${1ccba3((((//^^^^^^^^^[gyMQRRRRRQMJDBurme86}______]]]]]^/(>:clkkklc<<:::bixEMOQQRQQQOMMMMMMMLJGDtiggdd9933//////>>///^^____________", +"__[[9sCJMOOOOMLGysgd06[[[[^^[[3abclkoAzIIINSSSSSSSSSSSSSSSSSSSSSSSNNHHHNNSSRRQMEyj93[[[______}}}6dsCLMOOMJCtib<~)@+......++@)22lliba3(///^^^]]]]__[6gyLOQRRRQOLJDwumhe06}______]]]]]^/>::1kzIIIzo22{{~=<:clALOOOOMLGxtttsssng96[[[[_^^_^^^^^^^///^^______________]", +"_[6gtCELLLEDwnd6[_____^^^[[33blxFMORSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRONNNSSSSRRQMEta3[^^^^^^^^]]]___[0gsssiga::;;;;-=*&%$$$%&~1oFMMMECta93[[[[[[[___}}6fnyGLMOMLJDBwurmee06}}______]]^//:<2ozIIIzoo|)){~<:bjxEMMMMLEytjngggd90[[[___________]^^^^^^^_____________]]", +"_[9jyCEJJGDwnd6[^^^^^^^^^[33ajxAMORSSSSSSSSSSSSSSSSSSSSSSSSSSSSRROOOQSSSSRRRQMCl9[^^^//////^^^]]_[[9daaa::;;;>>>>>;-**&&&~1kAMOOMFCtb93[[[[[[[}}}}}6fhuDJJLJGDBBurmmhe06}}______]^^/>:1ozIIHHIp7|)){~-::blxEFLECxtja999066[[[_____________]^^^^^]___________]]]]", +"[9gtCEEEGCynd0[^^^^^^^^^[339blCFORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSROOOORRSSRRRQOFxj3[^^//>>>>>//^^^^^/[3(::---;>>/////>;=**~=1kFOOOMFCla3[[[[[[[[[}}}}60hrBDGGGDBwurrmhe006}}}}____^^/>:<2oIHNNHHv77!){~-((3aixCCCtjg99666[[[}}}}}}__________]^^^^]]__________]]]]]", +"6atxEJJJCDsg96[/////////[33ajxEORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQOOMOQRRRRRRQMEta[[^^/>;;--;>>//////>;;-==~=;>/^^^^//>-=*~~1oFOOOMExja3[[[[[[6666}}600fmuBDDBBwurrmhee0066}}}}___^//>:1kzINNNNHv47!){=;(((3ajlttja96[[[[[}}}}}}}6}[}_______^^^^^^]_________]]]]]]", +"gtxEJLJECyia3(((>>>>(//((3abtAMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRQOOOOQRRRRRQMJxj9[^^//>;=**=-;>>>>>;-=*****-;>/^]]]^/>-***~2AFIMMExla3[[[[[66666666600emruwwuurrmmeee0066666}}__^^/(>:lAINNNNNHvv7!{~->//^[39aga99[[[}_[_[_}[6660666[[____^^^^^^^]]]_______]]]]__", +"txELLLLExtja::-====-;>((3ablCFORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRQOOOOQQRRQQOLxj9[[_^^/>-=***=-;>>;-**&&&**=;>/^]]]]^/>-*&{{2ozFFExla3[[[[[399900666000ehmruurrmmheee006666666}}_^^//(bkFNNSNNNPHv7){=>//^^[[[366[[[[_____[[[660ddd906[[[^^^^^^^^^^]]_______]]]__[", +"xEJLMLJCxic<<~{{&{{~=<::bckAFORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRQQOOOOQQQOMLCsa6[__^^/>;=***-;;;;-**&&&&*=->/^]]]]]^/>=*&&{|oAAAxla3[/^[[[9dddd000000eehmrrrrmmheee0066666666}}_^^//3cCMRSSSNNPHv7){->/^^^^[[[[[[[_______[[69ddnnngd0[[[[//////^^^^]___________[[", +"EFLMLJCxlc11{)!!!!)){~11koAIORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRQQOOOOOOOMJCtg9[[___]^/>;---;;;;-=*&&&&**-;>/^]]]]]^/>=&%%)||ookcb((///[[9dgggdd0000eeemrrurrmmeee8088666686}}___^/(alFORSSSNNPHv7)~;(/^^____[__________[[[69gnsssng96[[////////^^^^^^^^______[39", +"EEFJECkl12{)!!!+'+!!!||ozIINSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQQQOMMLLLEDsg9[____]]]^//>>>>>>;-**&&&**-;>/^]]]]]]^/;*&%$))||21<::>>///39dggghd0000eehruuuuurheee0006666866}}___^/3bxFORSSSSNPKv7|~:(/^^______________[[[39gjsttssga3[(/////////^^^^^[[[____[[9g", +"CCCxxkl22{)!!++''''''4pvHPPNNSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRQQQOLLEGCyjg6[____]]_]^^/////(>;-*&&&**-;>/^]]]]]]]^>-*%$$@!)){{{*~=;>(/3dhhhhdf000eeemuwBBBwrmfee8000666066}}__^^[9lAORSSSSSNPKv72<((/[[____________[[[[39ajjstttsga33(((>>>(////^^^[[[[[___[[9g", +"tllic11{{)!!!+''''',45qKKPPPNSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRQOMLGDysn96[[___]]]__^^[[3993(:=*&&**-;>//^]]]]]]^/>=&$@@@@$)))%%%&~;>(6dhhhdfe000eemrwBDDDBumhffee80800006}}__^[3bxFORSSSSSNPHvo2<33[[[[[_^_______^[[[399gjtttttiga33((>>>>>(////^[333[[[__[[39", +"aaa:<~{{%)$!@+++'',5qqKKKPPPNSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRRQOLEDwnd9[[___]]]____[[9gistib:=*&&*=;>>/^]]]__]]^/-&$@+++@@@@@@@$%&=>(0fffffe0088eemuBDGGDywuhhfeeee800806}}_[[3alAORRSSSSSNNHzolba36[[[[[^^^___^^[[[339aajjtttija93((>:>>>>>(///[33993[[^^^[[3", +"(((;=~{&%%$$@++'',5qqKKKKPPPSSSSSSSSSSSSSSSSSSSSSRRRRQQQRRRRRRRRQOLGynd9[[___]]]____[9gsxGEEClc<~**=-;>/^^]]___]^/>*%@+++++++++++@$&=(30fffee8008eemrBDGJJGDwrhffeeeee80806}}[[39jxFORSSSSSSSNHzolca9996[[[^^^^^^^^[[3333aabjjijjba3(::::;;>>>>(/(3aaaa3[[^^^^^[", +"/>>-=*&&&%%$@++',5qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQQQQRRRRRRRRQOJCsg9[[[___]_____69nyELMMLJxl1~~=-;>//^^]___]]^>=&@++.....+++++@$&;(600eee80888eemuBGJJJGDwnhdfeeee88008}}}[[3bxFORSSSSSSSSNIFAkiggd996[[^^//^^^^^//(3333aaaabaa:::---;;::>>>>((abjjja3[^^^^^/", +">>;-=**&&%%$@@',5qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOQRRRRRRRRQMJDsd9[[^_______}6dsDJMOOOOLCk11=-;>//^^]____]^/;&$++.........++@%~:(6608e88888eehrwDGJJJCyshdf0000008086}}}[3alAORRSSSSSSSSROFAxljgg996[[///////^////(((33333:::<=~~~==-;;;;:::aclxtlb93//////", +">>;-=**&&%%$!!45qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOQQRRRRRRRRQMEysg9[[[______[6dsDJMOQQQOLGlc<-;>(/^^^_____]^>=%@+..........++$&-([668888888eeemuBDGJJGDwnd00000000686}}}[[3jxFQRSSSSRSRRRROFAxtjgd96[[[//>>>//////((((((((:;=~{&&{{~~<<<<-::;-=~*&&%)!!45qKKKKPPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOOQRRRRRRRRRQMJDwnd0[[[[_[[60gwCJMOQQQOMJxib::>(//^^______^/;&$+...........+@%=>/[68888888eeehmuBDGJGDysh0066}}}}}}}}}}}[6atEORSSSSSSRRRRROLCyigd96[[[//>---;>>>>>>;;;;;;;-~&%$$$$){~11<<<11koAFFFAxia3((((/", +"((>;-=~{{))74vKKKKKPPPPSSSSSSSSSSSSSSSSSSSSSRRRRQOMMOQRRRRRRRRRRQMLGywnh906660dgsyGLMOOQQOMLCtga(((///^^_____^^>=%@+..........+@%*;/[}6888888eeeehruBDGGDysh066}}}}}}}}}}__[[3jCMQRRSSSRRRRRRROFCtja96[[[^/>-*&**-;;;;-======*&%$@@++@!)|222222oAIIOOOFAtib:((((", +"//(>;=~{{|7vvKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRQMLLMOQRRRRRRRRRRQOMLECywsnggnswDGLMOOQQOOMLGynd3((///[^______^/;&$+.........++@$&;(/}}88888eeeeehmrwBDDDysnd06}}}}}}}}}}___[[atFORRSRSRRRRRRROMExia96[[[^^/>*&%%&&*===**&&&&&%%@@+++++!77ooooopzHNNRROOFClcb:333", +"[//(:-~2|pvHKKKKPPPPPSSSSSSSSSSSSSSSSSSSSRRRRQQMLLLOQRRRRRRRRRRRQQOMLLJGCDyyDGJLMOOQQQOOMLGynd6[/////[[_}___^/>*%@+....++++++@$&=>/[}68888eeeeeemmuwyDDysnd06}}}____}}_____[3jCMQRRRSRRRRRRRQOJCtg93[[[__^/-&%$$$%&&&&&%%$$$$$@+++..+''7pppppzHHNNSSRROFAklca333", +"[[((:<2|pvKKKPPPPPPPSSSSSSSSSSSSSSSSSSSSSRRRRQOLJJLOQRRRRSSRRRRRRQQQQOOMLLLLLMOQQQQQQOOLJCBnd6[//////[}}____^/-&@+...++@@@@$$%&=;/[[60888eeeeehhmruwyyBsnh06[}_____}}}}___[[9tEORRRRRRRRRRQQOLExia3[[[__^^>=&$@@@$%%%%$@@@@@@+++....''4vvzzzvHHNNSSSSROMExlcaa36", +"[[((:1opvKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRRQOLJJJMORRRRRSSRRRRRRRRRQQQQQQQQQQQRRRQQQOLJDwnd6[^^//////[}___^/>*%@+.+++!))%%%&&~;(/660eeeeeehhmmmmruwwwsnh066}_____}}}}}}__[3gxMQRRRRRRRRQQQOMJDib3[[[[^_^/>*%$@@@@$$$$@+++++++......'44vvIIHHHPNSSSSSRQMFxlca996", +"[[(3ckpHKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLJGJMQRRRRRSSRRRRRRRRRRRRRRRRRRRRRRRQQOLJDwnd0[[^//>>>///___^^>=&@+++''!||{~***~->(6dhhhfeefhmmmmmmussssnhd06}}____}}}66}}}[[9tEMQRRRRRRRQOOMMJCtja3[[^^_^^/>*%$@@@@@$@@++...........''4vvIIIHHNNNSSSSSROMAxiaa6[[", +"^[3bkzHPKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSSRRRRRQMLGGJLORRRSSSRRRRRRRRRRRRRRRRRRRRRRRRQQMJDBuh0}_^^/>;;;;(//^^^/;*$@++''47po21~~~=:(dgussurmmmmmrrrmnnnsnngd06}}____}}}60006669jxLQRRRRRRRQOOMLJGDsb3(/^^^_^^/;*&$@@@@@@+++...........+'7pzIIIIIHNNSSSSSRROFCtca3[[[", +"^3alAIHPPPPPPPPSSSSSSSSSSSSSSSSSSSSSSSSRRRRQOMJGCGLMQRRSSSSSSRRRRRRRRRRRRRRRRRRRRQQOLGBuhf6}_^^>;****->>//>;*%@@+''4vpzok1<==-:anyDCDDywuuuruurnnnnghd066}}}___}}}60df0069gtEOQRRRRRRQOMLLJJCxia3(/^^^^^^/>~&$@@@@+++............+'77pzIIIIIHNNSSSSRRQMExia3[[[_", +"^3bxFNPPPPPPPSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLJCDDEMORRSSSSSRRRRRRRRRRRRRRRRRRRRQQOLGDwrh0}}_^/;*&%$%&**==*&%@@++'4vvIIAkl<<<::ctGLLLJDywuuuurnhhddd0066}}____}}}600dddd0djCMQRRRRRRQQMLLLJECyia3(/^^^^^//>=&$@@++++.... ....''77ozFFFFIIINSSSSRRQOLClg9[[^__", +"^3lFINNNPPNSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQOLGDyyxGFORSSSSSSSRRRSRRRRRRRRRRRRRQQOMJDBumf0}_^/>=&$@++@@$%%$@@@+@@7pzIIIAkl1<<:biDJMMLLGDwsunnhhdd0066[}}______}}}600dddddnyJOQRRRRRRQOMLLJJGCtib((//^^^[[(:=&$@@+++.... ###''77zzFMMFFIINNSSSSRRQMEyja3[^^__", +"[axMRSSSNSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQOLGysiitCFIRSSSSSRRRRSSSRSSSRRRRRRQQOLJGDwume0}[//;*%@+....+++++++@@)|ozIIFAkc<::::ixJMMLLGysnnhdd00666[}}________}}}}6000ddntEMQRRRRRRQOMLLJJJGCtc<:>(///[33a:<{$@+++.... ###'44pzFMMMMMFIIRSSSSRRROLCtg33/^^__", +"3jAORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLCyigbclkAFIQSSSRSRSSSSSSSSRRRRRQOMLJGDBwumf0}[/>-&@+...........+@${2oAFFAkcb:::(3btCJLJGDtngd00666}}______________}}}6600hsCLORRRRRRRQMLLJJJGCxic<-;>//33bjll2|)!++.... ##,,5vvIIIOOMMMMOORSSSRRRQOLCtb33[[^__", +"axMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLCwna:<122opzIIQRRSSSSSSSSSRRRQQMLGDDDBBBurhf6[(>=%@+... ....+@%~>((3jtCCCysnd9666[}}__________________}}}60gtEMQRRRRRRQOMLJEEGCDtic<=->/(3btCAAAo7!''.# ##,,55vHHNOOOOOOMOORRSSSSRRQOLCtja33[[[[", +"tEORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRQOJDsb::=~{{)||opzIORSSSSSSSRRRQOLGDyyBBBBBwumd63(:~%@+... ....@%=:bbbba:(>>>///[9gsssjnd9666}}}}___________________}}6dsCMQRRRRRRQOMLJGGGCDysc<<=->(3atAMMOIzp7'''#######,55qKPNNRRQOOOOOOORRSSSRRRQOMExlcba3399", +"EMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRQMJyia::=*&%))))||ozIQSSSSSSRRQMJCtsuuwBBBBBund03(:=&$+... ...+%=:(((((>>>>//^^[[9gnnngdd9666}}}}__________________}}6dtJOQRRRRRQQOLJGGCDDyysg:<-;>(3jCLOQQOIIp44'#####,,5qqKPNNSRRQQOOOOOQRRRRRRRRQOLExkklcbjit", +"MORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQOJCsb:(;=*&%%$$)){2koFIRSSSRRQMFxsnhhnuwBBBBsnhd93:-~%$+... ...+$*;>>>>;;>>//^^^[[9dgnnnnngd00066}}}}__}}}}}}}}}_}}}}60nCLQRRRRRQQOLJGGCDDDywsg::;:((atEMQQRROIzp74'',,,5qqKKPPSSSRRQQOMMOQQRRRRRRRQOMFAoookkkxCE", +"OQRRSSSSSSSSSSNNNNNNSSSSSSSSSSSSSSNNNNNNNOMJxib3((>-=*&%%%%{~<1loFIRRRRQOMExjgddhhuwwBwsngdda3:<~%$+.. ...+@&=;;;--;;>/^^_^[60hnswyyyysnhff0066}}}66006}}}}}}}}}0dwEMQRRRRQQOMLGGDDDDDyytna::>(3atJOQRRQQOMzpp7445qqKKKPNSSSSRRQOMMMOQQRRRRRRRQOLEAoo7oooAFM", +"QQRSSSNNPPPPPKKKKKKPPNNNNNHHIIIIHHHPKKKHIAxlba3(((>;-=~***~=-::ixFIRRRRRQMLCtjgddhgnsssssngggga:<~%@+.. ..+@%&*====-;>^^]_[[0hnsBDGJJGGDwumhee00fffffee0066}}}60dnDLOQRRRQQOMJGDDDyyyDDyyib:(((3bxJMQQQQQOMFFAzpvvKKPPNSSSSSSRRQOMMMOQQRRRRRQQMLGxko777ooEMO", +"QQRNPPKKKKKqqqqqqqqvvvpppooo||||||7744447|1<(((//>>>>;;;;::::actAMORSSRRRQOMExjgdddgnnsssssssiig:~)@+. ....+$%&&&&*=;/^^^[[6dgnwDGJMMMLJDBwrmmmmmuuuurmhff000000hsCLOQQQQQOLJGDByBBBBDDDDtia:((3axEMOQQQOOMMMLLIINNNSSSSSSSSSRRQOMMMOQQRRRRQQMJCtl2|!!77oAMO", +"QONKqqqqqq5555,,,,''!!)){){{{{{{{))!!'+'!){=;>>>>>((((3333adnsDJMRRSSSSSRRRQMJxjgd9ddgnnsswyyytic~)@.. .....+@$$%%%&=;/^^^[[9dhnwDJLOOOOLJDBwwuwwBDDDDBwumhff00fhnyELOQQQOMLJDBwwuuuwBDDGGDic:((3bxEMOOOOOOOOOOOORRSSSSSSSSSSSRRQOMMMOQQRRRQQOLCyic1)!!!)2xFO", +"QIvq555,,,,,######.+@$%%&&&&&&&&&&%$$@+@@$&*-;>>>((:abjinnnwyGLORRSSSSSSSRRRQMJxtga9ddgnssyyDxti1{!+. ....++@$$$$%&*;/^^^[[09dgsDJMOQQOMLJGDDDDGJJLJJGDyumhfddhnsDJMOOOOMLGDwurmmmmuwBCGGCtc::(3jxJMOOOOOOOOOQQQRRRSSSSSSSSRRRRROMMMOQQQQQQOLGynd:~)!@@)2lEO", +"Oz5,,,######## .+@$%&&&&***====*&%$@@$%&*-;>>>(ajtxCCyDDGJMQRRRSSSSSSSSSRRQMExjga9ddgnstyyyl12!+. ...+++@$$$$$$%*;>/^^[[[60dnBGLOQQOOLJJJJJJLMOOMMJGDwunhhhgsyCJMOOMLJGywumhhffhmsyCGECkc:::blAMOOQOOOOOOQQQQRRRRSSSSSSSRRRRQOMMMMOQQQQOLJDsh3:~)$@@)~cDM", +"Jo'###### ..+@%&&**==-;>>>>;-*&&%&&*=-;;>:bkAFLLLJGJLOQRRRRSSSSSSSSRSRRQMEyjgaddggnsssi1|!+. ..++@$$%%%%$$$%*->/^^^[[[[0dsDLMOOOMMLLLLMOOOOOOMLGDwsnhhgntDELMMMLJGywumhfe00ffnwDGGCkc<:biCFOQQQQOOOOQQQQRRRRRRRSSSSSRRRRQOMLLMMOOOMLJDwmd3:~%$$$&~btJ", +"y1!# ..+@$&*=-;>>>//^^//>;-=**==-;;>:lxFMOOOMLLMOQRRRRRRSSSSSSSSRRRQMFCtjg99dagggc1|!'# ...+@%&&***&&%%%%*->//^^^^[[[0nyGLMMMLLLLMOOOQQQQOMLGysnhddgiyCLMMMLLGDwumff00000fhsyCCCtccccxFORRRRRQQOQQQQQRRRRRRRSSSRRRRRRQOMLLLLLLLJGDwrh03(={%%&~:anD", +"n:)+. ...+$&*-;>>//^^]]]]^^/>>;;;;;>(blAMOQQQQOMMOOQRRRRRRSSSSSSSSRRRQOMEyig999999a<)@.# ...+$&=-;;;;-*&&%&*=;>//^^^__[6dsDGJLJLLLMOOQQQQQOMLGDsngd9dgsxELMMMLJDysmdf066}}60hsDCCCxlllxFORRRRRRRQQQQQQRRRRRRRRRRRRRRRRRQOLLJJJJJGDBwrhf63(-~{*~:3drB", +"m3~$+............+@&=;>//^^^]]]]__]^^//>>>>>(bkFOQRRRQQOOOOQRRRRRRRSSSSSSSSRRRQOMEyja93333(<)@+ ..@%*;>////>>-=*&**=;>>//^^^__[0hsyDDGJJLMOOQQQQOMLGysgd9399gtCLMOOMLEDwnhd06}}}}}0hsDGEECkkxEORRSSSRRRRRQRRRRRRRRRRRRRRRRRRRQQOLLJGGGDDBurhf063(:=~=:(0huw", +"h0:&@+++..++.+++@$&=;//^^]]_______^^^///(((alxFORRRRRQQQOOQQRRRRRRRRSSSSSSSRRRQOLCtj933((>=%@.. ..+%*;/^^^^^/>>-=**=--;;>>//^^^}6dhuwyDGJLMOOOOOMLJCysg96[[39jyELOOOMLGysgd06}}___[6dsDEJEACCAMORSSSSRRRRRRRRRRRRRRRRRRRRRRRRRQQOLJGGDDBBurmff063(::::33dmuB", +"h0(=&%$@@@@@@@@$%*->/^^^_______[[[[[33333ackFMQRRRRRRRQQQQQRRRRRRRRRRSSSSSRRRRQMExja3(/>-*%+.. ..+$*;/^]]]]]^/>;-=========;>/^^^[6dhmuBDGJLLMMLLJCysg93[[[[3aixFOOOOMLGysh06}}____}6gtCELFEEEFORSSSSSSRRRRRRRRRRRRRRRRRRRRRRRRQQOLJGDDBwurmef00633:::33dhruB", +"h0(>-**&&&******-;//^^_____}[[669999aaaaclAFORRSRRRRRQQQQQRRRRRRRRRRRRRSSRRRRROLCla3((;=&$+.. ..+$*;/^]]]]]]^/>;-==***&&&&*=>/^^[}60dmuBDGGJJGGDysg96[[[[/(3btEMOQQOMLCynd06}_____[6gtGJMLFFFMORSSSSSSRRRRRRRRRQRRRRRRRRRRRRRRRQOLJGDBwurmeef00033::3adhmuwB", +"he6/>>;;;;;;>>>>//^^^[[[}66660dgnjtjiiltCFORRSSSRRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMEtb3((-*%@+.. ..+$*;/^]]]]]]]^/>;-=**&&%$$$%&=>/^^[}60dmuwyyyywsng96[[^^^//(3iCLOQQQOMLCtnd6[[_____[6gtGLMMFFMORRSSSSSSRRRRRRRRQQRRRRRRRRRRRRRRRQOLJGDBurmhee000093aaaddmruBB", +"he6[/////////////[[[[660000ddnsyDCCCxCAFMORSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQOFxj93(;=&$+... ..+$*;/^]]]]]]]]^/>;=**&&$@@+@@%*;>/^^_}}0dhmnnngd06[[[^^^^^//3bxJOQQQQOMJCtnd6[_____^[6gtELMMMMMQRSSSSSSSRRRRRRQQQQQRRRRRRRRRRRRRRQOLJGBwummeee00099aaaddhruwBB", +"he6[////////[33399aggnnnnnnswyGJLMLLFFMORRSSSSSRRRRRQQQRRRRRRRRRRRRRRRRRRRRRQMCta3((;~&@+.. .+@&;/^]]]]]]]]]^/>-=**&%$@+++@$&=>/^^^__}6600066[[[^^___^^^/3atEMOQQQQOMJCwn06[_____^[3gyELMMMMOQRRSSSSSRRRRRRQQQQQQRRRRRRSSRRRRRRQOMJGBwrmeee00009daaddhmruwBB", +"ee6[[////[33ajitxxCCCCCCDDDCGJLMOOOOOORRSSSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMExj33((;=&$+.. ..@&->^]]]]]]]]]]^/>-=**&%$@+++@$&=;/^^]_____[[[_^________^^[39iCLOQRRQQOLJDwg06[[_^^^^[9nyEMMMMOQRRRSSSSRRRRRRQQQOQQQRRRRRSSSRRRRRRQOMJDBurmfe000099dddddhmruwBw", +"ee6[[//(3ajtxEFMMMMOMMMMLLLLLMOQQRRRRRSSSSSSSSSRRRQQQQRRRRRRRRRRRRRRRRRRRRROLCla3[//>-*$@+......+%*>/^]]]]]]]]]]^/>;-=**&%$@@@@$&=;>/^^]]_______]]]]]___^[[[9jxJOQRRQQQOLGysh06[^^^^^^[9sCLMMOOOQRRRSSSRRRRRRQQOOOOQQRRRRSSSSSRRRRRQOMJDBumhee000099aadddhmruwwu", +"e06[[(3abtCFMQQQQRRRRRQQQOOOOQQQRRRRSSSSSSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMEtj93[//(;~%@+.....+$*;/^]]]]]]]]]]]^/>>;;-=*&%$@@$%&=;>/^^]]]]]]]]]]]]]___[[[39jyEMOQQQQQOMJDwnd0[[^^^^^^[gtEMOOOOQRRRSSRSRRRRRRQOMLLMOQRRRRSRRSSRRRRRQOLJDyumhff000099aaddhmruuwuu", +"e66333bckEMORRRRRRRRRRRRRQQQQQQRRRRSSSSSSSSSSSRRRQQQQQRRRRRRRRRRRRRRRRRRQQMExia96[[//>-&$@+...+@&->/^]_]]]]]]__]^^//>>>;-*&$$$$&*->//^]]]]]]]]]]]]]]__[[39ajtALOQQQQQOMJGBsh06}^^^^^^[3nCLMOQQQQRRRSRSSSRRRRQQMLJLLOQRRRRRRRSRRRRRQQOLJDyumhf000009daaddhmruuuur", +"0633:<1kAIRSSSSSSSSRRRRRRRQQQQQQRRSSSSSSSSSSSRRRRQQQQQRRRRRRRRRRRRRRRRRQQMExsg936[[[/>;*%@+++@@&=>/^]]_]]]]]___]^^^^///>;=&%%%%&=;>/^^]]]]]]]]]]]]]__[[39ajtCJMOQQQQOMLGDwnf6[_^^^^^^[9sEMOQQQQQRRRSRSSSRRRRQOLJGGLOQRRRRRRRSRRRRRQQOLJDBumff0000099adddhmrruurr", +"63(:<1koINNSSSSSSSSSSSRRRRQOOMOQQRRSSSSSSSSSRRRRQQOOQQRRRRRRRRRRRRRRRRQOMExtgd966[[[/(;*%@@@@$&~;//^]]]]]]______]^^^^^^/>-*&%&*=;>/^^]]]]]]]]]]]]]]__[39gjtxEMOQQQQOMLGDwrf0}__^^^^^^[gtJMQQQQQQRRRSRSSSRRRRQOLGDCJMQRRRRRRRSRRRRRQOMLJDBsmff000099999ddhmrrrrmm", +"3(:<2||pINNSSSSSSSSSSRRRRQOMLJLMOQRRSSSSSSSRRRRQOOMOOQRRRRRRRRRRRRRRQQOLExiga93666[[/(;*%@@@$&~;(/^]_]]]]]______]]]]]^^/>-*&&*=;>/^^]]]]]]]]]]]]]]__[39gitxELMOQQOOLJGDwrh06}__^^^^^^[gyLOQQQQQQRRRSRSSRRRRRQMJDyDGMQRRRRRRRSRRRRRQOMLEDBsmhff00099999ddhmmrmmee", +"(:<{||7pHNNSSSSSSSSSRRRRQQMJGCCGLMQRRSSSSSRRRQQOMLLMOQRRRRRRRRRRRRRRQOLExiga9900666[/(;*%@@$%*;>/^^_]]]]]________]]]]]^/>-***->>/^]]]]]]]]]]]]]]]__[[9gitxEFMOQQOOLLGDwuhf6}__]]^^]]^[gDLOQQQQQQRRRSRRSRRRRRQMGyByGLQRRRRRRRSRRRRRQOMLGDBsnhdf000099900dhhmmmee0", +":-~{)!7pvNNSSSSSSSSRRRRRQMJCtsstDEMQRRRRRRRRQOMLJJJLOQQRRRRRRRRRRRRQOMExigd9999d006[/(-&%$$%&=>/^^]__]]]]_____^__]]]]]^/>-==->/^^]]]]]]]]]^^]]]]]_^[9gjtxEFMOQQQOMLJDBumf0}___]]]]]__6gDLOQQQQQRRRRSRRSRRRRROLCywyCLQRRRRRRRRRRRRQQOLJGDBsnhdf000009900fhhhhee6}", +"-~{)!!7pzHNSSSSSSSSRRRQOMEDwnggmsyGLOQRRRRRQOLJGDDGJMQQRRRRRRRRRRRRQMJCtja999ddddd6[/>-&%$%&*;>/^]]]]]]]______^^^^^^^^/>;--;>/^^]]]]]]]]]^^^]]]]__[9gjtxEFMOQQQQOMJGyumd06}__]]]]]]__[dyJOQQQQQRRRRSRSSRRRRROLDwswDLORRRRRRRRRRRRQOOLJGDysnhdd000066660fffff06}}", +"=*%)!!77zIRSSSSSSRRRRQOLEDsnhdddhnwDJMQQQQQMLGDBBBDJMQQRRRRRRRRRRQQMJCtjg999dhgmhd06/>-&%%%*->/^^]]]]]]]____[[^^^^^^^//>;;;>>^^]]]]]]]]]^^^^]]]__[9gtxCELMQQRRQQOMJDBuh06[[__]^^]]]__[dwEMQQQRRRRRSRRSSRRRRROJDwswDLORRRRRRRRRRRRQOMLJGDwumhdd0006666600fff06}}^", +"*&%!!!77zIRSSSSSRRRQQOLGyshdd0000fhsyGLMOMLJDyuuuBDJOQRRRRRRRRRRQQMLGysgd99dhnnnnh06/(;*&&*=;>/^^]]]]]]]____}[^//////>>>;;>>/^]]]]]]]]]^^/^^^]]_[3gtxEFMMQRRRRRQOLGDsnd06[__]]^^^]]]_[9sGMQQRRRRRRRRSSSSSRRROJysnsDLOQRRRRRRRRRRRQOMLJGDwumhf00066[[[6000006}__^", +"&%$$!!|ozIRSSSRRRRQOMJCyshd00000000dnwCJJJGDwumruwDLOQRRRRRRRRQQOMJCysga999dhnnnmd0[/(;=**=->/^^]]]]]]]_____[[//>>>>>>;;;>>/^^]]]___]]^^///^^^^[3gtCFMMOQRRRRRRQOLCtnd06[___]^^^^^]]_[9sGMQQRRRRRRRSSSSSSRRROJysssDLOQRRRRRRRRRRQQOMLJGDwumff0066[[[}}60006}__]^", +"%$$@!)|ozORRRRRRQQOLEDwnhd0000086660dmsyDDywummmuBGLOQRRRRRRRQQOMECtjgd9000ddhggd9[[/(>-=-->>/^^]]]]]]]_____^//>;;;;;---;>>/^^]]____]^^////^^^^[atELMOOQRRRRRRRQMEynd66[___]^^///^]]_[9sEMQRRRRRRRSSSSSSSRRROLCwwwDLOQRRRRRRRRRRQOOMLLEDBumff066[[[}}}}66}}__]^^", +"%$@@!)|oIORRRRRQQMLEDsndd00000886}660dmswwsrmhhmuyJMQRRRRRRRQQMLEDsng996666000096[[//>>;;;>>//^]]]]]]]]_____^/>;-----==-;;>//^^^^^^^^^//>>//^^[9lCLMOQQRRRRRRRQOLCsd0[}___]^^/>>>/^^^[9tEOQRRRRRRSSSSSSSSSRROLGyByGMQRRRRRRRRRRRQOOMMLJCysmf006}}}_}}}}}}}___]^/", +"$@@@!|ozIQRRRRQOMJCysgd000008888}}}}60hnusumhhhmwDJOQRRRRRRRQOLEDsn9966[[[[[[[[[[////>>>>>>>/^^]]]]]]]______^/>;;--=====-;>>//^^^[[^//(>>>//^[3jxFMOQQRRRRRRRQQLGtg0[}____]^>;;;>>/^^[gyLORRRRSRSSSSSSSSSRRRQMECDDJMQRRRRRRRRRRQQOOOMLJCysnf006}}____}}}}___]]^/", +"@@@@!|pzORRRRQOMJCtjgd0000088886}}}}60hnsuurmmmuBGMQRRRRRRRRQMLCtja9[[[[[[[[[^^^///>>>>>>>>/^^]]]]]________^^/>>;;--=***=--;>>///[[[/(>;;;>//3atEMOQQRRRRRRRRQMJyn96}____]^/;=*=->/^^3jCMQRRRRSRSSSSSSSSSRRRQMJGGGLOQRRRRRRRRRRRQOOOMLJGywnf06}}______}_____]^/>", +"@@@@!|pIORRRQOMJCtng906600088886}}}60dnswBwwuuuyDJOQRRRRRRRQOLEyia93[[[[^^^_^^//>;;;;;>>>//^^]]]___________^^//>>>;-=******=-;>(////(>-=~-;((3jxFMQQRRRRRRRRQOLCsd6[____]^/;=&&*=;//[atJORRRRSSSSSSSSSSSSRRRQOLJJJLOQRRRRRRRRRRQQOOOOMLGDwnd06}}___________]]^/>", +"@@@@!7zIQRRRQOLCtja9666600088886}}66dmwDCGGDDDDGJMQRRRRRRRROMExlb93([//^^^^^^//;-==-;;>>//^^]]]_____}}}}____^^///>>;=**&&&&&&*=;>((>;=*&&*->(atEMOQQRRRRRRRQQMGtg3[^__]]^/>=&%%&*;>/3jCMQRRRRSSSSSSSSSSSSRRRQOLLJLMOQRRRRRRRRRRQQQQQOMLJDwnd06}___________]]]^>;", +"@@@!!pzIQRRROMEyia96666600888886666dhsCJLLLLLJLLMOQRRRRRRRQIFxlc:((((////^^//>>-=*=-;>>//^^]]____}}66686}}__^^^^^/>>-**&&&%%%%&*=--=*&%$%&=:3jxFMOQQRRRRRRQQMEyn3[/^^^^^/;=&%$%&*;>(ayJORRRRRSSSSSSSSSSSSRRRQOMLLLMQQRRRRRRRRRRQQQQQQOMJDwnd0}[___________]]^/>;", +"@@@!7pINRRROOFCtg93[666000888886660hsCLOOQQQOOOOQQRRRRRSSNIzok11<==--;>(////>>;-==-;>>/^^]]]___}60feeee06}}__^^^^^/>;=*&&%$$@@@$%&&&%$@@@%*>>>>>>-*&$$$%&=;(3jCMQRRRRRSSSSSSSSSSSSRRRQOMMMMOQQRRRRRRRRRRRQQQQQOMJDwnd6[[__________]]]^/>=", +"@@@!7zHNNNQOMExia96[6600088888060fhsDLOQRRRRRQQQRRRRRRSNNHp77))))%&&{~-;>(((>>;;;;>>//^^]]]___}0fhmmmmhe06}}_^^^^^/>;-**&%$@+++++@@@+++++$&1cxFOOQQRRRRRRQMJxi<~{&&&****&%$@@$%*->(atEOQRRRRRSSSSSSSSSSSSRRRQQOMMOOQRRRRRRRRRRRRQQQQQOMJDwnd6[___________]]]^>;=", +"@@!7pHNNNNQOFAtja3666000eee88800dhuyJOQRRRRRRRRRRRRRSSNHvv4''!@@@@@$){~-:>((>>>>///^^^]]]____}0fmuuwwwumh06[[^^^^^/>>;=*&%@+++..........+@)2kAMOQQQRRRRRQMExl1)$@@@@@$$$@@@@@%&=;((ayJORRRRRRSSSSSSSSSSSSRRRQQOOOOQQRRRRRRRRSRRRRQQQQOMJCwg96[[^________]]]^/>-*", +"@@!7vHNNNNNOFAtja366600eeeee800fhnyGMQRRRSRRRRRRRRRRSNHv54'''++++++@!)~<<:(((////^^^]]]_____}0dmuwBDDDBwnh0[[[^^^//>>;=*&%@++............+!|AFOQQQQRRRQQMFxl2)@+....+++++++@$&*;>/3gyLOQRRRRRSSSSSSSSSSSSRRRRQQOOQQQRRRRRRSSSRRRRRQQQOMJDsg9[[[^_______]]]^^/>=&", +"@!7pHNNNNNNOFAtca936000feeeeeefhnyGMQRSSSSSSSRRRRRSSNHv5,,##....++@!){21cba3(//^^^]_______}}0fmuwBDGGGGDwnd6[//////>>;=*&$@+.... ..''pzIQRRRRRRQQMFxk2)@+........++++@%*->//3gyLOQRRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRSRSSRQQRQQQOMJDsg9[[[^^^^^^^_]]]^/>;*&", +"@!7vHNNNNNNIFAtca9900000ee0e0edmwDLORSSSSSSSSSSSSSSNHv5,,##....++@!)|2kkliga3[[^^_______}}}00hmuBDGJLLLJCtga33(///>>;;=*&$@+... #'4vHNNRRRRRQQMJxl2)!+.. ....++@$&=>/^[6gyJOQQRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRRSSRRQQOQQQOMJCsg9[[[^^^^^^^^]]^^/>-&%", +"@!7vHNNNNNNIFClca990000000000fhnDJORSSSSSSSSSSSSSSNHv5,,##...+++@))22kxxytia9[[[[_____}}}600fhmuyDJLMOMLExib33(((>>;;-*&%@+... #,5KHNSSRRRQQMJxl1{)+.. ...++@%*;>/^^6gyGMOQRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRSSSRQOOOQQQOMJDsg9[[^^^^^^^^^^^^^>;*&$", +"!74HPPNPNPNIzxlba366600000000fmwGMQRSSSSSSSSSSSSSNHv5,,##..++@@$%{11lyDxytng96[[}}}}}}}66000ffmsyGLMOOOMLCtiaa3((>;;-=*&$@+... #,5qPNNSSRRRQOFClc1{$+.. ...++$&=>/^^[6hsCLOQQRRRRSSSSSSSSSSSRRRRRQQQQQRRRRRRRRRRQOIIOOQQOMExia3[[^^^^^^^^^^^^/>-*%$", +"!4vHPPPPPPHIzklb9366666666660dsxJORSSSSSSSSSSSSSNHv44'#...+@@$%{~</^^[6dsDJLOQRRRRSSSSSSSSSSSRRRRRQQQQQRRRRRRRRRRNIIIOOOOOMExja3[^^^^^^^^^^^^//;=&$@", +"'4vKPPPPPPHIAkia93[[[}}66666dgtGMQRSSSSSSSSSSSSRIvp4'#...+@@%&*=-:acittwssnhdd000666686886800fhwCLMQQQQOMExtiga::;-=*&$@++... #,,vHNNSRRRQOMExb:=&$+.. ..++$&->/^^[6dnyCJMOQRRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRRRRIIIIIOOOMFAtb93[^^^^^^^^^^^^/>;*&$@", +"44vPPPPPPPHzAkca36[[[}}}}}60dnxFORSSSSSSSSSSSSNIzp4''...+@@%&*-;:(3agnissnnmhhdff00068886}6600hwGLOQQQQOMExtljba:;=*&%@++.... ##4vHNRRRQQOMFxja-{$+... ..++$&->/^^[6dgsyGLMQRRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRRROFzzzIIIIMFxla3[^^^^^^^^//^//>>-&%@@", +"4vHPPPPPPHHzolca3[[[[}}}}}69gtCMORSSSSSSSSSSSNHIp4''...+@$%&*=;;>((3agnnususurmhffe0066}}}}}6dnyJMQQQQOMLExytica:-~&%@@+...... .'7pFOOQQQOMLCla:~%@.. ..+@%*->/^^[60hnsyGLORRRSSSSSSSSSSSRRRRRRQQQQRRRRRRRROIzppzIIIIIAxia3/^^^^^////////>;*&$@@", +"vvPPPNNPPHIzxlcd3[[[____}[6diyJMQRSSSSSSSSSNNHHp4''...+@$%&=-;;>>((33dhnwByyywwumhf006}}}}}}0gwGLOQQQQOMJGCCxtib:=*%$@+....... ..+!2kAFOOOOMLExb:-&@+.. ..+@%*;>/^^[60dgnyCJORRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRQOFAoppvHHIIAkca(/^^^/////////>>-*%$@@", +"vHHNNNNNNNIAxlg93[[[____[[9gtEMORRRSSSSSNNNNHvp4'''+++@$&*=;;>>>>((30dmwDDGGGDDwumhf06}}}}}6dsDJMQQQQOMMJEECCxlc<~{$@++......... ..+${/^^[69dhnsDJOQRSSSSSSSSSSSSRRRRRRQQQQRRRRRRQOMAooopvHHIzAkc3(/^^////((////>;=&%$@@", +"HHNNNNNNNIIAxlga3[[[___[[6aiCJMORRRRRNNNNNHHvp7'!'++@$%&=;>>>>>((((3dnwDGJLLLJGDwuhf06}}}[69nyJMOQQQQOMMLLLLECxl1~)$@+..............+@&-:bxCJLLLExia3-&@.. ..+$&=>//^/[660dhsyJORRSSSSSSSSSSSSRRRRRRRQQQRRRRRRQMJxkkopvIHIzAkc3(/^///(((((//>>-*&%$@!", +"HNNNSSNNOIFExtja9[[[__[[[9jxEMOOQRRQNOIIHHvp77!!!@@$%&~->>////////39hsDGLMOOMLJDysmd06[}}[6gtEMQQQQQQOMMMMMMLJCl1{)!@+.............+@&=>(alxEJEExta3(=%@.. ..+$&->///[[669dhsDJORRSSSSSSSSSSSSRRRRRRRRRRRRRRRQOMExkkozzHIIFAkca(///(/(((((>>>;-*&%$!!", +"NNNSSRRQOMFECysgd6[[[[[[9jtCFMOOOOOIIFzzzpp7|)))))%&~-;>////////[3dnwDJLMOOOOLJGysgd6[[[[[9sCMOQRRRQQOOOOOOOOMAk2{)!@++...........+@%*;/(9ixCEExtg3(:*$+.. ..+$*->///[339ddgsDLORSSSSSSSSSSSSSRRRRRRRRRRRRRRRQOMCklkozIIIIFAkca3///(((::(>>>>;=&%$$!7", +"NNSRRROOMMFECytjgd6[[[[9gtxEFMMMMIFFAAooo|22{{{{~~~=;>(///[[[[[39gsyGJLOOOOOMLJCysh0[[[[[9gxLOQRRRRRQQQQQQQQOMFo2{)$@+++.........+@%*;>/[9ixCECyja3(-&@+. .+@%*;>///[39dddnwCMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRRQOFAxkkozIIIIFAkca3//(((:::>>>>;-*&%$!!4", +"NNRRROOMMLJJECDtsg99669ajxCEFMFFFAAokkkl11<<<----:::((([[[[[[39gsyCJLMOOOOOMLJCysg96[[[[[9tEMQRRRRRRRRRRRRRRQOFo2{)$$@++........+@%*;>//[atCEECtj3(;~%@.. ..+$&=>///[39ddddnyGMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRRQMFCxkkAzIIIIFAtb33//(((::::>>;-*&%$@@'4", +"NNNQOOMLLJJJJECDtng9999gtxCEEFEACxkkllicc::((((((::a33333[639gsyCJLMOOOOOMLLECysg9[[[^^[[atFOQRRRRRRRRRRRRRRROFk2{{)$@++.......+@%*;//^[6gtCEECta3(-&@+.. ..+$*;>///39ddddgsyEORRSSSSSSSSSSSSSRRRRRRRRRRRRRRQQMJCkkoAzIIIFFxlb33//(((::::;;;=*%$@@+'4", +"NNOOMLJJEJJJJEGCysgd999gjxCCCCCxxklllicba333(333aaaaa993339gntCJLMOOOOOMLLGCysnd6[[^^^^^3gxLOQRRRRRRRRRRRRRRQOAk1~{%$@++.......+$*;(/^^[9nxEEExla(;*%@.. ..@%=>///[6ddggdgsyGMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRQOMExkkoAFIIMFAxja33[/((:::;;;;-*&%@@+''4", +"HIMLLJGCCGEEJEGDysg9999ajttxxxxxtktttliga933339abbjbba9999gntCJMOOOOOMLJGDtsgd9[[[^^^^^^3jxLOQRRRRRRRRRRRRRROMAl1~{)$@+.......+@&-(/[[[[9jyCECxja:=&@+.. .+@&->//[39dddddgsyJMQRSSSSSSSSSSSSSSRRRRRRRRRRRRRQOLCxlkoAFIMFFCtb33[//(((:;;;;-=*&$@+++'4", +"IIFJGDDyDDCGGGDywnd96[39ajitttxxxCCCxytjga999abjjiijbaa9dgnsDGLMOOOOMLECysgd96[[^__]]^^^3jxLOQRRRRRRRRRRRRRQOFxl<~{$@+........+%~:([[[[6djtyxtia(;*%@... .+$*;(/330ddddddgsyJMQRSSSSSSSSSSSSSSRRRRRRRRRRRRQOMExlllkAFFFFAxia3[///(((:;;;;-*&%$@+++'4", +"zzGCywwwwyDDDDDBshd6[[[39abiltxCAEEECCytjgaagjjillijbaaaggnwDELMOOOMLGDwnh06[[[____]]]^[[gyJOQQRRRRRRRRRRRQOFAlc<{)@+... ..+${;([[[[[69gjssja3>=&@+.. ..+%~:(330dddddddgsDJOQRSSSSSSSSSSSSSSSRRRRRRRRRRQQMJCtjclkCEFFECtb33[^^///(>;;;;-*&%$@+++''", +"ooytsiinswwyyDywnh06[[[[39ajitxEEFFJECxtijjjjltllljjbbjgjnsyDGJLLLLECyshd06[[[_____]]__[6gyEMOQQQQQQRRRRRRQMEkc<~{$@+.. ..@%=(([[[[[[69dga93(-*$+.. .+@)<:339ddd9399dgtCLORRSSSSSSSSSSSSNNNRRRRRRRQQQQOLExibbilxAEECxia3[^^^^//(>;;;;-*&%$@+++''", +"oklinggdgnswBywsnd0[[[[[[39gitxEEFFJECyttiillttllliiilltstwyyDGGGGDysnh0066[[[_________[6hwGLOOQQQQQRRRRQQMExib<~%@+.. ..+$~>//[[[[[[[[66[[(;~%@+.. .+!{<:aaddda3339dnyGMQRRSSSSSSSSSSNNHHIINRRQQQQQOOMExlbabblxCCCxtj93[^^^^//(>>>;;-=&%$@++++'", +"|2ccaa39dhnswwwsnd0[[[[[[[9ajtxCEEEECxyttiitttlllllltxxxyyyyyyyyywsnhd066[[[[__________}6hsDJMOQQQQRRRQQQOLClb:<~%@+.. ..+$&;(//^^^^[__[[[[/>=&@+... .+@)21ccgdaa33339gsDJOQRRSSSSSSSSSNHHzppzIOOQQOOOMLECtjaaabltxCxtig9[[^^^^^//>>>>;-=&%$@++.+'", +"22<:::(33dhnuwwsnh96[[[[[[69gjttxxxxtttiiiiiliiilltxCAECCDyywsssnhdd0666[[[[[__________}0hsDELOOQQQRRQQQOLEyib:-*%@+... ..+@&->/^^^^^_____^^//;&$+... ..+!22lligaa:::(39gtCLORRSSSSSSSSSNHvp777pzIOOOOMMLECtja99agitxxytna3[[^^^^^///>>>;-=&%$++..++", +"){~<:::((3dhswywsgd6[[[[[[[39gjjjiiijjjjjjjjjjjilxCEFFFJECyysnnhd0066}[}[[[[[[________}0fmwDGLOQQQRRRQQOMJCtb::-*%@+.....+@%=>/^^^^________^/>*%@... ..+$)2kkktic::::(3aiyEMQRRSSSSSSSSNHzp7777ozIOOOMMLECtjg999ajityytig9[[[^^^^^////>>;-=&%$++...+", +"){~~=--;:(9giwywsnd0[[[[[[[669dggggaaaaaggggjjjlxCEFMMMLJCywshd0066}}}}[[[[[[[______}}0dmuyDJLOQQRRRRQQOMJxib::-~&$@+...+@%=>//^^^________]^/-&@+.. ..+@)2koACxtic<<::abtCLORRRSSSSSSSRIzp7!!!|ozFOOMMLECysg9999ajittttig9[[[^^^^^^///>>>-=&%$++....", +"%%{*~===-::anwwwsnd96[[[[[[6699999999999aaaabjitCEMOOOMLJCysnd066}}}___[[[[[[[____}}60hnwyDGJMOQRRRRRRQOMExlc::-~&$@++++!{=:(/[[[^________^/>*%@.... ..@%~1kAFFAxlc<<::aixEMQRRSSSSSSSNIzp|!!!!)|AFMMMLECtjg99399ajitttsnd6[[[^^_^^^////>>;=&%@++....", +"$%%&&&**~=:aisttsng906[[[[[6669999999999999aajtCEMOOOOOLECysg966[}____}[[[[[[[}}}}}60huBDCGJLMOQRRRRRRQOMGxlc:<=*&%@@+!){1:336[[[[[}}}____^/;*$+... ..+${>;=&%@++....", +"@@$%%%%&&~<:ciwtsngd96666666999993366663339aglxEFMOOOOMLCysnd06[______}[[666[[}}}}60hsyDGJJLLMQQRRRRRRQOLEkl<<=~{%$$!!)21cgdd0066666[}}}__^/-&@+... ..+@%~>;=&%@++....", +"@@@$%%%%%{~=%@... ..+$&=cxFOOOIAk1>;=*%@+.....", +"+@@$$$%%%&{1clttsingdddddddddd99936[[[[399ajtxCJMMOOMFExtng9[[[______[[6666666}}60fnwDGJJJJLLMOQRRRRRRQMFCl1<~~{&)))|ooCCDysnhddd000066}_^/>*$+... ..+$&>;=*%$+.....", +"++@$%%%%%%{11kxyttinggggghhgddd993[[[[699gjstyCELMMLJCxsgd0[[[______[[669000666660dnBDGJJJJLLOQQRRRRRQOMAkl1~~{{{{{2oAEJJCywnhdfdfff06}}_^/;&@+.. ...+${>;-*&$+.....", +"+@$%&&&%%%{2kkxxytsssssnnnnngad93[[[[69agjttyDCCEEEGDyig96[[_______[[660ddd000000fhsyGJJJLLLMOQRRRRRRQOFok11~~~*~~1kAFMLLGysnhdffff006}__^/-&@... ...+${1kFOQQNIAlb:39aiyEMQRRRRRRRIzo|)!@+++@!)|oAAxtj93[[[[3339aaaa93[[[________]]^^^//>>-*&$++....", +"@$%&***&&%{2koCCxxttttssssinga933[[[[9ajjttyyyyyDDytsgd96[[[______[[[69dddddd000ffnwDGJLLLMOQQRRRRRRRQIAk2~~~~~=<1kAFOOMLEDsnhdfff006}}__^>=%@.. ...@${1oINRQIFola333ajyEMQRRRRRRIFpo|)!@+++@!)|oAAAtj93[[[[339aaaa99[[[[_________]^^^///>;-*%@+....", +"$%*=--=*&&)|2oAACCyytttwtsngga33[[[[39gstyyyyywwssngd96[[[^_______[[69ddgnhhfdfdhnsyGJLLMOOQQRRRRRSSSNIo|{{~~==-*$+.. ..+@%{2AINNNIFkca3339jtGMOQRRRROIAo|))@@@+@@!|oAFFAtj93([[339aaaa993[[[[_________^^^^^^//>;=&$++...", +"&*-;;;-*&&){2oAEECDyyywtsngaa33(/[[[9gjtyyyyyssnggd93[[^^_______^[[69ddgnnnhhhhmnsyDJLMMOQQRRRRRSSSSNHp7|){{~-::cxFMQQQOLEDwshhfff06}___^/;&@+.. ..+@%~kAINNOIAlb3[[[9gtCLOQQRQOIAo||)!@@@@@@!|ozFFAxj93((339aaaaaa93[[[[_____^^^^^^^^^^^^/>;*&$++++", +"=;>>>>;=&&%{2oAEEECDyttsnga33(((//[[9gstyyyysnghd06[[[^^________[[[99gnnnsnnnnuwBDCJLMOOQQRRRRRRSSSSNHp7)){~=::cxFOQQQQOLJCyssnhff06}__^/>*%+.. ..+${1kzIOOIFxia3[[[6gsCLMQQOOIAo||))$@@@@@!)|zIIFFxia3((33aabbba996[[[[___[[[^^^^^^^^]]^^/>;*%$@@$", +">>///>>=*&%{2kAFFECDytigaa3((>>(//[39gsyyyysnhd06[[[^^^]]]]]___[[[69ggnnssssswyDGEJLMOQQRRRRRSSSSSSNNv7!)){~-*&&&&", +"//^^^/>-*&%{2kAFFJECysga33((>>>>(((3djstytsngd06[[/^^^^]]]]]___[[69dgnsssswwyDCELLMOOQQRRRRRSSSSSSSNHv7!){~<=%@+.. ..+$&~1kAFIFAxla3[[[[6dnyELMMFzp|!!@@@+@+@@@!|pzIIIFxlb:33abjjjjgad000666}}}[[[[^^^^^____]]^^/>-===-", +"^^^^^/>=&%%)2kAFFJECtia3((>>;;;;>((3ajsttssgdd6[[/^^^^^]]]]]]__[[69gnjsttyyyDGJLMOOOQQQRRRRRSSSSSSSNHp7|{~<;*%@... ..+@%*=;;>>", +"^^^^//;=&%$){2oEFJCxiba::>;;;;;;;>(3ajsttsngd96[[//^^^^^^]]]]_^[[99gjstyDDCCGELLMOOOQQQRRRRSSSSSSSNNHp|211ckAMORRRRRRRQOMLJEGDywmf6[^//>=&$+.... ...+$&=-:lkAAAxklja9000dhsyGJFzp7!'++++++++@@$)|pFIIFAxlcbbbittttsnghhffeeeeeee066[[[[_______]^^/>>>//", +"^^^//>-*%$$!)|oAEACtcb::;;;;;;---;::acittingd33[/////^^^^^]]]^^[[9gjttDCGGGEJJLLMMOOOQQRRRRRSSSSSSNNIpk11lkAMORRRRRRRQQOMLLJGDysh0[[//>;*&@+.... ...+$&*;>:blkxxxxttigdddhnwDGEFzp7''.+...+++@@)||AFIFFAklcccitxxxytsnmhhhheeeehff06[[[[}}}}____]^//////", +"^///>-*%$@@+!!|oAokl<<===--;;;--==-:bcitlingd33/////////^^^^^^^[39jtyCEJLLLLLLLLLLLLMMOQRRRRSSSSSSNNzokllkAFORRRRRRRRQOMLLJEGDBrd6[//>>-*%@+... ...+$&*;>((:clkxxCCCytnmmnsyDGEzp74''....+++@@$)2oAFFFExklccitxCCCxytsnmmmmhhmmmmmff06[}}}}}____]^/////[", +"(((>-*%$++++''77oo22{{{**=-----====<-*&$++... ...+$&=;>///(ablxAEJJGDywsswDCGEzp4''.....++@@$){2oAFFFAxllcilxCCCCDywsurmmmmmmrrrrmhff0066}}}___^^//(339", +"a3:={)@++.##''4477|)))%%&*=---=***~~>>>>>>>>>////[9jtCFMOQQQQOMLJCDyyxCEMOQRRRRRSSSSQIAokxAFORRRRRRRRRQOMLJJEGDBnd6[//>-*&%@+.... ...+@&*;>////(3alxEMMMLJCDyyDDGGzzp4''#....++@$){2koAFFEAxliiltxCEECDywuurrrrrrrruuurrmhhfe00}}___^^/39gii", +"ic<{)!+.###,,,,447!!@@@$%&*===*****~~1cilicba:(>>>>>>;;;;;;>>/(3atCFMQQRRRQQOLEDttttCEMOQRRRRSSSSROFAoxAFORRRRRRRRRQQOLLJEGDysg9[//>-**&$++... ..+@%*;>/^^^//3alAMOOOOLJGDDDGGEzp44''#...++@@$)22kAAFEACtliilxCCEECDywwuurrrrrruuwuuwuumhffe0}}__^[[9jtxC", +"l12)!''###,,,,,44'''++@@$%&******&&*~<1ccccb:::;;;;;;-==**=-;>(3ixJMQRRRRRRQOLEDtttxELOQRRRRRSSRRROFAAAFOQRRSRRRRRRQQMLJEGCDynd6[/>-=*&%@++... ...+$&->//^^^^/3atEMQQQQOLJGGGGJJzp44''#...++@$){2koAEEEAxliiltxCEEECDyBwuurrrrrruwwBBBBwwurhf06}}_[[9gsxCG", +"k2|!'''##,,,,5544'''+++@$%&&***&&&&{{~</^^^^^/3bxLOQRQQOMLJGGJJJzp4'''#..+++!))22koAAAAxtliiltxCEEEGDyywuurrrrruuwBBDDDDDBwrmf06}}[6dntCGG", +"22)!'''',',,555544''+++@@$%&&&&&&&&&{~<<<<<<==~*****&&&%%%&*=:blCMORRRRRRRRRQMECxCEMOQRRRSSSRRRRQOMFFMOQRRSSRRRRRRQQOLJGCDysnd6[/(;=*&&%@+.... ..+@&=>//^^^^/[9iCMQRRRQQOLJJGJJFzp4,''#..++!!)||oooCACxtijjjlxCEEJEGCDywuuurrruuwBBDDGJJGGDBumd06669ditxDx", +"2))!!+''''445vvv477!++@@@$%%&&%%%%%%&*~=<--=~*&%%%%%%%$$$$%*-:cxEMQRRRRRRRRQOMJEEFMOQRRSSSSSRRRQOMMMMOQRRSSSSRRRRRQQMLECDysnd9[[/>;=*&%$@+.... ..+$&->//^^///3atFORRRRQQOLJJJJJFzp44,,''''!!77ooooCCCxtljbjitxCEJJJEGDDBBuuuuuuuwBBDGJLLLJGDyumd0009gnsttt", +"))!!!!!!)77ppvvzpp7!!!@@$$$%%%%%$%%%%&*~==~*&%$$@@@$$$$@$%&~:biCJOQQRRRRRRQOMLJJLMOQRSSSSSSSSRRQOMMOOQRRRSSSSSRRRRQOMLGCywsg96[^/>-**&%$@+... ..+$*->//////(3jCMQRRRRRQOMLJJJFFzv44,,,''477ppzzAAACxxtijbjlyCELLLLJGGDDBwuuuuuwBBDGJLMOOMLJDBuhdd9ddgnii1", +")!!))){22|ozzIIIzpo|))$$$$$$$$$$$$$$%%&*~**&%$@@+++@@@@@$%*-:aiCJMOQQRRRQQOMMLLLMOQRSSSSSSSSRRRQOOOQRRRRSSSSSRRRRRQOMLGCysnd9[[^/>-*&&%$@+... ..+%*;>////>((btFORRRRRRQOMLLJLLIIvv555555vvHHIIIFFAAxtljjjitCELLLMLLJGDDBwuuuuuwBBDGLMOQQOMLGDwsghdddaab<1", +"!)){21;*&&%%$++... ..+@&=;>//(>>::iAIRRSSRRRQOMLLLLMIIHvqqqqqKPPNNNNNIFEAxtljjitxELLMMMMMLJGDDBwuuuuwBBDJLOQQQQOMLGDwngddda:<~{", +"7||21cclxAFMOOOOMFAk2{)$$@@@++++++++@@$%%%$@@+++.+++++@@%&->3ajtDGLLMOOMMLLLLMOQQRRSSSSSSSSSRRQQQQRRRRRRRSSRRRRRRRQOOLLGDtnd[[//;*&%%%$@+... ..+%*;>///>;;<1kFQSSSSSRRROMLLLMOOHHKKKKKPPPNNSSSROMJAxtljjiyCJLMOOOOMMLJDDBBwuuuwBBDJLOQQRQQOMJGywngaa:<~{)", +"ppokktxxEFMOOQOOOIzo2{)$@@++++++..++++@@@@@+++....++++@@%*-(3djsyCGJLLLLLLLLMOQRRRSSSSSSSSSRRRQQQRRRRRRRSSRRRRRRRRQQOMLEDtg9[//>*&%$$$$@+... ..+@&=>>//(>;-12oINSSSSSSRROMLLMMONNNPPPPPPNSSSSSSSRMFExtljitxGLMOOOOOOMLJGDDBwuuuwBBGJMQQRRRQQOLJGDtigbc1||7", +"vzzAACCELMOQQQQQOOIAo|!@@++..........+++++++......++++@@%*;(3ajsyDCGEJJJJLLMOQRRRSSSSSSSSSSRRRQQRRRRRRRRRRRRRRRRRQQQOMLGysa3[/>=&$@@@@@@+... ..+@%*;>//((:;=12zISSSSSSSRROMMLMOQRNNNNNNNSSSSSSSSSROFCxtiistCELMOOQQQOMLJGDBwwuuuwBBGJMQRRRRRRQOMLECyti12|74", +"NIIMFJFLMOQQQRRRROIzp|!+++........................++++@$&=>(3antyDCGEEJJLLMOQRRRSSSSSSSSSSRRRQQQRRRRRRRRRRRRRRRRRQQOOLJCtg9[//;*$@+++@@++... ..+@%*;>///((:;<1kzNSSSSSSSRROMLLMORRSSSSSSSSSSSSSSSSROFCttiisyCJLMOQQQQOOLJGDBwuuuuuBBGJMQRRRRRRRQOOMJGCxoppvv", +"NROOMMMMOQQQRRRRRROIp7!++.........................+++@@%&->3djsyDCCGEJJLLMOQRRRSSSSSSSSSSSRRQQQRRRRRRRRRRRRRRRRRQQOOMJCtn9[[/>=&@+++++++... ..+@%*;>////((>:<//////(>::-&@+.......... ..+@%*;//^^/[[/((>(:lFORSSSSSSRQOMLLMRSSSSSSSSSSSSSSSRRRQMCtsinssyDJLMOQQQOMLGDywurrrruuBBDJMQRRRRRRRRRRRRQONNNNSS", +"RRRQOMMOOQQQQQRRRRRNIz4''++.++......... ...+@$%*-:bixCGEJLLLMOOQQRRRRSSSSSSSSSSRRQQQQRRRRRRRRRRRRRRRQQOMMLJCysg9[^^/;*$@+......... ..+@%*;//^^^[[[//(((3iEORSSSSSSRQOMLMORSSSSSSSSSSSSSSSRRROLCtsnnswyDJLMOQQOOMJGDBwurrrruuBBDJMQRRRRRRRRRRRRRNNNSSSS", +"RRRQMMMOOQQQQQQRRRRRIzp7!+++@@++++..... ...+@@%*=%@+.......... ....@%*;/^^^__[[[/((((3bCMRSSSSSSROOMLMORSSSSSSSSSSSSSRRRRROLCytssswyDGLMOOOOOLJCywwurrruuuBBDJMQRRRRRRRRRRRRNSNSSSSS", +"RRQOMMMMOOQQQQQRRRRROIp7!!@@@$$$@@++.... ...+@%{=&@+...............+$&->/^^__}}[[/(((/3bxMQRSSSSRROMLLMORSSSSSSSSSSSSSRRRRROLGCytwwByDJLMOOOOMLGDywwurrruuuBBDJMQRRRRRRRRRRRRSSSSSSSS", +"RRQMMLLLMMOOOQQQRRRROFo|!$$$%%%%%$@+.... ...+@){1ctDCEJLMMOQQRRRRRRSSSSSSSSSSSSRRRRRRRRRRRRRRRRRRRRRRQQOOLJDwn9[/>-&$+...............+@&=>/^^__}}[[(((>(/(axLQRRSSSRROMLMMORSSSSSSSSSSSSSRRRRROMLGCDyyyDGJLMOOOOMJGDywwuuruuuwBBDJMQRRRRRRRRRRRRSSSSSSSS", +"RQOMJEEJLLMMMOQQQRRQOzo|)$$%%&&&%$@++... ..+@${1clxCGJLMOQQRRRRRRRSSSSSSSSSNSRRRRRRRRRRRRRRRRRRRRRRRRQQOMLGyn93(-&$+...............+@%*;/^^__}}6663((>//(9tEORRSSRROMLLMMORSSSSSSSSSSSSRRRRRRQOMLLEGCDGJLMOOQOOMLGDywwuuuuuwBBDGJMQRRRRRRRRRRRSSSSSSSSS", +"QQMLEGGGEJLLLMOQQQQOFA2{)$$%%&&&%$@+.... ...+${/^^_}}60003(((//[9lEMQRRRRQOMJJLMQRRSSSSSSSSSSSRRRRRRQQOOMLLJJJLMOOQQOOMLGDywwuuuuuwBBDGJMQQRRRRRQQQRRSSSSSSSSS", +"QQMLEGCCGGGJLMOQQQQOFo2{)$$$%%%$$@++.... ...+$&<:bixCJMOQRRRRRRRSSSSSSSSSNNNNRRSSSSSRSRRRRRRRRRRRRRRRQQQMLCwg3(-&@+.. ........+@$&->/^^_}}60fd03(((//[3jxMOQRRQOMFEGJMORSSSSSSSSSSSSRRRRRRRRQQQOMMLMMOOQQQQOMLGDywuuuuuwBBBDGLMQQRRRRQQQQRRSSSSSSSSS", +"QQMLEGDDDDCGJLOQQQQMEk2)$$@$$$$@+++...... ...+$&-(ajtCJMOQRRRRRRRSSSSSSSSNNNNNNSSSSSRSSRRRRRRRRRRRRRRQQQOLJDsa3>~%@.. ........++$&=>/^^__}}0ddd03((////3atEMOOOOMFGCCGLORRSSSSSSSSSSRRRRRRRRRRRQQQOOOOQQQQQQOMLGDywuuruuwBBDDGLMQQRRRQQQQQRRSSSSSSSSR", +"QOMLEGDDDDDCELOQQQOMAk2)$@@@@@+++........ ....@$&-(3gtCLMQQRRRRRRRSSSSSSSNNNNINNSSSSSSSSRRRRRRRRRRRRRQQQOMJCwg9(;*$+.. ......++$&=>/^^]__}60ffd03(///^^[3iCFMOMMJCDyDGLORRSSSSSSSSSSRRRRRRRRRRRRRQQQQQQRRRQQOMJCywurrruuBBBDGJLMQQQQQQOOOQRRRSSSSSSRR", +"OMMJEGDyyyyDGLOOQQOFCl{)$@@++++.......... ...+@$*;(3bxEMOQRRRRRRRRSSSSSSNNNHHINSSSSSSSSSRRRRRRRRRRRRQQQOMJGynd3(-&@.. ....+++@%*;/^^]___}60ef03((//^^^/3axAFMFFAxywyDJORRSSSSSSSSSRRRRRRRRRRRRRRRRQQRRRRRRQOMGDwurrrruwBBDGGJLOOQQQOOMMOQRRSSSSSSRRR", +"MMLEGDyywwwyGLMOQOMFx1{)$@+++............. ...+@%*;(3jxFMQQRRRRRRRRRSSSNNNNHHINNSSSSSSRSSRRRRRRRRRRRRQQOMLGysg93:*$+. ....++@%*->/^]]__}}60e003(//^^^^^[9lxEEEAxtsswDJOQRRSSSSSSSRRRRRRRRRRRRRRRRRRRRRRRRRQOLGysrmmmruwBDDGJLLMOOOOMLLLMOQRRSSSSRRRR", +"MLEGCDywuuwyGLMOQOMAk1{)@@++............... .....+@%*;(bxFMOQRRRRRRRRRRSSSNNHHHIINNSSSSSSRSSRRRRRRRRRRRRQQOLJDwnd3(=%@.. ...+@$&->/^]]]__}}800063///^^^^^[3btCAAxysissDJOQRRSRRSSSRRRRRRRRRRRRRRRRRRRRRRRRRRQOLCwummmrrwBDDGJJLLMOOMLLJJJLOQRRRRSRRRRQ", +"EGCCDywuuusyGLMOOMFAl1{%@++........................++@%~:alEMQQRRRRRRRRRRRRRNNHHzzIHNNSSSSSSRSSRRRRRRRRRRRRQQOLGysg9(-{@+. ..++@%*;/^]]]___}}66666[//^^^^^^^3alxxxxtinnsDJORRRSRRRRRRRRRRRRRRRRRRRRRRRRRRRSSRRROJDwnmmmruBDDGJJLLLMMMLJGGGGJMQRRRRRRRRQQ", +"CDyyywwurrsyGLMOOMExl<{%@+.......................+++@$&=:lAMQRRRRRRRRRRRRRROIzzpppzHNNSSSSSSSSRRRRRRRRRRRRRQOMJDtna3:~$+. ..++$&->/^]]]____}}}6[[[//^^^]]^^39jtxxtijnnwDLORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSRRMJDwrmmmrwBGGJLLLLMMMLJGCCDGJMORRRRRRRQQM", +"ttwwwwuumrsyGLMOMLAkc<~%@+... .....+++....+++++@@$&*^]]]]]___}}}}[[[/^^^]]]^^[3bltttinnsyGLQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSQMJDwnmmruBDGJLLMMMLLJJGDDDDCELOQRRRRRQQML", +"ssswwwuuruwDELMMMFClb:~%@+... ....++++++++@@$$$%%&*-:lFORRRRRRRRRRRRQOMAok|||7pIHNNSSSSSSSSSSSSRRRRRRRRQOMJDtga3:{$+. ..+@%*;/^]]]]]____}}}[[/^^^^]]]]^[3ajltiiiswDJMQRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSQMGywumruwDGJLMMMMMLJJGDDDDDCELOQQRRRQQMJC", +"nnsuwwuuuswDJLMMMExj::=%@+.. ...+++@@@$$%%&&****~-:bxFORRRRRRRRRRRQOFAk22))|7pHNNSSSSSSSSSSSSSRRRRRRRRQOLGyia3:=&@+. ..+@%*;/^]]]]]______^^^^^^]]]]]]^^[9gjiiiswyGLOQRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSQLGywuruwBDJLMOOOMLLJGDyyDDDGELMOQQQQQMJCt", +"nnsuwwwuuwyCJLMMJClb3:-&@+... ....++@$$%&&*=------;>:jAMQRRRRRRRRRRQOFAk12{))!7vHNNSSSSSSSSSSSSSRRRRRRRRQOJCtg93:~)+. ..+@%*;/^]]]]]______^^^^^]]]]]]]_^[3ajiistyDJLORRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSOLGywuuuBDGLMOOOMMLJGDyyyDCGEJLMOQQQQMJCtn", +"nruwBwwwuwyGJLLLExj3(>-&@+... .....+@$%&*=-;>>>>>>>>(alAMOQRRRRRRRQQOLAkl1{)))|pvHNNSSSSSSSSSSSSRRRRRRRRQOMEDsa9(-{@+. ..+@%*;>^]]]]______^^^^^]]]]]]]]_^[[9gnistDGJMQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSNNOLGywuwwBDJLMOOOMLJGDBwwyDGJJLLMMOOOMLGysn", +"ruwBBBBwwBDGJLLExia3/(;&$+.........++$%&*-;>>////>>>/(atEMOQQRRRQQQOMLExl<1{{))7pHPNSSSSSSSSSSSRRRRRRRRRRQOLGyia3:~)+. ...+$&->/^]]_____}[^^^^]]]]]]]]]__[[9dgntyCELOQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSNSNROLGywwwBDGLMOOOMLJGDwsstDGJLLLLLMMMMLEDsng", +"uwBDDDBBBBDGJJECtb3///;*$+.........+@%&*-;>//////////(atCLMOOQQOOOMLJExlc<<~{{|7vHNNSSSSSSSSSRRRRRRRRRRRRQMJCtga3<{@+# ..+$&->/^]]___[[[[^^^^]]]]]]]]]__[[69gntDCJLOQRRRRRRRRRRRRRRRRRRRRRRRRRQQQRRSNNNSQMLGDBBBBGJLMOOMMJGDwunsyCJLMMMMLLLLLECtsng", +"wBDDDDDBByDGGGCtj93^//;*$+........++$&*=;>>//////>>>/(aixELMMMMMMLJECxlca:<~{{|pHNNNSSSSSSSSSRRRRRRRRRRRQOLGysga:~!+. ..+@&=>/^^]_[[[[[[[^^^]]]]]]]]]___[60dntDGJMOQQRRRRRRRRRRRRRRRRRRRRRRRQOOMOORNNNQOMJGDyBBDGJLMMMMJGDwumnsyELMOOMMLLLJECysnnn", +"BDDGGDDByDDCCDtj93^^//;*$+........+@%&*-;>>/////>>>>//3btxCEEEEEECCxtlba::<~~2ozHNNSSSSSSSSSSSRRRRRRRRRRQMJCwna:<)@+# # ..+@&=>/^^^^[6666[[^^^^]]]]]]]]____}0dntCELMOQQRRRRRRRRRRRRRRRRRRRRRRQOMLFFMOOQQOMLECDBBDDGLLMMMLJDwughgsCJMOQOOMLJEGDysnnnh", +"DDGGJGDDDDDDDyja3[^^^/;*%+.......++$&**-;>>>>>>>>;;>>((9jityxxxxxxttiba3(:<<12pIHNNSSSSSSSSSSSSRRRRRRRRQQLGDsna<{!+. ..+$&->/^^^[[6666[[^^^^]]]]]]]]____[0dntCELMOQQQRRRRRRRRRRRRRRRRRRRRQOMJGCCEFMOOMLJGDDBBDGJLLMMLJDysngggtCLOQQQOMLECytsngghm", +"DGJJJJGDDDDyysg9[^^^^/>*%+.......+@%&*==-;>>>>;;---;;>((3aggjiiiiiibaa3((:<<2ozHNNNSSSSSSSSSSSSSRRRRRRRQOLGysb:~)+.# ## ..+%=>/^^^[[6666[[[^^^]]]]]]]]]]___[6dntCELMOQQQRRRRRRRRRRRRRRRRRRRRQMJCytyxCEFFJEGDDBBBDGJLLLLJGDwngdgiyEMOQQQOMJCysngddhhm", +"JJLLLLJGDDywsg9[[^^^^/>=&@+.....++$%&**=---;;--=***==;>((333aaabccba:(((>:<12oINNNSSSSSSSSSSSSSSSRRRRRRQOLCyic1{!+## # .+$*;>^^^^[[666[[[^^^^]]]]]]]]]]___}60ntDGJLOOQQQRRRRRRRRRRRRRRRRRRQOLCysiistDCCCCDyBBBBDGGJLLJJDBshddgixJMQQQQOLEDtngdddhmu", +"MMOOOMLJDDBsgd6[^_]]^/>-&$+.....+@%&***======***&&&&**=;>>((::::::::((((>::1ozINNNSSSSSSSSSSSSSSSRRRRRRQOLCyic2)+.#### ..@&->/^^__}[[[[[[^^^^]]]]]]_]]]_____69gsyCJLMOQQQQRRRRRRRRRRRRRRRRQOMGDwngggiswyyywwwwwBDDGJJJGDyundaaaiCFOQQQQOLEDsndddhrwB", +"OQQQQOMJGysnd6[[__]]^^/;*$++...+@$&**======***&&%$$$%%&*=----=<<<::((((((:blAINNNSSSSSSSSSSSSSSSSSRRRRRQOLGyl1)!'#### ..+%*>/^]]__}}}[[[^^^]]]]]]]]]_]______[0dntDGJLMOQQQQRRRRRRRRRRRRRRRQOLCysndddgnnsssuuuuuBBDGGGGDywnd93abiCFOOQQOOLGDsnghhrwDG", +"QQQQQQMLGysg9[[^__]]]^/>=&@++++@$&*=---===***&%$$@@@@@$%&&***~~=<::((((((:ckAIQNSSSSSSRRSRSSSSSSSSRRRRRQOJCk2|!'##### .+$*;/^^]____}}[[^^^^]]]]]]]___]_____}[9dnsyCGJLMOQQQRRRRRRRRRRRRRRQOMEDsnddddddhgmnrrruuwBDDDGDBwmd93::bixFOOQQOMLEDwsnnswDGL", +"RRRRQQOLGynd6[[^___]]^^>-&%@@@@$&*=;;;;--=**&%$@+++++++@@$%%&{*~=-:((((33alxFORRSSSRRRRRRRSSSSSSSSRRRRRQMJCk|!'#### ..+$&;>^^]________^^^^]]]]____________[[69dgswyCEJLMOOQQRRRRRRRRRRRRRQOLCyuhd00660ddhhmmrruwBBDDDBwrd03::::ixJMOOQOOLJGDBwwBDJLO", +"RRRRRQOLCyn96[[[^___]^^/;*&$$$%&*-;>>>;;;-**&$@++......++@$%%&{~~<::(333aixEMOQRRRRRRRRRRRRSSSSSSSSRRRQOMAk2!'### # .+$&->^^]]_____________]_____________[[69ddgnsyDDGJLMOOQQRRRRRRRRRRRQQLEDsmdd0666600ffhmmruuwBBBBwrh03(:-<=*&%&&*-;>>>>>;;-*&$@+..........+@$)){{~<<:aaagitCJMOQRRRRRQRRRRRRSSSSSSRRRRRQMJxk|!'## .+$*;>^^]]___________________________[[6dggnnsswyyDGGJLOOQRRRRRRRRRRRQOLDBrhd0666[660ffhmmrruuuwwumh03(:-==-*&&&*-;>>>>>>;;=&%@+..... ..++@$)){211cccityCJMOQQRQQQQQQRRRRRRSSSSRRRRRQOFCl2!'## .+$*;/^^]]___________________________[[9gnsssssswwByDDGJMOQQRRRRRRRRRQOLGysmhe066[[[60ffhmmmmrrrmmhf03(>;===;****=;>>>>>>>;=*%@+.... ..+@!!))|2kkkkxDGFMOOQQQQQQQQQQRRRRRRRRRRRRRQOLEt1|!'# .+$*;(/^^________^____________________[9gsyDDDyywwwwwBDDJLMOQQRRRRRRRRQOLDBuhfe06}}}[60fhhhmmmhhhff033((;-===;**&*=;>>>>>>;=*&$+.... .+++!!!!||ooCAEFMMOQQQQQQQQQQQRRRRRRRRRRRRRQOMExl1)@. .+${:((/^^[[}}[^^^^___________________[6gsCEJEGCDywwsuwBDGJLMOQQRRRRRRQOLGDwrhee066}[[60dhhhhfff0063(((>>;===-:cyGLMMOOOOQQQQQQQQRRR", +"RRRRRRQMJCyyyyyttng96[//>-*&&*=-;>>>;-=*&$++... ..++!!!77ppzzFMOOOQQRQQQQQQQQQRRRRRRSRRRRRQOMLCtc1)+. .+!{>;-=~==-:ixGJMMMOOQQQQRQRRRRRR", +"RRRRRRQMLECCCCCDysgd6[//;=*&&&*=;;;;-*&%$@+... ...+@@!!77pzzFIOOOQQQQRQQQQQQQRRRRRRSRRRRRQOOLExi:~)+. ..@)1lllijgdddd066[[^^_________________[0gyEMOOOMLJGDBwsswBDDGGEJLMOQQQOOLJDwumhee866}6600dddd0663((>>;;-=***=-:bixELLMMOOQQRRRRRRRRRR", +"RRRRRRQOLJEGGEGCysg9[[/>;*&%%%&*=--=*&%$@+.... ..+@@!!!77pzFIOOOOQQQQQQQQQQQRRRRRRSSRRRRQQOMJCtb:~$+. .+!2kxCCCyttsnngd96[[^________________}[9sCLOQQQOMLEDywsuswwBBByDCJMMOOOMLGywrmhee066666099d9033((>>;;-==****=;:btCELLMMOOQRRRRRRRRRRR", +"SSSRRQOMLJJEGGCDtn9[[//>=&%$$$%&***&&%$@++.... ..+@@$))||opzFIOOOQQQQQQQOOOQQRRRRRRSRRRRRQOMLExja<&@+. ..+!2oFMMLLECDytsgd3[[[________________[6dtEMOQQQQOLJCywsuuuuunnnntxELMMLLEDywrmhee006666699333(((>;;-==*****=;:3gtCELLLMOOQRRRRRRRRRRR", +"SSSRROMLJGGGCDysn9[[^/>-*%@@+@$$%&&%$$@++.... ....+@%&*~22kAEFMOOOOQQQOOOOOOQQRRRRRSRSRRRQQOMFCtb:~$+.. .+!|oFOOQOOMLJGDtna96[[_______________[[6gtEMOQQQOOLJCywsrnmhhd999ajtCELLJGDywrmmee80666[66333/(>>;-===***==-;>(3iyCJJLLMMQQRRRRRRRRRRR", +"SSRROMJECDDyttjg9[[^//;*%@+++++@@$$$@@+++.... .....+@%*=-:>;-======-;;>>(3asyGJLLLLMQQRRRRRRRRRSS", +"SRQOFEDytsnngg9[[^^^/>=&@++....+++++++++..... .. .....++$&=;>(actCEJLLMMMOMMMLLLMOQRRRRRSRRRRRQOMMFClc<{@+.. .+!7INSSSSSRRROMFxtgd96[}}}______[///////33glxEFLLLJGywsghdd06[[[^^/[9jtCCCDDywurmhff0066[[[///>>;-=====-;>>(//[3gtCEJLLLLOQQRRRRRSRRSSS", +"ROIExljggdd96[[[^^^^>-&$++.......+++++++...... ......+@%*;>((ajtCCEJLLLLLLLJJJLMOQRRRRRRRRRRQOMMFAtc<~$+.. ..+!7zNSSSSSSSSSQOFCtja9066}}}}}_[/////((>>((:bilkxxxytigdd0066[[/^^^^/3ajtyDDDyBwurmhhd006[[////>;;-===-;;>////[6dsDGJLLLLLOQRRRRRRSRSSSS", +"IFClba336[[[[[__]^^>-&$++.........++++@++.............+@%*;(/39jtDCGGEJJJEGGCCELMOQRRRRRRRRRQOMFECxib<{$+.. .+!7pHSSSSSSSSSRROFAxigd9066}}}[[//(>;;;------<<<<1cccaa33333[[[/^^^^^^[9gttyyyyBywwummhd06[[////>;;----;>>//[[[3dnyCJLLLLLMOQRRRRRSRSSSSS", +"Akla3([[[[[^__]]^^>;*$++..........++@!!!@++...........+@%=;//3aitDCCCCCDCDDyyyCJMQRRRRRRRRRQOMJExtjb:=&$+.. ..+@!pINSSSSSSSSRROOFAxtjgdd066}[[/(>;=********~~~~~~~<<::(((///////^^^^^/3ajsyyyDDDyywurnd96[[////>>;;;;;>(/([39dgntCELLLLLMOQQRRRRRRSSSSSR", +"lca((/^^^____]]^^>;*$@+.........++@!)))))!@++.........+@%*;(/3aiyDDDDyyBwwtstyCLOQRRRRRRRRQMLECxtjb::=&@+.... ...+!|oINSSSSSSSRRRQOMMJECysnhd06[[/>;=*&%%%&&&&&****{{**~=-;>>((//////^^^^^[9gstyyDDDDDyBsng93[[////>>>>>>>((33agjstDCELLLLLMMOQRRRRRRSSSSRQO", +"a3(//^^^]]]]]]^^>;*%@+.........+@$){22222{)$@++.......+@%*;>/3gsyDDDywwunnnisyELOQRRRRRRRQMFECxtjba(:=&$@+.........+@!|ozNSSSSSSRRRQQOOOMMLJECyshd93(>-*&%%$%%%&&&&*&*&&&&&**==-;>>>>////^^^^^[9gjtyDDCGGGDywsg96[///////(>>(((39gitxCGELLLLLMMMOQRRRRRRSSSSSOMF", +"3((/^^^]]]]]]^^/;*%@+........+@$&~1<1lcc<<~{%@+........@%*;>(3gsyDDywsnmhhgntxEMQRRRRRRRQOLECxtiba3(:=&$@++.....++@$)2kzIRSSSSRRRRQOOOOQQQOOMLGysh93:-*&%$$$%%&&&********&*****=-;>>>///^^^^^^[3gjtyDCGGEGGDysg9[[///////////[39gtCEJLLMMMMMMMMOQRRRRRSSSSSSQMAx", +"(//^^^^]]]]]^^/>=&$+.......+@$%*=::bbbcb::-~&$@+.......@%*->(3gsyyyBsnhdddgiyELOQRRRRRRRQMJCxtljba3(:-*%$@+++++@@%&~1kAIRSSSSSRRQQOOOQQRRRQQOMLCyia:;~*&%%%%%&&**=====********==-;>>>//^^^]]]^[3antyDCGEEGGDysd9[[[[[[[[///[[69gtCJMOOOQOOOOMOOQRRRRRSSSSSSRIAki", +"//^^^^^]]]]]^/>-*%@+......+@$&~->((33aa3(:-=*%@+.......+$&=;(3gsyywsnhd09djtCJMOQRRRRRRROMExtiija33(>-~&%%$$$$%&*=-:lAIRRSSSRRRQOMMOQQRRRRRRQOMExia:-~*&&&&&&**=--;;;;;---====--;;>>/^^^]]]]]_^[9nsyDGGEEEGDwnd6[[[[[[[[[[[669gsDEMOQQRQQQQOOOQQRRRRSSSSSNNIzkca", +"///^^^^^]]^^^/>-*%@+......+$&=;>(((333((>;-=&%@+.......+$&*->3aitssnhd069diyELOQRRRRRRRQOLExtija93((>;-=*&&&**=-;>(cxFORRRRRRQOOMMMOQQRRRRRRQQMExib:-=**&***==-;;>>>>>>>>>>;;;;>>>//^^]]]]]]]_^[9nsyCGGEEGCysg9[[[[[[6660600dgsyELOQRRRRRQQQQQQRRRRSSSSSPPHzo1b3", +"//////^^^^^^//>-*%@+.....+@%~;>(/////((;-=~*&%@+.......+@%*-:(aninnd06669gtCJMOQRRRRRRRQOLCytjga33(/(>>;;--;;>>//3bxFOQRRRRQQOMFFFMOQRRRRRRRQOFCtc::-=~****=--;>>>>///////////////^^]]]]]]]]]__[9gsyCGGEGCytnd6[[[[60dfdhhdhmsyGLOQRRRRRRRQQQQRRRRRSSSNPKKv7|1::", +"(///////[[[[(/(;=&%@+...+@%*->((/[///(;-**&&%$@+.......+@%*=;:agggd06[[39gtCLMOQRRRRRRQOMEDtiga33(/////>>>>/////3bxEMOQRRQQOMFECEFLOQQRRRRROMFAklc:-=~*****=-;>>>///^^^^^^^^^^^^^^]]]]]]]]]]]]^[9gsyCCGGCDtsd96[[[60dhmrrmmruwDJOQRRRRRRRRQQQQRRRRSSSNPKq54'!{~-", +">((((33aabbbaa3::~&$@+++@$&=:(333[[/(>-*&%%%$$@++......+@%*=;(aagdd3[[[39gtCLMOQQRRRRRQOLCyiga33[////////^^^^^[3btEFOQQQQOMFAxttxCFMOQQOOOIFAolc<<<~~*&&&**=-;>>//^^^]]]]]]]]]]]]]]]]]]]]]]]]]^[3gsyDCCCDtsgd06[660dmuwwwuwwBDGLOQRRRRRRRQQQQRRRRSSNPKqq5,,'+$&~", +":::abblxCCACxtib:<{%$@@@%*=:33aad333(:=&%$$$$$@@++.....+@%*=;:3ada33(/(39jtCJMMOQQRRQQOLGysga93[///^^^^^^^]^^[3btCFMOOOOMFAxijjjtxEFMMMIFAokk211~~~{&%%%%&**-;>/^^^^___]]]]]]_________]]]]]]]]^^[ajtyDyytsgd906600dnuwBBBBwByDJMQRRRRRRRRQQQQQRRRSNNHq5,,##.+@%&", +"//^^______]]]]]__[[[[[^^_]]]]]^^^^[9gjtttsngd99000dhnuBDDDDBBBDGLOQRRRRRRQQQOOQQQRRNHv5,,### ..+$%", +"//^_______]]]]]__[39999[[^_]]^^^^^^[3dgnnggd990090dhnsBDDDDDDBDDJMOQRRRRRQQOOMMOOQOOIv4,### ..+$%", +"clxEMOQRRRRRROJx22{)&*=:agtxCCECCxtja:=~&&&&*****&%$@@@$%&*~=<<:::((((33dgityDGJLLLLLGDsg9[[^^^^^^^]]]]]_^[9gtCEJFFFECxtja9936639aaab<1{{))))))))))%%%%&*=;>//^_________]]]__[9ajjjg93[^^^^^^^^^/[39dd99666609dhnswBDGGGDDDDGJMOQQRRRQOMLLLLMMMMzp4'## ..+$%", +"clxEMQRRRSSRROzo||){{=:agtCEJLLJECxlb::==~~=--;;;-=*&&%&&*~~~<<<:::(((33dgnstyyCGEEGCynd6[[^^^^]]]]]]]__^[3gtxEEEEACxtjga9996663333(::=~~{{{{{{{{{{{{*~=;>(//____}______]]__[6ajttttj9[[^^^^^^^^/[[6366[[[[660dgnsBDDGGGDDDDGLMQQQQQQOMLEGCCCECoo7'## ..+$%", +"ackEMQRRSSSRRIzo2{{{~::gtCELMMMLLECtb::;--;;;>>>>>>;-=~~~~~~~~1<<::((333dggnnswyDDDysnd6[[___]]]]]]]___[[3aitCAACxtljbaa9999996[[[(/(>>;;---<<<::<:-:::((/[[}}}}}}_____]_]__[9nsyyytja3[^^^^^^^^/[[[[[[[[[[60dhnuwBBDGGGDDDCGLMOQQQQOLECyttttll2)!'. ..@$&", +"3alAMQRRRRRRIzo22{{~::btCJLMMMMMLECtb:::>>>>>////^//>>;;--=~~~11<::33339dghggnsswwsng96[____]]]]_____[[[3ajtxxCxklcbaa9dddddd006[[///////((333aa93333333[[}}}}}}}}_____]]__[[djtyyysnd6[^^^^^^^^^[[[[[[[[[[60dhnuuwBDDDDDDDGJLMOQQOMLGDsjgaac1{)++.. ...@%&", +"(3jxFOQRRRROIAk2~~<::btCJMMOOMMMMEClc:(>>>////^^^^^^///>>;-=~~11<::33399dddhhgnnsnng96[[^___]]___^[[[[69agittkkllcbaaaddhhhhhd06[[^^^^^[[[69dddhddd00066666}}}}}}}____]]]__[6dnswwsnh9[[^^^^^^^^[[[[[[[[[[[60dhmuuwBBBDDDDDGJLMOOOMLGyja93(:~{!@+.. ..+@%*", +"/3atEMOQQOOFAk1<<::abtCJMOOOOOMMLExlb:(((////^^^]]]^^^///>:-<111cba3999ddddhhhnnngg96[[________[[[699dgggjiiliccc:aadddhmmnmhd0[[[[[_[}[660dhmmmmhhfee0008888}}}}____]]]]__[6dgnnngd06[__]^^^^^^[[[[[[[[[[60dhmrruuuwwBByyDGJLMMMMLGyja3((-*%$++.. ..+@&=", +"/(3jxJMMMMExlc::((3aiCJMOOOOOOMMFExia:(((///^^^^]]]__^^//((:<<", +"^^[[[999933[/[[[6dsDLOQQRQQQOMLJCtja3((/////^^^]]]_____^^[(((:abnitwyyDCGEJJJJGDysnhdf006600dmsyCGEECylcc:::::300fhmrrrrmhe06}}___}}}60fhmuuwwurmhfee088888}}}____]]]]]]____}}}}}}}____]]]]]^[60dhhdd0000dhrswwurmheee0ddntDGJJECyja3[/>-&$@+... ...+@%*;(/", +"^^^[[[[[[[^^^[[6dnyJMQQRRRQQOMLExlba3((////^^^^]]]]]]__^^[/(33agisyyDGEJLLMMMMLGDwsnhhfffefhmsyCGEECxlcb:::(3300femmrrmmhe06}}_____}}60fhmuuwuurmfee00086}}}}}___]]]]]]]____}}}}}}_____]]]]_^[0dhmmhdd0ddhnwBBwwrmhe0000dntCGJJEDtj93[/>-&$@+..... .....+@&=>//[", +"[^^^^[[[_^^___}0hBGMQQRRRRQQOMLExib33(////^^^^]]]]]]]__^^[/(3aansyDCGJLLMOOOOOMJCywurrmmhhhhnsyDCCCxlca::(33660eemmmrmmhe06}_______}}60fhmuuuurmhf000666}}}}}____]]]]]]]____}}}}}______]]]__[60hmmmmhdddhuwyDyBumhe06660dntCEJEGytg93[//;*&@++........+@$*->/[[[", +"[[[^^^_______}6duDLOQRRRRRQQOMJCtja3(////^^^^]]]_]]]]___^//(3agsyDCGJLLMOOQQQOMLGDBwwwurrmmmnswyyytiba33336660eemmrrrmme06}}________}}0dhmuuuurhd00666}}}}}}____]]]]]]]]___}}}}}_______]___[[6dhmmmmhhhmuwyDDDBumf06}}60dsyGEJECytg93[//>;*%$@+++++++@@%*;(/[[66", +"[[[/^^______}6fmBJOQRRRRRRQOMLGxia3((///^^^^^_____]]]___^^/(3aitDGJJJLLMOOQQQOMLGDDyyBwwuurmniiiicba:33336660eemmrrrrmhf06}_________}}0fhmuuuumhf0066}}}}}}____]]]]]]]]____}}}}____________[}0fhmmmmmmnuwDCGGDBrh06}}[69gtCEJJECytg93[[//>;*&%$@@@@@@$&*;>/[[666", +"(////^___}}}60hwGLQRRRRRRRQOLECtg93(///^^^^^_____]]]]]]]^^/(3atDGJJLLLLMOOQQQOMLGGCDDDDBwunnggaaa::(((3[[660eemruuwuumhf06}_________}}00hhnrrnhd006}}}}}}}_____]]]]]]]_____}}}}__________[[[60fhmmmmmnsyDGJJGDwnd6}}_[69jyCEJJECytja9[[^^/>;=&&%$@@$$&*;>//[6666", +"(((/[[}}}}60fmuDLOQRRRRRRQOLECtg93(///^^^^^______]]]]]]]^^/(3btCJLLLLLLMOOQQQOMJJGGGGGDDBwngaa::::((([[[660efmrwBBBBwrh06[[________}}60dhhnnnhd0066}}}}}}}____]]]]]]]]____}}}}}_______^[[[[600fhmmmmrswDELLLJDwh06}_[[6atxEEJEECytjg9[[^^//>-*&%%$$$%*=>///[6663", +":>((/[[600dhuwDJOQRRRRRRQOMJDtg93(/////^^^]______]]]]]]]^^//3cxGJLLLLLLLMOOOOMLJJGGJJGGDysic:::::((([[[660ehmuwBDDDywnh06[[________}}60dhhnnhhd0666}}}}}}}____]]]]]]]____}}}}}}}____[[[[[6600fhhmmruswDELMMLJCsh0[[^[[3gtCEEEEGCxttga9[[^//>;*&%$$$%&*;>/^/[[333", +";;>([66dhnwyDJLOQRRRRRRRQOLCtn93(//////^^^]_____]]]]]]]]^///3bxGJLLLLLLLMOOOOMJJGGGJJGGDBic<<:::((([[[60efhruBDGGGDysnd6[[[________}[60ddhhhhd0066}}}}}}}_____]]]]]]____}}}}}}}}}_}[[[6999ddhhhmruuwBDELMOOMLGwg0[[^[[9jtCEEEEECCxtjg9[[///;=*%$$$$%&=>//^[[[[((", +";>(/[6dnwDGLMOQQRRRRRRRRQMJDjd3[///////^^^]]____]]]]]]]^^//((bxGJLLLLLLLMMOMMLJGCCGGGGDysic<:::((/[[660fhmuwDDGJJGDysg9[[[_________}}60ddhhhdd0666}}}}}}}____]]]]]]____}}}}}}}}}}}6699ggnnnsssswwwyyDELOOQQOMEyn9[[[[39jtxCCCCCCCxtsg93[(/>-*%$@@@$&*->/^^^[///(", +">///6dnyGLOQQRRRRRRRRRRRQMEyg93(/((/////^^]_____]]]]]]]^^//((cxELLLLLLLMMOOMLJGDDDDDDDytic<::>(//[[60fhmuwBDGJJJJGysg9[[[__________}}00ddhhdd006666}}}}}}____]]]]]____}}}}}}}}}}6609gnstyyDDDCDDDCGEJLOQQQQQOLDsd3[[[3ajtxxCCCCCCxyig93((>-*%$@@@$%&=>/^^^^^^///", +"///[0myJMQRRRRRRRRRRRRRRQLGtg3(/(>>////^^^]_____]]]]]]^^//>>:lxJLMMMMMMMOOOMJGDwssswtttic<::((/[[[6dhmuwBDGJJLLJGDwn9[[[__________}}600dhhhdd00066666}}}}____]]]]____}}}}}}}}}}609dnstDCEJJLLLLLLLLMMOQQRRRQOMGtg93339ajittxxxCCCxtib33(;=*%$@@@@$&=;>/^^^^^^^//", +"^^[6hwJMQRRRRRRRRRRRRRRQQMCta3(((>(////^^]_______]]]]]^^/>>>:lCLMOOMOOOOOOOLGDtingniiiicc::((/[[60dhuwBDGGJJLLJGCynd6[[___________}}60ffhhfdf00006666}}}_____]]]]____}}}}}}}}6600dnsyCELMMOOOOOOOOOOQQRRRRRRQMJyia93399gjjiltxxCxysja::-~&%$@@@@$&*;>/^^^^^^^^^^", +"^^[dsGMQRRRRRRRRRRRRRRRQOLCta3((((///^^^__________]]]]^//>;:bkEMOOOOOOQQQOMJCticaaacciccb:3([[[60hnwyDGJJLLLLJGDysd6[[______]____}}60fdhhhfff00000088}}}_____]]]____}}}}}}}66600dnsyCJMMOQQQRQQQQQQQQRRRRRRRQMJxia999999aaajityyytib:<~{%%@@@@@$&*;>/^^^^^^^^^^^", +"_[6nCMQRRRRRRRRRRRRRRRRQOLCtb93((((//^^____________]]]^/>;;-ckFMOOOQQQQQQOMExl1<:::ccccba336[60dhsyCJJLLLLLLJGDysg9[[____________}}60ffhhhfffe0000086}}______]]______}}}}}6000dhnsyCJMOQQRRRRRRRRRRRRRRRRRRRQMExja933333339ajistiib<<~{%$@@@@@$&*;>/^^^^^^^^^]]]", +"[[gCLQRRRRRRRSSSSRRRRRRQMExtga99333[[[[____}}______]]^^/>;-<1kFMOOOQQQQQOOFAk21<<::acccgad9099hnwDGLMOOOMMLJGDBwnd0[[___________}}60efhhhhffee008086}}_____]]]_______}}}6600dhnstyCJMOQQRRRRRRRRRRRRRRRRRRRQOLCta93333[[3333abjjbb<1{)$@@@@@@$&*->/^^^^^^^^^^]]]", +"[gyLQRRRRRRSSSSSSRRRRRQOLExtjbggggad966[}}}}}}_____]]^^/;-==1kEMMOOOOQQOOMzo211<:::aagggggddhnsyCJMOOQQOOMLJGDwuhd6[[__________}}}00ehhhhhfeee0806}}}}__^^^]]]]______}}600dhnssyDEJMOQQRRRRRRRRRRRRRRRRRRRROMEtb933(///////3333a:<~{!@@+++@@$&*->/^^^^^^//^^^]]]", +"atEORRRSRRSSSSSRRRSRRRQMJCytiiitstsjndd0066}}}______]^//;-==//^^^^/////^^]]]", +"jCMQRRSRRSSSSRRRRSRRRQOLExttittyyDDytsnhdd006}_____]]^//>-==////^^^^^[[[60dgnstyCELMOQQRRRRRSRSRRRRRRQQQQQOOMFCtba3((((>>(//////(:={)@++..++@$%*->>/^^^//>>>//^^]]]", +"xJORRRSRSSSRRRRRRRRRQOMExttistyDCCCCCyyssnhd06}____]^^//>;-<>>;;>>///^^^[[[9dgnstyDCELMOQRRRSSSSSSSRRRRRRQQOMMLJCxlba::::::;>>(////(>-*%@++..++@$%*->>//^///>>>>>/^]]]^", +"CMQRRSRRRRRRRRRRRRRQOMExtjnnistyDCGGGCDyywshd6[___^^^///>;-<>>;;-;;;>///^^[[[9gnsyDCCGJLMOQRRSSSSSSSSSSRRRRQQOMLGCylccc:<<<<<-;;>/////>;~&$++...+@@%*->>//^//>>;--;>/^^]__", +"EMQRRRRRRRRRRRRRRRQOLEDsnggdgnswyDGGGGGGCDysg06[^^^^^///(>:::cityyDDyytic1<=-;>(/36660dhnsyDGLMOQQRRRRRQQOLGywsnggd9966666}}}}}}8800066[[[////>>>;;----;;>(///^^[[9gstDCGGJLMOQRRSSSSSSSSSSSSRRRRQOMLGDtic<1111111<-->>/////>-*%@++..+@@%*->>/^^//>>-===;>/^]]_[", +"JMQRRRRRRRRRRRRRRQOMJDtndd0ddhnuwyDCGGGGGCDynd6[^^^^/////(((abittyyyttic<<~=-;>(/[[6600dhnwyGJLMOQRRRRRQOMEDwnnggdd99666666}}}}}}}}}}[[////(>>;;;-----;>>/////[[[6dntyCGJLLMOQRSSSSSSSSSSSSSSRRRRQOMJCyic<1222|221<<:>//////>-*%@++++@$%*->>/^^^//>-***=;>^]]__[", +"JMQRRRRRRRRRRRRRQQOLGyshd0000ddmmuwyDGGGJECysg9[[^^^/////((3agistwwssic<<~~=->(//[[}}660dhswDGJLOQQRRRQQMLCtngdddd999666666}}}_____[[///>>>>;;;-----;>>/////^/[[[6dnsyCEJLMOQRSSSSSSSSSSSSSSSRRRRQOMJDtic122|oook1<:(///////>-*&$@@@@$%*=>>/^^^//>;=***=;/^]]_^[", +"JMOQRRRRRRRRRRRQQOMJCwnd0000000fhmrwBDGGJJGDtnd6[[[[[[[[[339agissssincc<~~~=;>(/[[}}}}660dgswyGJMOQRRQQOLCtnd9909999966666[}_____^^//(>>;;;;;;----;;>///^^^^^^[[[0dgsyDGLMOQRSSSNNNSSSSSSSSSSRRRRQOMJDti112|ooooklb((/^^^^//>;-*&%$$%&*->>/^^^^//>-****=>/^]]_[[", +"ELOQQQRRRRRRRRRQQOLEDtnh00000000fhmuwBDGJJGDynd9[[[[[[66639agiisssinga:<~**=;>//[}}}}}}660dnstDGLMQQQQOLCtg96[[[66366[[[[[[___]^^//>>;------;;;;;>>>//^^^^^^^^[[[60hntyCLMORSSNNNNNSSSSSSSSSRRRRRQOLExli1122kokklca3/^^^^^^//>;-=*&&*=->//^^^^//>;-***=;>/]]__[[", +"ELMOOQQQQQQQRRQQQOLECtsgdd000000ffhmuwDGGJGDysg99660999ddagjisttsinga:<~{{*-;(/[[}}}}}}}60dhnsyCJMOOOOLCtg9[[[[[[[[[[[[[[[^_^^^^/>;;-=***=-;;>>>>///^^^]]]__^_}}}60dgsyGLOQSSNNNNNNSSSSSSSSRRRRRRQOLCxlcc<1lllllba3[^^^_^^^^///>;;---;>//^^^^^//>;-==-;>/^]]__[6", +"CELLMMMMOOQQQRQQQOLECysngddddddddfhmuwDDGGGDysngdgggnnnnniistyytsngaa:~{&{~->//}}}}}}}}}00dhnwyCELMMMFAtb3((////[[[[[[[[/^^^///>;-=******=;;>>///^^^^]]]_____}}}}60dgsyEMOSNNNNNNNSSSSSSSRRRRRRRQOLExlibbbbbccbb93[[^___]^^^^^////>>>//^^^^[[[//>;;;;>>/^]]___[6", +"DGJJJJJLLOOQQQQQQOLJGDtsnngnnnnnnnmuuwyDGGGDyssnnsswttttttyxCCCxtiga:<{%%&~;(/[}}}}}}}}60fhnswyCELLMFAxl::>>>>>(((((((/////>>>;-=*&&&&**=;>///^^^^^]]_____}[[}}6600hsyCLOQSNNNNNNSSSSSSSRRRRRRQOMLECticbaaaaaa933[[[^____]]^^^^^^^///^^^[[[[[[/(>>>>>//^]]]___}6", +"yDDGGGGJLMOQQQQQOMLJGCytsssstyyywwwwwyDDGGCDyywwyyDDCDCDDCCEEEECxtcb<{)%%&~;(/}}}}}}}}800fmuBDCEJLLLFAk1<--------;:::::::;;;-==**&&&&**->>//^^^^]]]___^[[[6600000dhnyCLMORSNNNNNSSSSSRRRRRRRQOOLJGxxtijgaa99933[[[[[____________]]^^^^[[60dd063(((>//^^]]]____}6", +"wByDDDDGJLOOQQQOOMLJGCytstyDGGGGCDyyyyDDGGCDDyyDDGEEEEGGGGELLMLJCxic~))$%&=>/[}}}}}88880ehuBDGJLMMMMFAk11=========<<<<--======******=-;>//^^_________[[[09dhhhhhhnsyGLMORSSSSNSSSSSRRRRQQQOOMLECDxytttsigga993[[[[[_________________[[0dgusnnd3((///^^]]]_____}6", +"uwwBBBDDGLMOOOOMLLJEGCyttyCELLLLJEGDDDDDCCDDDDDCGJLLLJEGGEJLMMMMJCk1{)!$%{->/[}}}8888880fmwDGLLMOOOOMAok1<======<<<<<<111<<=------;;>(//^^__________[[9answtwwwwwyDGLMOQRRSSSSSSSRRQQQOOMLLECDytttyxDDxytijgd93[[[[[_______________[60hsByDysnd3(//^^]]_______}6", +"muwwBBDDGJLLMLLLJEGCDyttyCELMOOMLLJGCDDDCDDDDDGGJLLLLJEGGGJMMOOOLAk2|!!!%*;(/[}}6688880efuyGLMOQQQQOOFAkc<<::::::>>((////^__}}_______[[[9ntDCGEEEGGGJLLOOQQRRRRSRRRRQOMMLJGCDytsiiisyDGEEGCCytjga996[[[[___[[[[[[}}_}}6dmwDGJGCysg33/^^]_________}}", +"mruuwBBDDGJJJGGCCDDyysssyCJMOOOOMLJGCDDCDGGGGGGJLLLLLJGCCCELMOOOMFo|!!!!)~;([[}}68888800hsDJMOQQRRRROOFCtca3333aacitkxCCxkiba33[[[[[}}}}}}}______[[6ajxGLLMOOOMMMOOOQQQQQQRRQQQOMMFECxtsnnggagjiyCELLMLLECytsngd99[[[[[[[[66666}}}6dmwDJLLLECtg93[^^__________}}", +"hmruuwBBDDDDDDBBwwwssnnstCLMOOOOMLEGCDDCGGGGGGJJLLLLJGDyyDCLMOQOOFA77!!!&=>([[}688866660hwCLOQQRRRRRROMJCwngdddgitxCEFFFECxig966[[}}}}}}}}}}____[[3ajxEMOQQQQQQQQQQQQQQQQQQQOMMLECxtiga993399gixGFMOOOOMLJGCytjng9966[6660dddd0000fhuDJLMMLJCtg93[^^___________}", +"fhrruuwBBBBBwwuuumnnhhhnwCJMOOMMLEGCDDDCGGGGGJJJLLLJGDywttCEMOOOOIzp7!!){<((66600086}}60hyGLOQRRRRRRRROMJDysnnnswyGJLMMMLECtnd0066}}}}}}}}}}}__[[3aixEMOQRRRRRRRRRRRRQQQQOOMLLGCytjg93[[[[[3aixEMOQQQQOOMLJECytsjgd9999ddgnnnmhdfdhuyGLOOOMJDla3[^^____________}", +"fhmrruwwBBBwuummhhhhddhnsyGLLLLJECyyyyDDGGGGGJJJJJJGDyssnsyEMOOOOIzp77!)~:(360000006}66dnyJMQQRRRRRRRRQOLGDBwsswyDGLLMMLLGDsgd06666}}}}}}}}}}}}66ajtAFOQRRRRRRRRRRRRRQQQOOMLJCytjg93[[[//[3aiCFOQRRRRQQOOMLJECytsjggdggnswByBwummmuBGLMOOOLExia3[^^_____________", +"fdhmruwByyBBurmhfff000ddnsyCGGCxytssswyDGGGGGGGJJJJDywnggntCFOOOOIIpp7|21:addhhhhf00660hwCLOQQRRRRRRRRQOLJDBwwuwBDCJLLLJGDwnd006666}}}}}}}}}}}60dgtxEMORSSSRRRRRRRRRRQQQOMLJGysnd9[[////((alCMORRRRRRRQQOMMLJECysjnggnswyDCGDDBwwwBDJMOQQOLGtg33^^_________]]___", +"0fhruByDGGDDwumhd0006600dgnstssnnggnswyDGGGGGGGGGGDDwngddgtCJMOOOIIvpp721innssuurmhd00hsDJOQQRRRRRRRRRQOLJDBwuuuuwyDGEEGDwnh00066888}}}}}}}}6600gjxCFINNSSSSRRRRRRRRRQQOOMLGDynd93(/(>>::blAIRSSSSRRRRQOOMMFJECytsnnnstDCEJJJJGDDDGJMOQQQOLCta3[^^______]]]]]^^^", +"fhmuyDGJLLJGDwnhd066[[[[6699999999dgnsyDGGGDDDDDDDywuhd99aixEMOOIIIzppookyyDDDDDyysnnnsyEMQQRRRRRRRRRRQOLGDwurmmmuwyDDDDysnd000066888888888800dhntxEFINNNSSSSRRRRRRRQQQOOMLGDsgd3((:--=<>;>>(", +"yCJMQQRRQQOLGysh06[[^^^^_______[[60dnswyBBwurmmhhd006[[^/(3btCAzzzzAAzFMOORRRRRRRQOMMMMOQRRRRRRRRRRRQOMJDBumhfffdhsyCGGGCDtsnhd006686000effhmuwyDCJLMOOOOOMLLLLLMMOOOOMMLJCyib::<~{{||pzHNNSSSSSSSRRROMFAzAFEECxtsnswyCJLLMMMMMMMOQQRRRRRQOEtb3(//^^^^^//>;==-:(", +"GLOQRRRRRQOLGysh06[^^^^^_^[[[[[[600hnuuwwwumhff0066}___^//(aikooooooAEFOQRRRRRRRRRQQOOQQQRRRRRRRRRQQQOMJDBumhffdhnyCEJJJGCysndd066[[[6660fhmuwyCGJLMMOOOMFJGCCCGJJLLLLLLECxiba:<~~{||pzHNSSSSSSSSSRRQOFAAAAAEECCtssstyGEJLLLMMMMMOQQRRRRRRQMCia3(//////>;=*&*=::", +"MOQRRRRRRQMJDwnd0[[^^^^^[[3999990dhhmuuuurmhf006}}____]^//(:<1lkookkAFFORRRRSRRRRRRQQQQQRRRRRRRQRRQQQOLGDwumhdffmsyGJLLJECysgd333(//((336ddmsyCGJLMMMOMMFECxywwyyDCGGGGCxtja::<<~22ozINNSSSSSSSSSRRRQMFAooAFFFECytssyDCGJJJJLLLLLOQQRRRRRRQOFxc::((>>>;-*&%%%~>:<11222kkxEMORRRSRSSRRRRRQQQRRRRRRQQQQQQQQOLJDwumhddhnsDGJJEECxlca::::;;;;::((3aiwDELLMMOMMLLEDywsnnnstwyyyttjaa3::<<12ozIONSSSSSSSSSSSRROFAoooAFFFJExtttyDDGGGGGGGGJLMOQRRRRRRRQMAk1<::>;;=&%$@@${1k", +"QRRRRRRQOMGysg96[[[//[3btxCEECDywwuurrmmhee0}}_____]]]]^/>;--<1111llxAMORRRSSSSRRRRRRRRRRRRRQQQQQQQQQOLJDwumhfddgsyDCCDxlcc<<==~******~=<:ciDELMOOOOMMLJCywsnhdddgggggga33(:--<11kAINSSSSSSSSSSSRRRQOEoooozFMMMJCyttyyDDDDDDDDDGJLOQRRRRRRRROFAk1<:--~&%$@@@${2o", +"OQQRRRQOLCtng96[[[//(3bxELMMMLJGDywuummhe00}}____]]]]]]^/>;--=<111clkAFOQRRSRSSRRRRRRRRRRRRRQQQQQQQQOOLGDwnhdddddgistiicb<<~~*&&&%%%%&{~<;--=<1kAIORSSSSSSSSSSSRRRQMAooopzIOOMLECyyyyyyBBwwwwBBDJMQRRRRRRRRROFok1<==*&$@++@!{2o", +"MOOOOOFExig96[[[///(3btFMQQQQOMLGDBwurhee0}}_____]]]]]^//>;;--<<<;--==<1kAIORSSSSSSSSSRRSRRROFoo7pzIIOOOMJCyytyBBwwuuruuwBGLORRRRRRRRROMAk1<~*&%@@++@!{2k", +"JEEEACklba3(//^^///(3lEMQRRRRQOLJDBwrmhe0}}_____]]]]]]^//>;;::<<::bclxEMQRRRRRRRRRRQQQQQRRQQQQOOOOOOMLGysgd063[((3333((>>;---==****==-;:clCLOQQQQQOMLJCysnhd633((/(((>>;-===<1kAIORRSSSSSSSSSRRSSRROzp77pvINRQOMLEyttssuurmmmmrrwDJOQRRRRRRRROLCk11{&%$@+++@${1l", +"tttlicb::((////////(axFQRRRRRQOLJDBurme06}_____]]]]]]^^/>>::::::::bbjtAFOQRRRRRRRRQQQQQQQQQQOOMMMMLLJCysh96[[//(((((/////>>>>>>>>>>>((3alCLOQQQQQOMLJCysnhd66[///(((>;-=~~~11kAIORRRSSSSSSRSSRSSSSRIzpppvHNNRQQMLCyssnnnmhheeehmrBGMQRRRRRRRQMJCk1{)!@+++.++${1c", +"icga::::>>(////////(axMQRRRRRQOLGDwumhe0}}_____]]]]]]^//>:::bbbb:::bblxEMOQRRRRRQQQOOQQQQQOOMLLJGGCCxtia93[///(((///////////^^^^^^^^/[9iCLOQQQQQOMLEDBsmd06[[///((((:-=~~~1koFOQRRRSSSSSSSSSSSSSSSSIzppvHHNRRQOMFCtjgdddffeeeeeehuDLOQRRRRRQOLGk22)@++....++$)~<", +"caa:((>>>(//^^^^^^/[gxMQRRRRRQOLGBwrmee6}_____]]]]]]^^/>::ccllccb:::bclCFOQQRRRQQQOOOOOOOOMLJGCyttsijga3[/////((///^^^^^^^^^__]]]__^[9nyJMOQQQQOMLGDwnh006[[[//((((::<1122oAIORRSSSSSSSSSSSSSSSSSSSNHvvvHNSRRQOMExjg990000088880fmyJOQRRRRQOLCy12)@+.......+$)~<", +"ica3((((//^^^^^^^^^[gyMQRRRRRQMJDBurme86}______]]]]]^/(>:clkkklc<<:::bixEMOQQRQQQOMMMMMMMLJGDtiggdd9933//////>>///^^_______________[6gtGLOQQQOOLJCysg006[[[[[/((3abc112oozIIRSSSSSSSSSSSSSSSSSSSSSNNHHHHNNSRRQOLCtg96[[[}}}}}}660hBGMOQQQOMJDtc1)@+.......++${11", +"tiga3(///^^^]]]]__[6gyLOQRRRQOLJDwumhe06}______]]]]]^/>::1kzIIIzo22{{~=<:clALOOOOMLGxtttsssng96[[[[_^^_^^^^^^^///^^_________________[9jyELMMLJGysd0[[____^^^[[33blxAFIQNSSSSSSSSSSSSSSSSSSSSSSSSSSSSQNNNNSSSRRQOFxj9[[^^^^^_______}0hsyCCDtna::;-=*&$@@++@@$){2oFM", +"MExta93[[[[[[[___}}6fnyGLMOMLJDBwurmee06}}______]]^//:<2ozIIIzoo|)){~<:bjxEMMMMLEytjngggd90[[[___________]^^^^^^^_____________]__[6gtCELLLEDwnd6[_____^^^[[33blxFMORSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRONNNSSSSRRQMEta3[^^^^^^^^]]]___[0gsssiga::;;;;-=*&%$$$%&~2oFIO", +"MFCtb93[[[[[[[}}}}}6fhuDJJLJGDBBurmmhe06}}______]^^/>:1ozIIHHIp7|)){~-::blxEFLECxtja999066[[[_____________]^^^^^]___________]]]__[9jyCEJJGDwnd6[^^^^^^^^^[33ajxAMORSSSSSSSSSSSSSSSSSSSSSSSSSSSSRROOOQSSSSRRRQMCl9[^^^//////^^^]]_[[9daaa::;;;>>>>>;-**&&&~1kAIOQ", +"MECla3[[[[[[[[[}}}}60hrBDGGGDBwurrmhe006}}}}____^^/>:<2oIHNNHHv77!){~-((3aixCCCtjg99666[[[}}}}}}__________]^^^^]]__________]]]]_[3gtCEEEGCynd0[^^^^^^^^^[339blCFORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSROOOORRSSRRRQOFxj3[^^//>>>>>//^^^^^/[3(::---;>>/////>;=**~=1kFOOQ", +"FEtja3[[[[[[6666}}600fmuBDDBBwurrmhee0066}}}}___^//>:1kzINNNNHv47!){=;(((3ajlttja96[[[[[}}}}}}}6}[}_______^^^^^^]_________]]]]__[9jxEJJJCDsg96[/////////[33ajxEORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQOOMOQRRRRRRQMEta[[^^/>;;--;>>//////>;;-==~=;>/^^^^//>-=*~~1oFOOO", +"Axja3[[[[[66666666600emruwwuurrmmeee0066666}}__^^/(>:lAINNNNNHvv7!{~->//^[39aga99[[[}_[_[_}[6660666[[____^^^^^^^]]]_______]]]__[9jyEJLJECyia3(((>>>>(//((3abtAMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRQOOOOQRRRRRQMJxj9[^^//>;=**=-;>>>>>;-=*****-;>/^]]]^/>-***~2AFIOO", +"tja3[[[[[399900666000ehmruurrmmheee006666666}}_^^//(bkFNNSNNNPHv7){=>//^^[[[366[[[[_____[[[660ddd906[[[^^^^^^^^^^]]_______]]__[3gtEJLLLExtja::-====-;>((3ablCFORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRQOOOOQQRRQQOLxj9[[_^^/>-=***=-;>>;-**&&&**=;>/^]]]]^/>-*&{{2ozFFF", +"ba3[/^[[[9dddd000000eehmrrrrmmheee0066666666}}_^^//3cCMRSSSNNPHv7){->/^^^^[[[[[[[_______[[69ddnnngd0[[[[//////^^^^]___________[atCFLMLJCxic<<~{{&{{~=<::bckAFORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRQQOOOOQQQOMLCsa6[__^^/>;=***-;;;;-**&&&&*=->/^]]]]]^/>=*&&{|oAAAA", +":(////[[9dgggdd0000eeemrrurrmmeee8088666686}}___^/(alFORSSSNNPHv7)~;(/^^____[__________[[[69gnsssng96[[////////^^^^^^^^______[9jxEFLLJCxlc11{)!!!!)){~11koAIORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRQQOOOOOOOMJCtg9[[___]^/>;---;;;;-=*&&&&**-;>/^]]]]]^/>=&%%)||ookk", +";;>>///39dggghd0000eehruuuuurheee0006666866}}___^/3bxFORSSSSNPKv7|~:(/^^______________[[[39gjsttssga3[(/////////^^^^^[[[____[[alxEEFECkl12{)!!!+'+!!!||ozIINSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQQQOMMLLLEDsg9[____]]]^//>>>>>>;-**&&&**-;>/^]]]]]]^/;*&%$))||221", +"*~=;>(/3dhhhhdf000eeemuwBBBwrmfee8000666066}}__^^[9lAORSSSSSNPKv72<((/[[____________[[[[39ajjstttsga33(((>>>(////^^^[[[[[___[[ajtxCxxkl22{)!!++''''''4pvHPPNNSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRQQQOLLEGCyjg6[____]]_]^^/////(>;-*&&&**-;>/^]]]]]]]^>-*%$$@!)){{{", +"$%&~;>(6dhhhdfe000eemrwBDDDBumhffee80800006}}__^[3bxFORSSSSSNPHvo2<33[[[[[_^_______^[[[399gjtttttiga33((>>>>>(////^[333[[[__[[9ajiiic11{{)!!!+''''',45qKKPPPNSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRQOMLGDysn96[[___]]]__^^[[3993(:=*&&**-;>//^]]]]]]^/>=&$@@@@$))$$", +"@@%&=>(0fffffe0088eemuBDGGDywuhhfeeee800806}}_[[3alAORRSSSSSNNHzolba36[[[[[^^^___^^[[[339aajjtttija93((>:>>>>>(///[33993[[^^^[[33a3:<~{{%)$!@+++'',5qqKKKPPPNSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRRQOLEDwnd9[[___]]]____[[9gistib:=*&&*=;>>/^]]]__]]^/-&$@+++@@@@@@", +"+@$&=(30fffee8008eemrBDGJJGDwrhffeeeee80806}}[[39jxFORSSSSSSSNHzolca9996[[[^^^^^^^^[[3333aabjjijjba3(::::;;>>>>(/(3aaaa3[[^^^^//(((;-~{&%%$$@++'',5qqKKKKPPPSSSSSSSSSSSSSSSSSSSSSRRRRQQQRRRRRRRRQOLGynd9[[___]]]____[9gsxGEEClc<~**=-;>/^^]]___]^/>*%@++++++++++", +"+@$&;(600eee80888eemuBGJJJGDwnhdfeeee88008}}}[[3bxFORSSSSSSSSNIFAkiggd996[[^^//^^^^^//(3333aaaabaa:::---;;::>>>>((abjjja3[^^^^^//>>-=*&&&%%$@++',5qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQQQQRRRRRRRRQOJCsg9[[[___]_____69nyELMMLJxl1~~=-;>//^^]___]]^>=&@++.....++..", +"+@%~:(6608e88888eehrwDGJJJCyshdf0000008086}}}[3alAORRSSSSSSSSROFAxljgg996[[///////^////(((33333:::<=~~~==-;;;;:::aclxtlb93//////(>;-=**&&%%$@@',5qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOQRRRRRRRRQMJDsd9[[^_______}6dsDJMOOOOLCk11=-;>//^^]____]^/;&$++..........", +"@$&;([668888888eeemuBDGJJGDwnd00000000686}}}[[3jxFQRSSSSRSRRRROFAxtjgd96[[[//>>>//////((((((((:;=~{&&{{~~<<<<-::>;-=**&&%%$!!45qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOQQRRRRRRRRQMEysg9[[[______[6dsDJMOQQQOLGlc<-;>(/^^^_____]^>=%@+...........", +"$&=>/[68888888eeehmuBDGJGDysh0066}}}}}}}}}}}[6atEORSSSSSSRRRRROLCyigd96[[[//>---;>>>>>>;;;;;;;-~&%$$$$){~11<<<11koAFFFAxia3(((((>>;-=~*&&%)!!45qKKKKPPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOOQRRRRRRRRRQMJDwnd0[[[[_[[60gwCJMOQQQOMJxib::>(//^^______^/;&$+............", +"&*;/[}6888888eeeehruBDGGDysh066}}}}}}}}}}__[[3jCMQRRSSSRRRRRRROFCtja96[[[^/>-*&**-;;;;-======*&%$@@++@!)|222222oAIIOOOFAtib:((((((>;-=~{{))74vKKKKKPPPPSSSSSSSSSSSSSSSSSSSSSRRRRQOMMOQRRRRRRRRRRQMLGywnh906660dgsyGLMOOQQOMLCtga(((///^^_____^^>=%@+..........++", +"=;(/}}88888eeeeehmrwBDDDysnd06}}}}}}}}}}___[[atFORRSRSRRRRRRROMExia96[[[^^/>*&%%&&*===**&&&&&%%@@+++++!77ooooopzHNNRROOFClcb:33((((>;=~{{|7vvKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRQMLLMOQRRRRRRRRRRQOMLECywsnggnswDGLMOOQQOOMLGynd3((///[^______^/;&$+.........+++@", +";(/[}68888eeeeeemmuwyDDysnd06}}}____}}_____[3jCMQRRRSRRRRRRRQOJCtg93[[[__^/-&%$$$%&&&&&%%$$$$$@+++..+''7pppppzHHNNSSRROFAklca333[//(:-~2|pvHKKKKPPPPPSSSSSSSSSSSSSSSSSSSSRRRRQQMLLLOQRRRRRRRRRRRQQOMLLJGCDyyDGJLMOOQQQOOMLGynd6[/////[[_}___^/>*%@+....++++++@@$", +"(/[[60888eeeeehhmruwyyBsnh06[}_____}}}}___[[9tEORRRRRRRRRRQQOLExia3[[[__^^>=&$@@@$%%%%$@@@@@@+++....''4vvzzzvHHNNSSSSROMExlcaa36[[((:<2|pvKKKPPPPPPPSSSSSSSSSSSSSSSSSSSSSRRRRQOLJJLOQRRRRSSRRRRRRQQQQOOMLLLLLMOQQQQQQOOLJCBnd6[//////[}}____^/-&@+...++@@@@$$$%&", +"/[660eeeeeehhmmmmruwwwsnh066}_____}}}}}}__[3gxMQRRRRRRRRQQQOMJDib3[[[[^_^/>*%$@@@@$$$$@+++++++......'44vvIIHHHPNSSSSSRQMFxlca96[[[((:1opvKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRRQOLJJJMORRRRRSSRRRRRRRRRQQQQQQQQQQQRRRQQQOLJDwnd6[^^//////[}___^/>*%@+.+++!))%%%&&*=", +"30dhhhfeefhmmmmmmussssnhd06}}____}}}66}}}[[9tEMQRRRRRRRQOOMMJCtja3[[^^_^^/>*%$@@@@@$@@++...........''4vvIIIHHNNNSSSSSROMAxia93[[[[(3ckpHKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLJGJMQRRRRRSSRRRRRRRRRRRRRRRRRRRRRRRQQOLJDwnd0[[^//>>>///___^^>=&@+++''!||{~***~=;", +"gnsssurmmmmmrrrmnnnsnngd06}}____}}}60006669jxLQRRRRRRRQOOMLJGDsb3(/^^^_^^/;*&$@@@@@@+++...........+'7pzIIIIIHNNSSSSSRROFCtca3[[[[[3bkzHPKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSSRRRRRQMLGGJLORRRSSSRRRRRRRRRRRRRRRRRRRRRRRRQQMJDBuh0}_^^/>;;;;(//^^^/;*$@++''47po21~~~=-:", +"wyCCDDywuuuruurnnnnghd066}}}___}}}60df0069gtEOQRRRRRRQOMLLJJCxia3(/^^^^^^/>~&$@@@@+++............+'77pzIIIIIHNNSSSSRRQMExia3[[[[[[alAIHPPPPPPPPSSSSSSSSSSSSSSSSSSSSSSSSRRRRQOMJGCGLMQRRSSSSSSRRRRRRRRRRRRRRRRRRRRQQOLGBuhf6}_^^>;****->>//>;*%@@+''4vpzok1<==-::", +"CJLLLJDywuuuurnhhddd0066}}____}}}600dddd0djCMQRRRRRRQQMLLLJECyia3(/^^^^^//>=&$@@++++.... ....''77ozFFFFIIINSSSSRRQOLClg9[[^^^[3bxFNPPPPPPPSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLJCDDEMORRSSSSSRRRRRRRRRRRRRRRRRRRRQQOLGDwrh0}}_^/;*&%$%&**==*&%@@++'4vvIIAkl<<<<::", +"JLMMMLGDwsunnhhdd0066[}}______}}}600dddddnyJOQRRRRRRQOMLLJJGCtib((//^^^[[(:=&$@@+++.... ###''77zzFMMFFIINNSSSSRRQMEyja3[^^_^[9lFINNNPPNSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQOLGDyyxGFORSSSSSSSRRRSRRRRRRRRRRRRRQQOMJDBumf0}_^/>=&$@++@@$%%$@@@+@@7pzIIIAkl1<<:::", +"JLMMLLGysnnhdd00666[}}________}}}}6000ddntEMQRRRRRRQOMLLJJJGCtc<:>(///[33a:<{$@+++.... ###'44pzFMMMMMFIIRSSSSRRROLCtg33/^^_^[axMRSSSNSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQOLGysiitCFIRSSSSSRRRRSSSRSSSRRRRRRQQOLJGDwume0}[//;*%@+....+++++++@@)|ozIIFAkc<<-:::", +"CELLJGDtngd00666}}______________}}}6600hsCLORRRRRRRQMLLJJJGCxic<-;>//33bjll2|)!++.... ##,,5vvIIIOOMMMMOORSSSRRRQOLCtb33[[^^[3jAORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLCyigbclkAFIQSSSRSRSSSSSSSSRRRRRQOMLJGDBwumf0}[/>-&@+...........+@${2oAFFAkcb:::>(3", +"txCCCysnd9666[}}__________________}}}60gtEMQRRRRRRQOMLJEEGCDtic<=->/(3btCAAAo7!''.# ##,,55vHHNOOOOOOMOORRSSSSRRQOLCtja33[[[3axMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLCwna:<122opzIIQRRSSSSSSSSSRRRQQMLGDDDBBBurhf6[(>=%@+... ....+@%~>(/(", +"gjsssjnd9666}}}}___________________}}6dsCMQRRRRRRQOMLJGGGCDysc<<=->(3atAMMOIzp7'''#######,55qKPNNRRQOOOOOOORRSSSRRRQOMExlcba339jtEORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRQOJDsb::=~{{)||opzIORSSSSSSSRRRQOLGDyyBBBBBwumd63(:~%@+... ....@%=:bbbba:(>>>////", +"9ggnnngdd9666}}}}__________________}}6dtJOQRRRRRQQOLJGGCDDyysg:<-;>(3jCLOQQOIIp44'#####,,5qqKPNNSRRQQOOOOOQRRRRRRRRQOLExkklcbjtxEMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRQMJyia::=*&%))))||ozIQSSSSSSRRQMJCtsuuwBBBBBund03(:=&$+... ...+%=:(((((>>>>//^^^", +"9dhgnnnnngd00066}}}}__}}}}}}}}}_}}}}60nCLQRRRRRQQOLJGGCDDDywsg::;:((atEMQQRROIzp74'',,,5qqKKPPSSSRRQQOMMOQQRRRRRRRQOMFAoookkkxCFMQRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQOJCsb:(;=*&%%$$)){2koFIRSSSRRQMFxsnhhnuwBBBBsnhd93:-~%$+... ...+$*;>>>>;;>>//^^^^", +"0dhnswyyyysnhff0066}}}66006}}}}}}}}}0dwEMQRRRRQQOMLGGDDDDDyytna::>(3atJOQRRQQOMzpp7445qqKKKPNSSSSRRQOMMMOQQRRRRRRRQOLEAoo7oooAFMOQRRSSSSSSSSSSNNNNNNSSSSSSSSSSSSSSNNNNNNNOMJxib3((>-=*&%%%%{~~1loFIRRRRQOMExjgddhhuwwBwsngdda3:<~%$+.. ...+@&=;;;--;;>/^^__[", +"hhnsBDGJJGGDwumhee00fffffee00686}660dnyLOQRRRQQOMJGDDDyyyDDyyib:(((3bxJMQQQQQOMFFAzpvvKKPPNSSSSSSRRQOMMMOQQRRRRRQQMLGxko777ooEMOQRRSSSNNPPPPPKKKKKKPPNNNNNHHIIIIHHHPKKKHIAxlba3(((>;-=~***~=-::ixFIQRRRRQMLCtjgddhgnsssssngggga:<~%@+.. ..+@%&*====-;>^^]_[[", +"gnuwDGLMMMLJDBurmhhmmuuuurmhfe000000hsCLOQQQQQOLJGDByBByBDDCDtia:((3bxEMOQQQOOMMLLLMINNNSSSSSSSSSRRQOMMMOQQRRRRQQMJCyl2|!!77oALOQRRNNPKKKKKqqqqqqqqvvvppppo||||||77444447|1<(((/(>>>>;;;;::::actAMQRSSRRRQOMEyjgddddnnssssssssig:<)@+. ...+@%&&&&*=;/^^_[[[", +"gnswDJMOOOOLJDBwuuuwBDDDDBwumhff00fhnyELOQQQOMLJDBwwuuuwBDCGGDlc:((3btEMOOOOOOOOOOOORRSSSSSSSSSSSRRQOMMMOQQRRRRQOLCyic1)!!!)|oFOOQNKqqqqqq5555,,,,,'!!)))))){{{{))!!'''+@){=;>>>>>>((((3333dgsyEMQRSSSSSRRRQMExjgd9ddgnnsstyyytic1)@.. ....+@$$%%%&=>/^^^[[9", +"hhnsDJMOQQOMLJDDBBDDGJJJJGDBumhhfdhnsDJMOOOOMLGDBwurrrruwDGEECkc::(3btEMMOOOMMOOOQQQRRRSSSSSSSSSRRRRQOMMOQQRRRQQMJysa:~)@@@!|kEOOHqq555,,,,,######.++@$%%%%%%%%&%%$@+++++@%*=;>>>>((3abgggnnyCJOQRSSSSSSSSRRQMEtja999dgnswyDCDxsc2!+. ....++@$$$%&*;/^^^[69", +"ddgsDJMQQQQOMJGDDDGJLMMMMJGDBsmhhhhnwCJMOOOMLGDBurmmhhmmuyGJJGkc<:::bxELMMMMMMOOQQQQRRRRSSSSSSSSRRRRQOMMOQQRRQQOLGwn9:{$@++@)2AINKq5,,######### ..+@$$$%%%%%&&&%%$@+++@@%*=-;>>>(:bitttwwyGLOQRRSSSSSSSSRRROLxtg999ddnswDCGCDt1)!. ....++@@@$$&*;/^^[[69"}; diff --git a/hacks/images/tunnelstar.xpm b/hacks/images/tunnelstar.xpm new file mode 100644 index 00000000..e87d4527 --- /dev/null +++ b/hacks/images/tunnelstar.xpm @@ -0,0 +1,323 @@ +/* XPM */ +static char * tunnelstar_xpm[] = { +"256 256 64 1", +" c #020202", +". c #040404", +"+ c #070707", +"@ c #0B0B0B", +"# c #0E0E0E", +"$ c #121212", +"% c #161616", +"& c #1A1A1A", +"* c #1D1D1D", +"= c #202020", +"- c #252525", +"; c #282828", +"> c #2C2C2C", +", c #2F2F2F", +"' c #333333", +") c #363636", +"! c #3A3A3A", +"~ c #3C3C3C", +"{ c #3E3E3E", +"] c #414141", +"^ c #454545", +"/ c #494949", +"( c #4C4C4C", +"_ c #505050", +": c #535353", +"< c #575757", +"[ c #5A5A5A", +"} c #5F5F5F", +"| c #626262", +"1 c #666666", +"2 c #696969", +"3 c #6D6D6D", +"4 c #707070", +"5 c #747474", +"6 c #767676", +"7 c #797979", +"8 c #7B7B7B", +"9 c #7F7F7F", +"0 c #838383", +"a c #878787", +"b c #8A8A8A", +"c c #8E8E8E", +"d c #929292", +"e c #969696", +"f c #999999", +"g c #9D9D9D", +"h c #A0A0A0", +"i c #A4A4A4", +"j c #ACACAC", +"k c #AFAFAF", +"l c #B3B3B3", +"m c #B6B6B6", +"n c #BABABA", +"o c #BEBEBE", +"p c #C2C2C2", +"q c #C5C5C5", +"r c #C8C8C8", +"s c #CCCCCC", +"t c #CFCFCF", +"u c #D1D1D1", +"v c #D6D6D6", +"w c #E2E2E2", +"x c #E6E6E6", +"y c #EAEAEA", +"wqljjjkkkllkkkjjjjjjjjkllmmmmmllkkkjkkklllllllkkkklmnnnnmlkkkkkklmmmlkkkkklmnonmmlkkklmmmlkjjjjjkkkkkjjjjjjjjjjjjjjkkkkkkkkklmnmmlkkjkkklllkkklmnonmllklmopponmlkkklllllkkklmnnonnmmlklmmnnnnmmlllmnoooonmllllmoqstsrqponmmmoqsuutsrponmmmmmnoqrrrqpponnmmlmnpvy", +"qc1<<[}}|11||}[[<<<<[[}|234443221|}}}}||122221||}}|2577531|}[[}|23332||}}}14687531|}}13442|[[[[[}}}}}[[<<[[[[[[[[[[}}|||}}}|245431|}[}||111|||24787421|248009642|||22221|||1357875421|13577654211247909753221250cfgfdb0864459cfiihec0864323580cddcba087542236bjv", +"l1,*&*=-;>,>>;-==****=-;,)~~~!)),>;---;>,'''',,>;;>'{^/^{)>;---;,)!!',>;-;,!^((^~'>;;,!]{)>-=*==-;;--==**==--======-;;;;;;;>){]{),;---;,,,,>>,)]((/{),,']_[<_^!'>>,'))',>;>,!^((/^~),>'!^//^]!),,)](:<_/]!'''~(}47752}:(^{]/[380073}:(]~!!{/:}1221}[:(^{!)!]_2es", +"j<*+.+@#$%&&&%$#@@+++@#$&=;>>;;-=*%$##$%&=====*&%%%*;')),;*%$##$&-;;-*&%$$&-,!!)>-&%$&->,-&$@@@##$$$##@+++@###@@@@#$$%%%%$$&->,,-*%$#$%&***&&&-'~~)>=&&-']/^~';*%%*=-=*&%%&=>)~~),;=&&=>)!)'>;=*=;']^^~'>-==-'^[232|:/{),,)^[26741;;>'](<[[<:(^~),;;;,~(2es", +"j:&. .+@#$%%%$#@++...+@$%=-;;;-=*%$####$&****&&%$$%*;')';=%##@#$*=--*%$##$*;'!)>-&$#$*;>-&#++++@#$##@+..++@@@++++@#$$$$$##%=;,>-&$#@#$%&&&%%%-,!!';*%&-']^])>=%$%&==*&%$$%=,)!)';=&%&-,))'>;=*&=;)]]{)>-=*=;!_|22|<(]),>,~_|4641--;,~/:[[<_/]!'>;-->!/[5gt", +"j:&. .+@#$%%%$#@++...+@$%=-;;--=&%$#@#$%&****&%$$$%=>'),-&$#@#$%=--=&%###%-,)),;*%$$&-;;*$@+++@#$##@+...+@@@+++++##$$$$##%=;,>-&$#@#$%&&&%%&-'!!,-*%&-)]^{);=%$%*==&%$$$&-,!!),-*%%*;')),;-*&*-,~]]!,-=**-'^[221[(]),>,!(}4652[(])>;--,!^_<[<_/]~'>;-->!/[29iu", +"j<&. .+@#$%%%$#@++..++@$&=-;;-=*&%##@#$%&****&%$$$&-,)'>=%$#@#$*=-=*%$##$*>))'>=%$#%=;;=%@+++@##$#@++..++@@+++++@#$$$$##%=;,>-&$#@#$%&&&%%&-'!),-&%&;!^^~'-*%$%*=*&%$$%*;)!!'>-&%&=>))'>;=*&=>)]]~';-**=>{:|21}:^~'>>)^[3652}_]),;-->)^_<[<_/]~),;-->!/[250iu", +"j<&. .+@#$%%%$#@+...++#$&=;;;-=*%$##@#$%****&&%$$%=;'),-*$#@#$%=--=&%##$&-')),-&$#$*-;-&#++++@###@++..++@@+++++@#$$$$##%*;,>-&$#@#%&&&&%%&;'!)>=&%*>~^^!,-&$%&*=*&%$$%=,)!),;=&%*;,)),;-*&*-'~]{),-=*=;)(}22|>']:2563|:^!,;-->)]_<[<:(^~),;-->!/[2469ht", +"j<*+ .+@#$%%%$#@+...++#%*-;;;-=*%$#@##%&****&%$$$&-,''>=%$#@#$&=-=*%$##$=>)),;*%$$&-;;*$@+++@#$##@+..++@@+++++@#$$$$##$*;,>-&$#@#%&&&%%%*;)!)>=&%=,{^])>=%$%&=*&%$$$&-'!!'>-*%&=>')'>;=*&=>)]]!';=**-,^[121[(]),>,~_|464|:^!';--;'](:[<:(^~),;-->)/[24557fs", +"j[=+ .+@#$%%%$#++...++#%*-;;--=&%$#@#$%&****&%$$%*;'),;*%#@@#%=--=&$##$&;')'>=&$#%=;;=%@+++@#$##@+..++@@+++++@#$$$$##$*;,>-&$#@#%&&&%%%*>)!';=&&-']^]);=%%%*=*&%$$%=>)!)';=&%*-,)),;-*&*-'~]{)>-=*=>~:|21}_^!,>>)/}4641--;'{(:<<:(^{),;-->)/[245434dr", +"j[=@. .+@#$%%$$#++...+@#%=-;;-=*&%##@#$%&***&%%$$%=>''>-&$#@#$&=-=*%$##%=,)),-*$#$*-;-%#+++@####@++..+@@+++++@#$$$$##$*;,>-&$###%&&&%%%=>)!';*%&-)]^{';*%%&*=*&%$$%-,)!),-*%%=>')'>;=*&=>!]]!,;=**-)/}22|>'^[2552[(])>--;,{/:[<:(^{),;-->)/[24542|2bq", +"k}-#+. .+@$$%%$#@++...+@$%=-;;-=*&$####$&****&%$$$&-,)';*%####%=--=&$##$*;))';=%$$&-;-*$++++@###@++..+@@@++++@#$$$$##$*;,>-&$###%&&&%%%=,)),-*%&;!^^~,-&%%&*=*&%$%*;'!!'>-&%&-,)),;-*&*;'{]{'>-**=,]<121[(]),>']:1553}_]),;-;,~/:[<:(^{),;-->!/[24542}<}0p", +"k}-#@+. .+@$%%%$#@++...+@$&=-;;-=*%$###$%&****&%$$%=;'',-&$#@#$&=-=*%$##%-,))>-&$#%=;;=$@+++@#$##@+..+@@@++++@#$$$$##$*;,>=&$##$%&&&%%%=,!),-&%*>~^]!>=%$%*==*%$$%=>)!),;=&%=;')'>;=**=,!]]!,-=*=;!_|21}_^!,>,!_|454|:^!,;--,!^:<<:(^{),;-->)/[24542}:(<9o", +"j[-#@++. .+#$%%%$#@++..++#$&=-;--=&%$#@#$%&***&%$$$&-,'';=%####%=--=&$##$*>)),;*%$$*-;-%#+++@#$##@++.++@@++++@#$$$$##$*;>>=&$##$%&&&%%&-,!)>=&%=,{^]);=%%%*=*&%$$&-,)!'>-*%&-,)),;-*&*;){]~';-**-'/[12|:/~'>,)/}3541!^_<[:_^]),;-->)/[24541}:/^(7n", +"j[=#@@@+. .+#$%%%$#@++..++#%*-;;--=&%##@#$%&***&%$$$*;,',-*$#@#$&=-=*%$#$&-')'>=%$$&-;-*$+++@####@++.++@@+++++##$$$$#$*;,>=&$##$%&&&%%&-'!)>=&&-']^{';*%%&*=*&%$%*;'!)';=&%*;')',;=**-,!]]),-=*=>]:12|[(]),>'^[2552[({'>-->)^_<[:_/]!,;-->)/[24541}:/]~^5m", +"j[=#@@@@++. .+#$$%%$#@++..+@#%*-;;-=*&$####$&***&&%$$%=>''>=%$###%=--=%$##%=,)),-&$$%=;;=$@+++####@++.++@@+++++@#$$$$#$*;,>=&$##$%&&&%%&;')';=&&-)]^~,-&$%&==*%%$%=>)!),-*&&=>'),;-*&=;){]~';=*=;)(}21}_^!,>,{:1552}(])>;->)](<[<_/]!,;-->)/[24541}:/])'{3m", +"j<*@@@@@@++. .+@$$%%$#@++..+@#%=-;;-=*%$#@#$%&***&%$$$&-,',;*$###$*=-=*%$#$&;')';=%$$*-;=%#+++@#$##@+.++@@+++++@#$$$$#$*;>>=&$##$%&&&%%*;')';*&&;!^]!>=%$%*=*&%%%&-,))'>-&%*;,)',;=&*-,~]{)>-=*-,^[12|:/~'>,!(|453}_]),;-;'](<[<_/]!'>-->)/[24431[:/{),>!3m", +"j<*+++@@@@++. .+#$$%%$#@++.++@$&=-;--=&%$#@#$%&***&%$$%=;'',-&$###%=--*%$##%=,)'>=&$$%-;-&#+++@#$$#@++++@@@++++@#$$$$#$*;>>=&$##$%&&&%%*;)),-*&*>!^]);*%%&*=*&%$%*;'!),;=&&=>'),>-*&=;){]!,;=*=>{:|2|<({),,)/}354|:^!,;-;'{(:<<_/]!'>-->)/[24431[:/{),;;~4m", +"j<*+.++@@@@++. .+#$%%$$#@+++++#$&=-;--=&%####$%&**&&%$$&-,'';*%###$&=-=&%$#$*;'),-*$$%=;;=$@++@#$$#@++++@@@++++@#$$$$#$*;,>=%$##$%&&&%%=>)),-&&=,{^{';*%%&==*%%$%=,)!)>-*%*-,)',;=**-,~]{)>-==-)(}11[_]),>']<2541-->)/[24431[_^{),;;,^7o", +"j[*+..++@@@@++. .+#$%%$$#@+++++#$*=-;-=*&$####%&***&%$$%*;'',-&$##$%=--*%$##%-,)';=%$$*-;=%#++@#$$#@++++@@@++++@#$$$$#$&;>>=%$##$&&&&%%=>)),=&&-']]~,-&%%*==&%%%&-'!)';=&&=>')'>-*&=;)]]!,-=*=,]<|1}:^!'>,{:1442[({'>-;,!/:<<_/]!'>-->)/[2443|[_^~'>;;>!:aq", +"j[=@...++@@@@++. ++#$$%$##@+++++#%*-;;-=*%$###$%&***&%$$%=>''>=%###$*--=&%$#$=>)),-&$$&-;-&#+++@#$##@+++@@@++++@#$$$$#$&;>;=%$##%&*&%%%=,))>=&&-)]]!>=%%%*=*&%$%*;)!),-*&*-,)',;=**-,~]~';=*=;!_}1|,!(|442}(])>-->!^:<<:(]!'>-->)/[2443|[_^~'>;;,!/1ds", +"k}=@+...+++@@@++. ++#$$%$##@++++@#%*-;--=&%$###$%&***&%$$&-,',-&$##$%=--*%$#$&;'),;*%$%=;;*$@++@#$$#@++++@@@+++@#$$$$#$&->>=%###%&*&%%&-,)';=&*;!]]);*%%&*=*&%$%=,))'>-&&=;')'>-*&=>)]]),-==-'/[1|[(]),>)^[353|_])>;->)^_<<:(^~'>;->)/[2442|<(^!'>;;,!(}6ht", +"k}-#++...+++@@@++. ++#$$%$#@+++++@$%=-;--=&%####%&***&%$$%*;''>=%$##$*--=&$##%=,)'>=%$$*-;=%#++@#$$#@++++@@@+++@#$$$$#$&->>=%$##%&*&%%&-,)';*&*>!]{';*%%&==*%%%&-')),;=&&-,)',;=**-'~]~';=*=>{:||}_^!,>']<244|:^!,;->)^_<<:(^~'>;->)^[1442|<(^!'>;;,{(}39iu", +"k|;$@++...+++@@@++. ++#$$%$#@+++++@$&=---=*%$###$%&***&%$$&-,',;*$##$%=--*%$#$&;'),-&$$&-;-&#@+@#$$##@+++@@@+++@#$$$$#$&->>=%$#$%&*&%%&-,),;*&=,~]~,-&%%*=*&%$%*>)!)>-*&=;')'>-**=>!]{)>-==;)(}|}:/~'>,~_1441;->)^[1442|<(]!,>;;'{_}360it", +"k|;%#@@+...+++@@@++. +@#$$$$#@+++++@$&=---=*%$###$%&***&%$%*;,'>-%$##$*--=&$##%-,)';=%$%=;;*$@++#$$$#@+++@#@+++@#$$$$#$&->>=%$#$%**&%%&;'),-*&='{]!>=%%&*=*&%%&-,))';=&&-,'',;=**-'{]!,-=*-,^<||<(]),,!(}342[({';;;'](<[:(^~'>;->)^[1342}<(]),;;>']:|3568gs", +"l1>%$##@++...++@@@+++. ++#$$$$#@+++++#$&=---=&%$###$&***&%$$%=>',;*%##$%=--*%$#$*>'),-&$%*;;=%#++@#$$#@+++@#@++++#$$$$$$&->;=%##$%**&%%*;''>-&&-)]]);*%%&==*%%%*;'!),-*&*;')'>-**=>!]{)>-*=>~_}|[_]),>)^[243}_])>;;,{(<[<_^{)>;->)^<1332}:/]),;;>)^:|45435dr", +"l1,&%$##@++...++@@@@++. ++#$$$$#@+++++#%*=--=*&$###$%&***&%$$&-,',-&$##$*--=&$#$%-,),;*%$&-;-&#@+@#$$##+++@#@@+++#$$$$$$&->;=%##$&**&%%*;''>=&*;)]{';*%%*==&%$%=>))'>=&&=>'),;=**;'{]!,-==-)/[|}:^!,>']<243|:])>;;,~/:[<_^{)>;-;)^<1332}:/]),;;>)^<14542|1bp", +"l2'*%%$##@++...++@@@@++. .+@#$$$$#@++++@#%*=--=*%$###$%&***&%$%*;,';=%##$%=--=%$#%=>''>=%$%=;;*$@@@#$$$#@++@##@+++#$$$$$$&->;=%##$&**&%%=>'';=&*;!]~,-&%%*=*&%%&-,)),;=&*;,)'>-=*=,!]~';===,]:}};-;)^<1331}:/{),;;,!/[24541[:[0o", +"l2'=&%%$$#@++...++@@@@++. .+@#$$$$#@++++@#%*---=*%$###$%&**&%$$%-,',-&$##$*--=&$$$&;'',-&%%*;;=%#@@#$$$#@++@##@+++#$$$$$$&->;=%##%&=*&%%=>',;=&=,~]!>=%%&==*%%%*;'))>-*&=>'),;=**;){]!,-==;!([}[(]),,)(}342[/!,;;,!/:[<_/]),;-;)^<1331}:/{)>;;,~(}24531[_/_7n", +"l1,=*&&%$$#@@++..++@@@@++.. .+@#$$$##@++++@$&=--==&%####$&***&%$%*;,'>=%##$%=--=%$$%=,'';=%$&-;-&$@@#$%$$#++@##@@++@#$$$$$&->;=%##%*=*&%%=>',-*&=,{]);*%%*==*%%%=>))';=&*-,)'>-=*-,~]~';==-'^<}[_^!,>'^[242[({'>;>!^:<<:/]),;-;)^<|221[_^~'>;;'{_}3553|<(]~^5n", +"k|,*&*&&%%$##@++.+++@@@@++.. .++#$$$##@++++#$&=--=*%$###$%&**&%%$%=>',;*$##%*-;-&$$$*;''>-&%%=;;*$#@#$$%$#@+@###@++@#$$$$$&->;=%##%*=*&%%=>',-*&-)]{'-&%%*=*&%$&-,)),-*&=>'),;=*=;)]])>-==>~_[[:/~'>,]:243}_]'>;>)^:[[:/]),;-;)^<|22|[_^~'>;;']:|3542}:/])'{4m", +"k};&%&*&&%%$##@++.+++@@@@+++.. .++##$$#@@++++#$&=-==*%$#@#$%&**&%$$&-,'>=%##$&=;-=%$$%-,',;*%%*;;=%#@@#$%$#@+@###@++@#$$$$$&->;=%#$%===&%&=>,>=&*;)]~,-&%&==*&%%*;')'>=**-,)'>-=*-,~]~';==-)/<[<({',,!_|43|:])>;>)]_[[:(]),;-;'^<|22|[_^!'>;>)^:|3442}:^{),>!2m", +"k}-$$%&&&&%%$##@++.+++@@@@@++... .++##$$#@@+++@#%&===*&%$#@#$%&**&%$%*;',;*$##%*-;-&$$$*>''>=%%&-;-&$@@#$%%$#@@###@++@#$%$$$%->;=%#$%===&%&-,,;=&*>!]!>=%%&==*%%%=,)),;=*=;'),;=*=;)]{)>-==,]:[<(]),,)/}341<^!,;>']_<[:(]),;-;'^:|22|<(]!,>;>)^<14431[_^!'>;;)3m", +"j[-$#$%&&*&&%$$#@+++.++@@@@@+++.. .++##$##@++++@#%*===*&$#@@#$%&*&&%%&-,',-%$#$&-;;=%$$&-,',-&%%=;;*$#@#$%%$#@@####@+@#$%$$$%->;=%#$&=-=&%&-,,;=&=,~{);*%%*==&%%&-'))>-**-,)'>-=*-'{]!,-==;!(<[_^!,>'^[242[/!,;;'](<[<(]!,;-;'^:|22|<(]!,>;,!/[2443|[(]!,>--;{5n", +"k}-#@#$%%&&&&%$$#@++++++@@@@@+++....++@####@++++@#%*===*%$#@#$%&**&%%%*;,';=%##%=;;-*%$%=>',;*%%*;;=%#@#$%%$#@@####@+@#$%$$$%->;=%$$&=-=&%*-,,;*&=,{{'-&%%*=*&%%*;))';=*=;'),;=*=>!]{);==-'^:<:/~',,{:142}({'>;,{(<[<(^!,;-;']:|21}<(]),;;,~([2442|',-&$#$&-;;=%$$&;,'>=&%&-;-&$##$%%%$#@##$#@+@#$%$$$%=;;=%$$*--=&%*;,>-**-'{~,=%%&==*%%%=,)),-**-,)'>-=*-'{]!,-==>~(<:({),,!_|33|_])>;,~(<[<_^!,;-;']:|11}:/]),;;,{(}2442}:/~)>;-->)^}cr", +"k|;$#@@##$%&&&&%%$##@+++++@@#@@@+++...++@####@++++#$&*==*%$#@@#$%&&&%%$&-,'>=%##%=;;-&$$%=>',-*%&=;;=%###%%%$#@##$#@+@#$%$$$%=>;=%$$*--=&%*;,>-**;){!>=%%*==*%%&;')'>=*=;')';=*=>!]{';==-)^::(]),,)/}33|:^)>;,!/<[<_^!,;-;']:}1|}:/{),;>']_|3431[_^!'>---,!^<4fs", +"k|>%##@@@#$%&&&&%%$##@+++++@@##@@+++...++@####@+++@#$&*==&%$#@##$%&&&%%%*;,,;&$#$&-;;=%$$*;,,;=&%=;;-%###$%%%#@##$#@@@#$%$$$%=;;=%$%=--=&%*;>;=&*>!{);*%%*==&%%=>)),;=*-,)',-=*-'{])>-=-,]_:_^!,>'][231<^!,;,!/:[<_^!,;-;']:}1|[:/{'>;>']:|343|[(]!,;--;,{([28ht", +"l1,&$$#@@@#$%%&&&%%$##@+++++@@##@@+++...++@###@@+++@#$&*=*&%$#@#$%&&*&%%%=>'>=%##%=;;-*%$%-,'>-&%*->-*$##$%&%$###$$#@@#$%%$$%=;;*%$%=;-=&%=;>;=&=,!~'-&%&==*&%&-,))>-*=;')';=*=,!]~';==;!/:_/~'>,{:132[/~,>>)^:[[_^!,;-;,]:}||[_^~'>;>)^<1342|)]:}248gt", +"l1,*%$$##@@##$%&&&%%$$#@++++++@##@@@++...++@###@@+++@#%&*=*&$#@@#$%&&&%%%&;,,;*$#$&->;=%$%*;,,;*%&-;;=%##$%&%$###$$#@@#$%%$$%=;;*%$%=;-=%%=;>-**=,~!,=%%&==*%%*;')';=*->)),-==;)]])>==-,](_/]),,!(|32}({'>>)^:[[:/~';-;,]:}||[_^!'>;>)^<1442}:/~'>;-;,!/<|3446er", +"l2'=&%%$##@@##$%&&&&%$$#@++++++@###@@+++..++@@##@@@++@#%&**&%$#@@#$%&*&%%%=>,,-%$#%=;>-*%$&-,,>=&&=;;-&$#$%&&%###$$#@@#$%%$$%=;;*%$%-;-*%%=;>-**-'{!>*%%*==&%%=>)),-==;,)'>=*-,~]~,-==>!/_(]),>)/}23|:])>>)]_[[:/~';-;,]_}|}<(^!'>;,!/[2431[_^!'>--;,{([134212cq", +"l2'=*&%%$$#@@@#$%%&&&%%$##@+++++@###@@+++..++@@##@@@+@@$%&**&%$#@@#$%&&&%%&-,,;*$#$&->;=%$%=>,,-*%*->-*$#$%&&%$##$$#@@#$%%$$%=;;*$$&-;-*%&=;;-**;)~);&%&===&%&-,)'>=*=>'),-==;)]]);==;)^((^!,>']<23|:^),>']_[[:/{';-;,]_[|}<(]!,>>,~(}233|[(]),;-->)]:}2332}<}0p", +"l2'=**&&%%$##@@##$%&&&%%$##@+++++@####@@++..++@@@@@@@+@#$%&**&$#@@#$%&&&%%%*;,,-&$#%=;>-*%$&;,,;=&&->;=%##%&*%$##$$$#@@$%%$$%=;;*$$&-;-*%&=;;=*=>!~'-&%&==*&%*;'),;==;,)'>-=-,~]!,-=-,{/(^~'>,~:131'{_[[:/{';-;,]_[|}<(]),;>'{_}232|,>=%#$*;>;=%$%=>,>-*&=;>-&$#$&*&%##$%$#@@$%%$$%=;;*$$&->-*%&-;;=*=,!!,=%%*==*%%=>))>-==>'),;==;)]{);==;)^(/{),,!(|32[(~,>,{(<[<({';-;,{_[}}:(]),;>']:|232}:^~'>;-;'{([1332}<(^{/6n", +"k|,******&&%$$##@##$%%&&%%$$#@+++++@#####@++..++@@@@@@@@@#$&**&%$#@@#$%&&&%%*;,,-&$$%=>>-*%%*;,,;=&*;>;*$#$&**%$#$%$#@@$%%$$%=;;*$$*;>-*%&-;-=*=,!!>*%%=-=&%&-,)';==-,)'>-=-'{]!,-=-,]//]),>)^[22}({'>,~(<[<(]'>-;,{_[}[:/{)>;>)^:|231[_^!,;-->)]:}2321[:/]))]4m", +"k};&&&****&&%%$##@@#$$%&&&%$$#@+++++@#####@+++..++@@@@@@@@#$&*&&$#@@@#%&&&%%%=>,>=%$$*;>;=%$&->,>=&*->;=%$$%**%$#$%%#@@$%%%$%=;;*$$*;>-*%*-;-**-'~);&%&=-=&%*;'),-==>'),;==>!]{';==>!^/]!,>']<12|:]),,!/<[<(])>-;,{([}[:/{'>;>)^<132|[(]),;-;,!/<|232|<(^~),>~3m", +"k}-$$%&&****&%%$$##@##$%%&&%%$#@@++++@#####@@++..++@@@@@@@@#%&&&%$#@@#$%&&&%%&-,,;*$$%=>>-*%%=;,,-*&=;>-&$$%**&$$$%%$@@#%%%$%=;-*$$=;>-&%*-;-**;)!'-&%*=-*&&=,)'>==-,)'>-=-'{])>-=-']^^~'>,~_|21<^),,!/<[[_])>--,{(<[[_^~'>;>)/[132|;-;'{([1321}:/]!'>;;~4m", +"j[=##$%%&****&&%%$##@##$%%&&%%$##@++++@#####@@++..++@@@@@@@##%&&&%$#@@#$%&&&%%*;,>-%$$*;,;=%%&-,,;=&=;>;*$$%***%$$%%$#@#%%%$%=;;*$%=>>-&%*--=*=>)!,=%%*-=*%&-'),;==;'),;==>!]~'-=->!^^{),>)(}21[/!,,)^:[[_])>--,~(<[<_^!'>;,!([122}:^~'>;;>)^:}222|[_^~),;;;,^7o", +"j[=#@##$%&*****&&%$$#@@#$$%%&%%$##@++++@######@++..++@@@@@@@#$%&&%%##@@#$%&&%%&=>,;*$$%=>>-*%%=>,>-**->;=%$$&=*%$$%%$###%%%$%=;-*$%=>>-&%*--=*=>!)>*%&=-=&%*>))>-=-,)'>-=-'{]);==;)]^]),>'^[22}(~',)^:[[_^)>--,~(<[<(^!,>>,~(}221[_^!,;-;,!/<|221}:/]!'>;;;,~:aq", +"j[=@+@@#$%%&*****&%$$##@##$%%&%%$##@++++@######@++..++@@@@@@@#$%&&%$#@@@#%%&&%%*;,,-&$$*;,;=%%*;,,;=*=;>-&$$&==&$$%%$###%%%$%=;-*$%-,,-&%*--=*=,!);&%&=-*&&=,)';==;'),;==>!]~,-=-,~]]!,>,]:12}_{',)]:[[:^)>-;,~(<[:(]!,>>']_}22|[(]),;-;'{([122|[_^~),;;;>)]_2es", +"j[=@+++@##$%&*****&%%$##@##$%%%%%$$#@++++@##$$##@++.+++@@@@@@@#$%&&%$#@@#$%&&&%%=>,>=%$%->>-&%%=>,>=*=;>;=%$%==*%$%%%###$%%$%=;-&$%-,,-&%*--**-'!'-&%*-=*%&-'),-=-,)'>-=;)]]);==>)]]~'>,!_|2|:]),']_[[:^)>--,~(<[:(]),>>']:|22|:/{'>;;>)^:}121}:(]!'>;;;,~/<|7ht", +"j[=@++++@@#$%%&****&&%$$####$$%%%%$$#@++++@##$$##@@+++++@@@@@@##$%&%%$#@@#$%&&%%&-,,-&$$*;,;=%%*;,>-**->>=%$%*=*%$%&%$##$%%%%=;-&$%-,,-&%=-=**;)!,=%&=-=&&=>''>-=;'),;=-,~]!,-=-'~]~),>)/}21<^),'{([[:^!,;-,~(:<:/]),;>)^<|21}:^!';;;,!/<|21|[_^{),;;;,)]_}249ht", +"j[=@++++++@##$%&*****&%%$#####$%%%%$$#@++++@##$$$##@++.++@@@@@@##$%&%$#@@@#$&&&%%*;,>=%$%->>-&%&->,;=*->>-&%%*==&$%&%$##$%%%%*;-&$%;',=&&=-=*=;))>*%&=-=&&-,),;=->)'>-=;)]{';=->!]{),>'^[11[/!,'~(<[:/!,;-,~/:<:/{)>;>)/<|21[_]),;;;'{([|11}<(]!'>;;>'{(<|3448fs", +"j[=@+++++++@@#$%%&****&&%$#####$%%%%%$#@@+++@##$$$##@+++++@@@@@@#$%%&%$#@@#$%&&&%&=>,;*$$*;,;=%%=;,>-*=;,;=%%&==&%%&&$##$%%%%*--&$&;',=&&===*=>));&%*--*&*;''>-=;,),;=-,~]!>-=;'~{!,>,{:|1}(~''!/<[:/!,;-,!/:<_/~'>;,!/[12|<(])>;;>)]_}11|[_^{),>;;,!^:}244324dr", +"j[*@+++++++++@##$%&****&&%$$##@#$$%%%%$##@+++@@#$$$##@+++++@@@####$%%%%$#@@#$%&&%%*-,>=%$%->>-&%&->,;==;,>=&%&==*%%%&$##$%%%%*--&$&;',=&&===*=,)'-&%=-=*&=>'';-->''>-=;)]{'-=-,!{!'>,!(}1}_{''!/:[!/::_^~'>;,~([11|;;,!^:}1|}<(]!'>;;>']([13432}[|ap", +"j<*++++++++++++@#$%%&****&%%$##@##$%%%%$##@+++@##$$$$#@+++++@@#####$%%%%$#@@#$%&&%%=;,;*$$*;,;=%%=>,;==->,-*%&==*%%%&%##$%%%%*--&$&;'>=%&==**-,),=%&=-=&&-,',-=;,),;=-,{])>==;)~!),>)/[1|:])')^:[<(~,;;>!/::(^!,>;,{(}11}:^!,;;;,{([|||[_^{),>;>,!^:|2432|[_(:8o", +"j<*+..++++++++++@##$%&****&&%$$####$$%%%$##@+++@##$$$$#@+++++@@#####$%%%$#@@#$%&&&%&->>-&$%->>-&%*;,>-==;,;=%&=-=&%%&%$#$%%%%*--&%&;'>=%&==**;')>*%*--*&*;'';-->''>-=;)]~,-=-,!~),>']<1|<^)')^:[<({,;;>!/_:(^!,>>']_}1|[_]),;;>']_[||}<(]!'>;;>)]_[13431}:(]~/5n", +"j<*+....++++++++++@#$$%&****&%%$#####$%%%$$#@+++@##$$$$#@+++++@@#####$%%%$#@@#$%&&%%*;,;*%$*;,;=%&=>,;==;,>-&%*-=&%%&%$#$%&%%*--&%*;'>*%*==*=;'';&%*--*&=>',;-;,),;=-,{{);=->)!),>,~:|1[/!')]_[<({';;>!^__(]),>>)]:}1|<({'>;;>)^:[}}[_^{),>;>'~/<|2331}<(^~',~3m", +"j[*+.....++++++++++@@#$%&*****&%$##@##$%%%$$#@+++@@#$$$$#@+++++@#####$$%%%$#@@#$&&&%&=>>-&$%->>-&%*;,>-=->,-*%*=-*%%&&$#$%&%%*--&%*>';*%&==*=>),-&&=-=&&-,'>--;'',-->!]!,-=;'!!'>>)(}|[(~')]_[[_]';;>!^__/]),;>)^<||}:/~';;;,~/:}}[:(]!'>;;,)^:}2332|[_^{),;;)2l", +"j[=@+......+++++++++@@#$$%&****&%%$####$$%%$$#@++++@#$$$$##++++@@#####$%%%$##@@#%&&&%*->>=%$*;,;=%&->>-=->,;=&*=-=&%&&$#$%&%%*--&%*>,;*%&==*=,),=&&--=&*;',;--,)';--'{{';=-,)!),>'^[|}_{)'{([[_]';;>!^(_/]),;>)/<||[_^!,;;;'](<}}<_^{),>;>'{([1332|[:/]),;-=-)2m", +"j[=@+++.....++++++++++@@#$%&*****&%$#####$$%$$##@+++@#$$$$##++++@@#####$%%%$#@@#$%&&&&=;,;&%%->>-&%=;>;==;,>-&&=-=&%&&%#$%&%%*--&%*>,;&%*=**-,'>*%*--*&=>',--;'',-->!{!>--;'!),>,]:|}:]))~(<[_]';;>!^((/{)>;,!/[||[(])>;;>)]_<[[:(]!'>;>,!^:|2331}<(]!'>-===;{5n", +"j[=@+++++....+++++++++++@#$%%&****&%%$####$$$$$##@+++@#$$%$$#@+++@@#####$%%%$#@@#$&&&&*->>=%%*;>;*%*->>-=-,,-*&=--*%&&%$$%&%%*--&%=>,-&%*=**-,';&&=-=**-,,;--,'';-;'{~'-=-,))'>,~_}}:^)'!/<[:^)>;>!^((^{'>;,~([|}<({'>;;,!^_<[<_^{),>;>)]([1332|<_^~'>;-==->)(9o", +"k[=#++++++....+++++++++++@@#$%&*****&%$#####$$$$##@+++@#$$%$$#@+++@######$%%%$#@@#%&*&&=;,;*%%=>>-&&=;>;=->,;=&*--*%&&%$#%&%%*--&%=>,-&%*=*=;',-&&=-=&*;,,;-;'',-->!{)>-->))',>)/[};>)^((^~'>>,{([|}:^!,;;;,~/:<<:/]!'>;>,~/<|232|[_/{),;-==-;,!^[ap", +"k}-#@@++++++++++++++++++++@@#$$%&****&%$$####$$$$$#@+++@#$%%$$#@+++@#####$$%%%$#@#$%&&&&=>>-&%*;>;*&*;>;--;,>=&*--=&&*&$$%&&%&--&%=,,-&&*=*=>',=&*--**=>,>-->'';-;'{!,-=;')),>'^<}[(~))^:<:^)>;>)^((^!'>>']_[}[_^),;;>'](:<:(^~),;;,)]_}1321}:/]),;-==-;,)]^_|bq", +"k}-#@@@@++++++++++++++++++++@@#$%&*****&%$####$$$$$#@+++@#$%%$$#@++@######$%%%$##@#$&*&&*->;=%%=;;=&&->>-=;,,-**--=&&*&$$%&&%&--*&=,,-&&*=*=>'>=&=--**-,,;-;,',-->!~);=-,)),>,{:}[({))]_<:^)>;>)^((^!,>>']:}}<(])>;;,)](::_/]!'>;>'~(<|222}<(]!'>-==-;,)]^(_:|bq", +"k};$##@@@@+++++++++++++++++++@@##$%&****&%$#####$$$$#@@++@#$%%%$#@++@##$$#$$%%%$#@#$%&*&&=;>-&%*->-*&=;>;-->,;=*=--*&&&$$%&&%&--*&-,,=&&*=*-,';*&=-=*=;,>-->'';-;)~!,-->')'>,!([}:]))]_<:/!>;>)]//]!,>>)^:}};-=-;,){^(____[0p", +"k};$####@@@@+++++++++++++++++++@@#$%&*****&%$####$$$$##@++@#$%%%$#@+@@##$$$$$%%%$###$%**&*->>=%%=;;=&*->>--;,>=*=--*&&&%$%&&%&=-*&-,>=&&**=-,,-**--=*=>,;-;,',--,!~';-;,)',>)^<[:^!)](<:/!,;>)]//]),>,)^:}[:^!,;;>'{/__(/])'>;>'{([|22|[:/{),;-=-;,){^(___(//:9o", +"k};$$#####@@@++++++++++++++@@@+++@##$%&*=**&%$####$$$$##@++@#$%%%$#@@@@#$$$$$$%%%$###%&**&=;>;*%*-;-*&=;>;-;,,-*=--*&&&%$$&&%&=-*&-,>=%&**=;',=&=--**-,,;->'';-;)~)>--,)),>']:[)]//]),>,!/<[[_])>;;>)]/((/]!',>>,!^:}121}:(]),;-=-->'~^((__(/^]{(7n", +"k};$$$######@@@@+++++++++++++@@@++@@#$%&**=**%$#####$$$##@++@#$%%%$#@@@##$$$$$%%&%$##$%****->>=&%=;;=&*->;-->,;==--=&&&%$$%&%&=-*&-,>=%&**=>'>=&=-=*=;,>--,',;-,!!,;-;')',,~_[)]/^]),>,~(<[<({'>;;,)]/((^{),>;>)]([|21}<(]!'>-=-->'~^/(__(/^]!))]4m", +"k}-$##########@@@@+++++++++++@@@@@@@@##$%&*=**&%$####$$$$#@@+@#$%%%$#@@@#$$$$$$%&&%$##$&***=->;*%&-;-&&=;>-->,>-*--=*&*%$$%&%&=-*&-,>*%&**->';**--=*->,;-;,'>-;)!);-;,)',,)/<<({)!^::(~,;>)]/^{),>,{(<[:/!,;;;,!^/(/]!'>;>,~/<|11|[_^~'>---->'!]/(__(/^]!)'>>!3m", +"j[-#############@@@@+++++++++@@@@@@@@@@#$%&**=*&%$####$$$$#@@+@#$%%%$##@##$$$$$%%&&%###%&***=;>-&%=--*&=;>;-;,,-==--*&&%$$%&%&=-**-,;*&***-,,-*=--=*->>-;>',;;,!!,-->'',,'^:<_])!^_:({,>>)]^^{',>'](<<_^),;;>'~^//^{),>;,)]_}11|}:/{),;---;,!]/(_((/^]!),>;-;)3m", +"k[-#@@############@@@@++++++++@@@@@@@@@@##$%&*==*&%$####$$$##@+@#$%%%$$###$$%%$$%&&&$##$%****->;=%&-;=&*->;-;,,;==--*&&&$$%&&&=-**->;*&*==-,,-*=--*=;>;-;,,>->)!';-;')',,{_<_^!!](:({'>,)]^^~'>>)]_<<(])>;;>){^^^]!'>;>'~(<|11}<(]),;---;,)]^((((/^{!),>;---;~4m", +"k}-#@@@@####$$$#####@@@@+++++++@@@@@@@@@@@#$%&*==*&%$####$$$##@@@#$$%%%$###$%%%$$%&&%$##$&***=;>-&%*--*&=;>;->,>-=--=&&&%$%&&&=-**->-*&**=;,>=*=-=*->>;->,,;;,!)>-;,)',,!(::^!!](:(]'>,)]^^~'>,)^_<:/~';;;,)]^^]~),>>,)^:}11|<(]!,;---;,){^/(((/]{!),>;----;,^7n", +"k|;$##@@@@####$$$$####@@@@+++++@@@@@##@@@@@##$%**==*&$####$$$##@@@#$%%%%$###$%%%%%%&&%$#$%*=**-;;=&&=-=&*->;->,,-=--=&&&%$%&&&=-**-;-&&*==>,;==--==->;-;,,>;>)!';->'),,)^::/~!](:(]'>,)]^]!'>,)^_:_^!,;;;,!]^]{)'>;>'{([|1|[_^~'>---;>)~^/((/^]{!',>;---;;,){:0p", +"l1,&$$##@@@@####$$$$#####@@@+++++@@@####@@@@@#$%&*==*&%$####$$##@@@#$$%%%$##$%%%%%%%&&%$$$&*=*=;>-*&*-=*&=;;;;,,;=--=*&&%$%&&*=-**-;=&&*=->,;==--==;>;->,,;;,))>-;')',']_:({!{/_(])>,)]^]!,>,!^_:(])>;;>'!]]]!',>>,!^:}||[:/{)>;--->'~]/((/^]~!',>;---;>,){]/[ap", +"m2)=&%$$##@@@@###$$$$$$####@@@+++@@@@######@@@##$%**=**%$####$$$##@@#$%%%%$##$%&&%%%&**%$$%*===-;;=&&=-*&*;;;;,'>--;-*&&%$%&&*=-**-;=&&*=->>-=--==-;;-;>,>;>)),;;,)',,~(:(]!~/__]),,)]^]!,>,!/::({'>;;,)~]]~),>;>)]_[||}<(]),;--->'!]^///^]~)',;;---;>'!{^/(_}ap", +"m4~;=*&%%$###@@@###$$$$$$$###@@@@@@@@@#######@@@#$%&*==*&%$###$$$##@@@#$%%%$$$$%&&%%%&*&%$$%*===-;;*&*==&&-;;;>,,----=&&%%%&&*=-**--=%&*=->>-=--==->;-;,,;;,)'>;>'),,)^_(]!!^_(^),,)]^]),>,~/__/~,;;;,)~]{!',>>,!/<}|}<(]),;---;,){^///^]~)',;;---;,'!]^/(((([0p", +"n6^,>;-=*&%$$##@@@###$$$$$$$###@@@@@@@@########@@##%&*===*%$###$$$##@@##$%%%$$$%&*&&%&**&%$%&====;;-&&==*&=;;;;,,;---=&&%%%&**=-**--*&&*=;,;==--==;;-->,>;>)),;;,)',)]((^!!]((^),,)]^]),>'~/_(^),;;>'!~{~),>>,)]_[||[_^!,;---;,)~]^/^]{!)'>;---;>,)~]^/(((/^^:9o", +"n7/)',>;-=*&%$$##@@###$$$$$$$$$##@@@@@@@#########@##$%&*==*&$$###$$$#@@##$%%%$$$%&**&%&**&%$%*===-;;=&*=*&*-;;;,'>---=&&&%%&&*=-**--*&*==;,;=---=-;;-;,>;;,),;;,)','{/(^~!]/(^),,)]]{),,'{/(/])>;;>'!~~!',>>'~/<}|[:/~'>---;>'!]^^^]{!),>;---;>'){]/(((/^^]{~(7n", +"n6^))'',,;--=&%%$#######$$$%%%$$$##@@@@@@####$$###@@##$&*==*&%$###$$$##@@#$%%%$$$&***&&&**&%%&====;;-*&*=&&=;;;>',;-;-*&%%%&&*=-**=-*&*=-;>-=--==-;;;>,>;>''>;>'),,!^(^~!{/(^!,,)]]{),,)]/(^~,;;;,)!~!),>>,)^_[}}<(])>;--->'!]]^^]~!',>;---;>'!{^/(((/^]]~!))]5m", +"m4{,,'')'',>;-=*&%$$######$$%%%%%$$###@@@@@###$$$$#####$%&*==*%$###$$$##@##$%%%%$%&*=*&&*=*&%%*===-;;=&&**&*-;;;,,;-;-*&&%%&&*==**==*&*=->>-=--==;;-;>>;;,',;>')',)](/{!{^(^!,,)]]{),,)]//]!,;;>,)!!)',>>'{(<}}<(]),;---;,){]]]{~)',;;--;;,)!]^/((//^]{!)',>>~4m", +"l2)-;;,,'''',>;-=*&%$$#####$$%%%%%%$$$##@@@@###$$$$$####$%&*==*&%$##$$$#####$%%%%$%&==*&&*=*&%&=-==-;-*&**&&=;;;,'>;;-=&&%%&&*=-**==&&*=->>--;-=-;;-;>>;>''>;,)),'{//]!~^(^!',)]]{),,)]//])>;;>'!!!),>>,!^:[}[_^!,;-=-;,)!{]]{!)'>;;--;>,)~]^/(//^]]~)),,>;;;~4m", +"l1,**=-;>,,''',,>;-=&%%$#####$$%%&&&%%$$##@@@###$$$$$$####$%*===&%$##$$$$####$%%%%%%*===**==*&%&=---;;=&&*&&=;;;>',;;-=&&%%&**==**==&&*=;>;--;-=-;-;>>;;,',;>')''!^/]!~^/^~'')]]~',,)]^^~'>;;,)!!)'>>>)](<[[:/~';-=-;>'!~{{~!),>;---;>,){]^/(//^]{!)',>;;;;;,^6n", +"l1,*&&**=-;>,'''',>;-=*&%$$####$%%&&&&&%%$###@###$$$$$$$###$%&*==*%$$#$$$$####$%%%%%&*===**==*&&*----;;=&&&&*-;;>,,;;;=&&%%&&*===*==&&==;>;---==-;-;>>;>',>>')'')]^]!!]/^~''!]]~',,)]^]!,;;>,)!!),>>,!^:[[:({'>-=-->')!~~!)',>;---;>'!{^////^]{~)',>>;;;;>,){:0p", +"l2'=&&&&&*==-;,,''',,;-=*&%$$###$$%%&***&%%$###@###$$$$$$####$%*==*&%$#$$$$####$%%%%%&=--=*===*&&=---;;-*&&&&=;;;,'>;;-*&%%&**==**=*&&=-;>;-;-=-;-->>;;,',>,))'){^]~!]^^~''!]]~','!]]{)>;;>')!)',>,)](<[<(])>--=-;,)!!!!)',;;---;,'!]^///^^]~!)',>;;;;>,)!]/_|cq", +"m3!-=**&&&&&*=-;>,,'',,>;-=&%%$$##$$%&**=*&%%$######$$$%$$$###$%&*==*%$$$$$$$###$%%%%%&=--=====*&*----;;=&&&&*-;;,',;;-*&%%&**===*=*&*=->>--;-=---;>>;>,,>,')''~]]~!{^^{)'!]]!','!]]~'>;;,'))',>>'~/:<<_^!,;-=-;,')!!)',>;----;,)!]^^//^]{~)',>>;;;>,'!]^(:<[2dr", +"m4~;--==**&&&&*==-;>,,,,,>;-=*&%$$#$$$%&*===*&%$######$$%%%$$##$$%*==*&%$$$$$$###$%%%%%*=--===-=**=---;;-*&&%&=;;>',>;-=&%%%**===**&&*=->;---==---;>;;,,>>')''!]]{!{^^{)'!]]!','!]]!,;;>,)))',>,)](:<_/~';-=-;>'))))',>;---->,)~]^^^^^]~!)',>;;;>,'!{^(_:<[[[1bq", +"n5],;;;--==**&&&&*==-;>,,,,>;-=*&%$$$$$%%&*===*&%$$####$$%%%$$$##$%&*=*&%$$$$$$$##$%%%%&*-;-===-=**=---;;=&%%%*-;>,'>;;=&%%%**===**&&*=;>;-;-=---;>;;>,,>,))'){]{!~]^{))!]]!','!{~),;;>'))),>,'{/:::/{'>-=-->,'))',>;;---;>,)~]^^^^]{!)',>;;;;,'){^(_:<[<<:__[0o", +"n5],>>>;;;--==**&&&&*=-;;>,,,>;--=&%%$$$$%&*==-==&%$$####$$%%%%$$$$%&*==*%$$$$$$$##$%%&%&=-;-==--=*=---;;-*%%%&=;;,',;;=&%%%**===**&&*=;>;-;-=---;>;;,,>,')')!]{!!]^{))!]{!','!~!'>;;,'))',>,!](::(])>----;,'''',>;----;>'){]^^^]]~)',>>;;;>,)~]/_:<<<<:_(^]](7n", +"m4{,>>>>>>;;;--==**&&&**=-;>>,,>>;-=*%%$$$$%&*=---=*&%$###$$$%%%$$$$$%&*=*&%$$$%$$$$$%&&&&=-;;----===-;;;;=&%%%=-;>',>;-*&%%&*=-=**&&*-;;;;;-=---;;;>,,,'))'!{{!!{]{!)!]{)','!!),;;>,))),,,'{/_:(^!,;-=-;>,'',,;;----;>'!{]^^^]{!)',>;;;>,)!]/(:<<<<:_(^]~!)']4m", +"l2);;;>>>>>>>;;;--==**&&&**=-;>>>>;;-=*&%$$$$%&*=---=*&%$###$$%%%%$$$$%&*==&%$$$%%$$$$%%&&*=;;;----==-;;;;-=%%%&-;>,',;-*&%%&*=-=*&&&=-;;;;-=---;;;;,,>,))')~{!!{]{!)~]{),,'!!'>;;,'))',,'!^(__^~';-=-;>,,,,>;--==-;,'!{]^^]{!)',>;;;>,'!]^(_:<<::_/^]~)',>;>!3m", +"k|,**=--;;>>>>>>;;;--==**&&&*==-;;>>;;-=*&%%$$%%&==---=*&%$###$$%%%%$$$%%*==*&%$$%%$$$$%%&&*-;>;----==-;;;;-&%%%=;;,',;-=&%%&*=-=*&&*=-;;;;-=---;;;>,,,')))!{~!{]]!)~]{),,'))'>;>,)))',,){/__/{'>-=--;,,,>>;--=--;,)!{]]]]~!),,>;;;>'){^/_::<::(/^]~)',>;;--;!3m", +"k};%$%&*==-;;>>>>>>>;;--==*&&&&*==-;;;;;--=*&%$$%%&=--;-=*&%$##$$$%%%%$$$%&==*&%$$%%%$$$%%&&*-;>;----=-;;;;;=%%%*-;,',>;=&%%&*=-=&&&*=->;;;-=--;;;>,,,')))!~~!{]]!!~]{),,')),;;>'))',,'!^((/])>----;>,,>;;-==-->,)!{]]]{!)',>;;;>,)~]/(::::_(/^]!)',>;;----->{5n", +"k};$##$$%%&*=--;>>>>>>;;;--==*&&&&*==-;;;;--=*&%%$%%&=--;--*&%$##$$%%%%%$$%&*==*%%%%%%$$$%%&&=->>;;-----;;;;-&%$%=;>,',;=&%%&*=-=&%&*=;;;;-==--;;;>,,'))))!!!~]]~!~{~),,')'>;;,'))',,)]/(/]!,;---;>>>>;--==-;>,)~{]]{~)',>;;;>,'!]^(_:::_(/^{!)',>;;----;>,'!(8o", +"k|>%$$####$$%&*==-;>>>>>>>;;--=**&&&&*==--;;--=*&%%%%%&=-;;;-=&%$$$$$%%%%$$%%*==*&%%%%%%$$%&&*=;>,;;;---;;;;;=%%%*->,',;-*&%&*=-=&%%*-;;;;-==--;;>,,,))))!!!!]]~!~{~),,'',>;>,)))','!^//^~';---;;>>;;-===-;>')~{{{~!),,>;;;>'){^/(_:__(^]{!),>;;----;;>,)!{^(}bq", +"l2'*&%%$$###$$$%%&==-;;>>,,>>;;-==*&&&&&*==-----=*&%%%%%&=-;;;-=&%$$$$%%%%%%%%&*==&%%%%%%$$%&&*=;,,;;;;--;;;;-*%$&=;,',>-=&%&*=-=&%%*-;;;;-=--;;;>,,'))))!!!{{~!~{~),,',,;;>'))',')]^/^{)>---;;>>;;-===-;>')~{{~!)',>;;;>,)~]/(___(/^]~)',>;;---;;>,')~]^(_:[2cr", +"m4~;==*&%%$$$$$$$$%%&*=-;>>,,,>>;;-==*&&&&&*==----=**&%%%%&=-;;;-=&%$$$$%%%%%%%&*==*&%%%%%%%%%&*=;,,>;;;;;;;;;=%$%*->,,,;=&%%*=-=&%%*-;;;--=--;;;>,'))))!!!~{~!~{!',,,,>;>,)))'')~]^^]),;---;;;;--===-;,')!~~!)',>;;;>,'!]^/((((/^]~)',>;;---;;,')!]^(_::<<[[2cr", +"n6^'>;;-==*&%%$$$$$$$$%&*=-;>>,,,,>;;-==*&&&&&*===--==*&%%%%&=-;;;-=&%$$$$%%%%%%%*==*&%%%%%%%%%&*=;,,>>;;;;;>;-*%$&-;,',;=&%%*--=&%%*-;>;-==-;;;>,,)))))!!!~~!~~!',,,,>;>,)))''!{^^]!,;---;;;;--===-;,)!!~!!)',>;;;>')~]/(((/^]{!)',>;;--;;>,)!{^/(_:<<[[<<:<|bq", +"n7(!)',,>;;-==*&%%$$$$$$%%&*=-;>>,,,,>>;-==*&&&&&*======*&&%%%&=--;--*&%$$$$%%%%%%&*==*&%%%%%%%%&*-;,,>>;;;;>;;=%$%=;,',;=&%&=--=&%&=-;;;-=--;;>>,'))))!!~~~!~~!',,,>>>,'))'')~]^]!'>;--;;;;-====->,)!!!!)',>;;;>,)!]^/((/^]~!',>;;;-;;>,')~]^(_:<<<<<<::_((([0o", +"n7/!)))))',,>;;-==*&%%%$$$$%%&*=-;>,,,,,,>;-==*&&&&&**====**&%%%&=--;--*&%$$$$%%%%%&*==*&%%%%%%%%&*->,,>;;;;>>;-*%%&->,,>-*&&=--=&%&=-;;;---;;;>,')))))!~~~!~~!',>>>;>,)))')!{]]~)>;-;;;;;--==-;>,))!!)',>;;;>,'!{]^//^^]~)',>;;--;;>,)!]^/(::<<<<<::_((/^]]{(7n", +"m4],,''))))))',,>;;-==*&&%%$$$%%&*=-;>,,,,,,>;-==*&&&&&**===**&&%&&*=---=*&%$$$$%%%%%&*==*&%%%%%%%&*->,,>;;;;>>;=&$%=;,',;=&*=--=&&*-;;;-==-;;>>,'))))!~{~~~~)',>>;;>')))))!]]{),;;;;;;;-===-;>,))!)),,>;;;>,)~]^^^^]{!)',>;---;>,')~]/(_::<<<:::_((/^]{~!)')^5n", +"l2'---;>,,'))))))'',>;;-==*&&%%%%%%&*=-;>,,'',,>;-=*&&%%&&**==**&&&&&*=---=*%$$$$$%%%%&*==*&&&&%%%%&=->,,>>;;>>;-*%%*-,',;=&&==-=&&*-;>;-=--;;>,')))))!~~~~!)',>>;>,'))))!~]{!'>;;;;;;-===-;,'))))',>;;;>,)!{]^^^]~!),>;;--;;>,)!]^/(:::<<::__(/^]]{!))',,>>,]4m", +"k|>&&&*==-;;>,'')))))'',,>;--=**&%%%%&&*=-;>,'''',>;-=*&&%&&&**=***&&&&*==--=*%$$$$$%%%&*===*&&%%%%&&=->,,>>;;>>;-&%%=>,,;=&&*===&&*-;>;----;>,')))))!~~~~!),,>>;>,)))))!{{!'>;;;;;;--=--;,')))',>;;;;,')~]]]]{!)',>;---;>,')~]/(_::::::_((/^]{~!)'',,,,,,,')/7o", +"k|>%%%%%%&**=--;>,,'))))))',,>;;-==*&&&&&&*=-;>,'''',>;-=*&&&&&******&&&&*==-==&%$$$$$%%%&*==*&&&%%%&*=->,,,>>>>>;*%%*;,,>-&&&==*&&*-;;--=-;;>,')))))!~~!!),>;;>,'))))!~~!),>;;;;;--=-;>,'))',,>;;;>,)!{]]]{!)',>;;-;;>,)!]^/(_::::__(/^^]{!))',,,,,,,')!~]^(}bq", +"l1,*&%%%%%%%%%&*==-;>>,''))))))',,>;--=**&&&*==-;>,'''',>;-=*&&&&&******&&&*====*&%$$$$$%%&*==**&&&&&&*=->,,,>>>>;-&%&->,,;*&&*=*&&=-;;----;>,')))))!~~!!',>;;>,'))))!~!),>;;;;;----;>,'''',>;;;>,')!{{{~)),>;;-;;>,'){]/(__::__((/^]]~!))',,,,,,')!~]^/(:<[|4es", +"m3!-==**&&%%%%%%%%&&*=--;>,'')))))))',>;;-==****==-;>,'''',,;-=*&&&&&******&***===*&%$$$$$%%&*==*&&&&&&*=;>,,,>>>>;=%%=;,,;=%%*=*%&=;;;----;>,'))))!!~!!',;;;>,))))!!!)'>>;;;;----;>,''',>;;;>,')!~~~!)',>;;;;;>,)!]^/(_____(/^^]{!))'',,,,,')!~]^/(:<[}|12237fs", +"n5],>;;--==**&&%%%%%%%%&*==-;>,'')!!!!))'',>;--======-;>,'''',,;-=**&&&**********==**&%$$$$%%&*==**&&&&&*=;,,,,>>>;-*%&->,;=&%*=&%&-;>;---;>,'))))!!~!)',;;>,'))))!!)',>>;;;----;>,',,>>;;;>,')!!!)),,>;;;;>,')~]^(((_(((/^]]~!))',,,,,')!~]^/_:<[}|1122222114er", +"o8(~))',,>>;;--==**&&%%%%%%&*==-;>,'))!!!!!))',>;;-====--;>,'''',,;-=**&&***********=*&%%$$$$%%&*==*&&&&&*=;>,,,>>>;=&%=;,>=&&*=&%&-;;----;>,)))))!!!)'>;;>,)))))!)',>>;;;---;;>,,,,>;;;>,'))!))',>>;;;;>')!]^/(((((/^^]{~!))'''''')!{]^(_:<[}|1111111||}}[<<|bq", +"o9:]{{~~!!))',,>;;--==**&&%%%%&&&*=-;>,'))!!~~!!)',,>;------;>,,''',,;-==***************&%%$$$%%&**=**&&&&*=;,,,,>>>-*%*;,>;**==&%*=;;---;>,'))))!!!)'>;;>,))))))),,>;;;---;>>,,,>;;;>>,'))))',>;;;;>,')~]^//((//^]]~!))'''''))!{]^(_:<[}||1111|||}[[<:__(/^^:9o", +"n7(~~~{{{{~~~!!)))',,>;;-==**&&&%&&&&*=-;;,'))!~~~!!))',>;-----;>,,''',,;-==*****==*******&%$$$$%%&*=***&&&*=;,,,,>>;=&&->,;=*==&&=--;--;;,'')))!!!),>;>,'))))))',>>;;;--;>>,>>;;;;>,,'))'',>>;;>,')!{]^////^^]{~!))'''))!~]]/(_:[[}||||||||}[[<:_(//^]]{!!))^6n", +"m4{,,,')))!!~~~~~~!!!))',,>;;--==*&&&&&&&*==-;>,')!~~~!!))',>;;---;;>,,'',>;-==***=====****&&%$$$$%&*****&&&*=;,',,>>-*&=;,;===*%&=;;---;>,)))!!~!),>;>,')))))',>>;;;-;;;>>>>;;;>>,'''',,>>>>,,)!~]^^^^^^]]~!!))))))!~]^/(:<[[}||||||}}[<::_(/^^]{~!))''',,,,]4m", +"l1'====-;;>,,''))!!!~~!!!!))',,>;;--=**&&&&&&**=-;>,'))!~!!!)),,>;;--;;>,,,,,>;--=========***&%%$$$$%&****&&&*=;,'',,;-**->;===&%%->;--;;,'))!~~!),>>>,)))))',,>;;;;;;;>>>;;;;>,,,,,,,>>>>,')!{]^^^^]]{~!)))))!!{]^/(:<[[}}||}}}[[<:_((/^]]~!!))'',,,,,,,,,,'^6n", +"k|>%%%%%&&**==--;>>,''))))!!!))))',,>;;--=***&&&&**==-;>,'))!!!))',>;;;-;;>>,,,,>;--========**&&%%$$$%%&****&&*=>,'',>;=*=;>;-*%$%=;;;-;>,'))!!)',>>,'))))',,>>;;;;;;>;;;;;>>,,,,,>>>,,')!~]]]]]]{~!!))))!!{]^/(:<[[}}}}}[[<::_(/^]]{!!))'',,,,,,,,'''))!~]]/[ap", +"k|>%$$$$$$$%%%%&&**==--;;>,,''')))))'',,,>;;--==**&&&**==-;;,,'')))'',>;;;;-;;>>,,>>;---======**&&%$$$$%&*****&*=;,,,>;-**;,>=&$#$&=--;;,''))!)'>>>,')))',,>>;;;;;;;;;;;;>>,,,,,,,,'))!{]]]]{{~!)))!!!{]^/(_:<[}}[[[[<:_(/^]]~!!))'',,,,,,'''')!!{]^^/(_:<[}|5fs", +"l1,*&%%%%%%%$$$$$%%%%%%&&*===--;;>,,,,'''',,,>>;;-==****&&**==-;>>,,'',,,>;;---;;;>>>>>;;--======*&&%$$$%%&***&&*-;>,>>;=*->;*$##$&=--;>'''))),>;>,'))'',>>;;;;;;;;;;;>>>,,,,,,'')!~{{{{{~!)))!!!~]^/(_:<<[[<<<:_(/^]]~!!))'',,,,,'''))!~{]^//(_:<[}|122344560iu", +"m3!;-===****&&&%%%%%%$$$%%%%%%%&**===--;;;>>>,,,>>>;;;--==******===-;;;>>>>;;;;-----;;>>>;;;---====*&%%$$$%&*****=-;>,,>-==--*$#$&=---;,'))))',>>,')'',,>;;;;;;;;;;;>>>,,,,,'))!!~~~~!!))))!~]^^/(_::::::__(/^]{!!)'',,,,,,'''))~{]^//(_:[}||12234455666666670iu", +"n5^',>>>;;;----===***&&&%%%%%%%%%%%%%%%&&**==---;;;;>>;;;;---===****====-----;----------;;;;;;-----==*&%%$$%%&****==;>,>;==--=%$%=-;-->'))))',,,,''',,>>;;;;;;;;;;>>>,,,''))!!!!!))))))!~]]^/(___((((/^]{~!))',,,,,,''))!~]]^/(_:[}}|1123445555555555444332225fs", +"o8(~)))))''',,,,>>;;;;---===***&&&%%%%%%%%%%%%%&&*===----;;;;;;-----======================---;;;;----==**&%%%%%&***==;>,>-=-;-*%&=---;,)!)),,,''''',,>;;;;;;;;;>>,,,'''))))))))))))!~{]]^////^^^]{~!))',,,,,'''))!{]^/(_:<[}}|122344444444444332211||}}}[[<:<|bq", +"o8(~!!!!!!!!!))))))))'',,,,>>;;;;--===***&&%%%%%%%%%%%%&**====---;;;-------=========*********==--;;;----==*&%%%%&&***=-;>;----*&&=--;,)!!)',,,''',>>;;;;;;;;;>,,,'''))))))''''))!!~]]]]]]]]~!)))'',''''')!~]]^/(_:<[[}||122222222222211|||}}[[<<::__((//^^^]^:9o", +"n5^)''''')))))))!!!!!!!!!)))))))))'',,,>>;;--===***&&%%%%%%%&&&**====--;;;;------====***&&&&&&&&*==-------==*&%%%%&***=----=--=**=-;>'!!)',,,'',,>;;;;;;;;>>,,,'''''''',,'')))!!!!~~~!)))))'''''))!{]^//((_:<[}}}||||||||||}}}[[[<<:::_(((//^^]]]{~~!!!))))')^6n", +"m3!;--;;;;;>>>,,,,''''))))))!!!~~~~~~~!!!!!)))'',,>>;;--====**&&&&&***==-----;;;;;;;;---==**&&&%%%&***=-----==**&%&&&*****=---===-;>>,)',,'',,,>;;;;;;;>,,,,'',,,,,,,,,'''))))))))))))))))!{]]^^^/(_:<<<<<<<[[[[[<<:::__(((//^^^]]]]{{~~!!!)))''''',,,,,,,,,'^5n", +"l2'=****======------;;;;;>>,,,'')))))!!!~~{{]]{{{~~!!!))))'',>>;---===========--;;;;;;;;;;---==*&&&%%%&***======**&&&**&%&=----==->,,,,,>,'',>;;;;;;>>>,,,,,,,>>>>,,,,''''''))))))!~~{]]]^/((___________((///^^^]]]]{{~~!!!)))))''''')'''''''''''')))))!!!!~]_9o", +"l2'=************===========----;;;;>>,,,,'')))!!!!~~~{{]]]]{~!!)))'''',,>;;---------;;;;;>>>>;;----=*&&&&&***======****&%&=--===*->',,,,>,,,>>;;>>>>>,>>>>;;>,,,,,,,''''))))!!!~{]]^^^^^^^^//^^^]]]]{{{~~!!)))))))))))))))))))))))!!~~{{]]]]^^^^^///(((__:::<1cr", +"m3!;----------==================---------;;;;;>>,,,,'')))!!!!)))!!!!!~~!))'',,,,>>>>;;;;;;;;;;;>>,>;--====*&&&**======*&&&*====**->',,,,>>>>>>>;>>>>>>>>>>;>>,'''''')))!!~~~{{{{]]]]]]{~~~!!!!!))))))))))))!!!!!!~~{]]]]^^^^///(((__::<<<[[[}}}}|||||111222237gt", +"n6^',,,,,,,,,>>>>>>>>>>;;;;;;;;;;;;;;;;;;;;;;;;;;;;>>>>>,,,,,,,,,,'')))))))'''',,,,,,,,>>>>>;;>>,,,>;;;;>;-=====-==**=***&&&**=*=->,>;;;>>>;>,,>;;>>>>,,,,>,,'))!))))!!!!!!!!!!!!!!!!!!!!!!!!!!~~{]]]^^///((((___:::<<[[[[}}}}}|||1112222333334444444444444459ht", +"o9:]{{{{{~~~~~~!!!!!!!!!!!)))))))))))))'''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>>>>>>>>,>>;;--;;>>;;;;;>;-=&*====&&&&*==-;'',;--;>;;>')',>>>,,''',,,,'))))))))))))))!!!~~{{{]]]]]]^^^//(((_:::<<[[}}}}}}}||||||||||11111111122222222222222222111111125fs", +"pa}_((((((/////////////^^^^^^^^^^^^^^^]]]]]]]]]]]]]{{{{{~~~~!!!!!!)))))))'''',,,,,,,,,,>>>>>>>>>;;;----;;;;>>>,,>-=**-;;-=*====-;,')'>;-;>>>'!~!)',,,,'',,>>,,,''''))))))!!!~{]]]]]^^^^^^////((((____::::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<::::::::::|bq", +"qb|:_____((((((((((((((((((((///////////^^^^^^^^^^^^^]]]]]]]]]{{{{~~~!!!!)))))'''',,,,,,,>>>>>;;;;;----;;;>>>>>;;-==-;>>>;;;;--;>,')),>;>,,)~]]{!)'',,,,,>>>>>>,,,,,'''')))))!!!!!!!!!!!~~~~~~~~~~{{{{{{{{]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]:9o", +"p0<^^^^^]]]]]]]]]]]]]]]]]]]]]{{{{{{{{~~~~~~!!!!!!!!!))))))))))))))))))''''''''',,,,,,,,,,,,,,>>>>>;;;;>>,,'',,>;---;,''',,;;;;;>,,,'',,,,'){^^]!'',,',,,,>>>>>>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,''''''''''''''''''''''''')^6n", +"n6^),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>>>;;;;>>>>>>>>>,,,,,,,,,,,,,,,''''''''''))))'''',,,,'))!!!!)'>--;>')'',;;;;;>>>>>,,,,,,,){/^~'>>,')))',,,>,,,''''''''''',,,,,,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>>>>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>,]4m", +"m3!;------------------------------------;;;;;;;;;;;;;;>>>>>,,,,,'''''')))))))!!!!!!!!!!!!!!!!!!!!!))'')!~!!))!),;-->,,,>;----;>;;;;>>;;;>>,)]{'>>,))!!!)',,,'')))))'''''',,,,,,,,,,,'''''''))))))))))))))))))!!!!!~~~~~{{{{{{{{{]]]]]]]]]]]]]{{{{~~~~!!!!!))!/7n", +"m2)-=========-------------;;;;;;;;>>>>>>,,,,,''''')))))))!!!!~~{{{~~~~~~~~~~~~~!!!!!!!!!!!!!!~~{{~!)'')))',>>,,>;--;>;;;---;;;>;--;;;----;;,)'>>,)!!)!!!)',')!!)))'''',,,,,,,,,,>>>>,,,,,,,'''''))))))!!!~~{{]]]^^///(((((_____::::::<<<<<<<<<<<<::::::____(_}ap", +"m3!;;;;;;;;;;>>>>>>,,,,,,,,'''))))))!!!!~~~{{{]]]]]]]]]]]]]]]]]]]{~!!))))))))))))))))!!!!~!!!!!!!!)'>>>>>;;-;;;;;;-;;;-----;-;>>;;;;;------;>;;>,'''))!!!)))!~!))))))))''''',,,,>>>>>;;;;;;;;;;>>>,,,,,'''))!!~~{]]^^///((___::<<<[[[}}}|||1111111111111||||14er", +"n5^'''''''))))))!!!!~~~~{{{]]]]]]^^^^^^^^^^^^^^^^^]]]{{~!!))))))))'',,,,''')))))!!~~~~~~~~!))',,,>;;-=---;;;;>>;;;-----;--;;-------;;;;;-==----;>>>,,,'))))!~~!!)))!))))))))))))'',,,,,,>>;;------------;;;;>>,,,'''))!!~{{]]^^//((__::<<[[}}}|||||11111122237gs", +"o8_]{{{]]]]]]]^^^^^^^^^/////////^^^^^^]]]]{{~!!!)))''',,,,>>>>,,,,,''''))!~{{{{{{{{~!!))',,>;;--=====--;;>,>>>;---===-;>>;;;--==**=-;>,,;=====---;;;>>>,,,')!!!!!~{{~~!!!))))))))))))))))'',,,,>>>;;;---------------;;;;>>,,,,'')))!~~{]]^^^//(((__:::<<[[[[}3dr", +"p0[(/////((((((////////^^^^]]]]{~~!!))''',,,,>>;;;;;;;>>>>>,,''))!~~{]]]]]]]]{!!))',,>;;--========-;;>,,>>>;;--=====-->,>;--;-=*&&=--;,,;-==**==---;;;;;>>>,''')!!!~{{]]]{{~~!!))))')))))))))))))))''',,,,,>>;;;;----------------;;;;>>>,,,''')))!!~~{]]]^^^([ap", +"pa}_((((////^^^^]]]{{~!!))''',,,,>>;;;;--;;;;;;;;>>,,''))!!~{]]^^^^^^^]{~!))',>>;;---====**===-;;>,,,,>>;;;--==**==-;;,>;==-;;-*&*=---;;;--==****=--;;;;;;;>>>,''''))!~{]]]^^^]]]{~!)))))'))))))!!!!!!!!!~!!!))))''',,,>>>;;;------------------;;;;;>>>,,,'')/7n", +"p0<^]]]{{~!!)))'',,,>>>;;;------------;;;>>,,''))!~{]]^^^^^^^^^^]{~!!)',>>;;---=====****==--;>,,,,,,>;;;;---=***=--;>>>;=*=->>-==*=--===-----=**&**=-------;;;;>>,,''')))!~{]]^^///^^^]]~!))))'''))))!!!~{{{]]]]]]]]]]{{~~!!)))'',,,>>;;------=========-----;!3m", +"n7/)',,,>>>;;;;--------------;;;;>>,,''))!~{]]^^////////^^]{~!)),,>;;;-----======**===--;>>,,,,,,>>;;-----=****=--;>>>;-=*=->;---==--==*==-----=*&&**==---;-----;;;>,,'''')))!!{]^^//((((/^^^]!))))''''')))!!~{]]]^^^^^///////^^^^^]]{~!))'',,>>;;-----=====-)2l", +"m4!;-----------------;;;>>,,,'))!!~{]]^^/((((((((/^^]{~!)',>>;;;--------===========-;;>,,,,,,,>;;;---;;-=*&&*=---;>>>>-=**=-;;;;;-=---=***=--;-==*&&&&*==-;;;------;;>>,,''')))))!!~]^//((_::_(//^]{!)))'''''')))!!~{]]^^//((((___:::__(((///^]]{!!))',,,>;;;!3m", +"m2)-====-----;;;>>,,''))!!{]]^^//(((_____((//^]]~!)',>>;;;------------========--;;>,,,,,,,>>>;;----;;-=*&&*=-----;>,>;==*=-;;;>>>-=-;;-=***=----==*&&&&&*==-----------;;;>,,''))))))))!~{]^((_::<<:_((/^]{!))''',,''')))!~{]]^^/((__:::::<<<<<:::__((//^]]{!~/7n", +"m3!;;;;;>>,,''))!~{]]^^//((_________((/^]]~!)',>;;;;----------------======--;;>,,,,,,,>>>;;;;---;;;-=*&%&*=-----;>,>;=**=->,,,,,>-==;;-==**=-------=*&&&&&*==-------------;;;>,'')))))))))!!{]^/(_::<[[<::_(/^]~!)''',,,,,''))!!~{]^^//((_::<<<<[[[[[[[<<::_:}ap", +"n5^)''))!!{]]^^//((__::::::::_((/^]{!))',>;;;;-----;;;;;;;;;;;---=====---;>,,,,,,,>>>;;;;;;--;;;;-=*&%%&=-----;;>,,;-***=;>,,,',;=&&-;;-=**=--------=*&&&&&&*==--------------;;;>,''))))))))'))!~{]^(_:<[[[[[<::_(/^]~))'',,,,,,,''))!!~]]^^/((__::<<[[[[[[[}3dr", +"o9_]]^^//((__::::::<:::_((/^]{!))',>;;;;----;;;;;>>>>>>>;;;---====--;;>,,,,,,,>>;;;;;;;;;;;;;;;;=*&%%&*=-----;;>,,>;=**=-;>;;>,,;*%&-;;;-=**=---------=*&&&&&&**==---------------;;>,,')!!!!!))'''))!~]^/(:<[[}}}}[[<:_/^]{!)'',,,,>,,,,''))!!~{]]^//((_:::<[2dr", +"pa}:_:::<<<<<<<::_((/^]{!))',>;;;;----;;;>>>,,,,,,,>>>;;---===--;;>>,,,,,,>>;;;;;;>>;;;;;;;>;;-*%%$%&=------;>>,,,;-*&*=;>,;-->,;*%%=;;;-==**=---------=*&&%%&&&**==-----==----------;;>,')!~~~!!))''''))!{]^(_:[[}}|||}[[<:(/^]{!)',,,,>>>,,,,'')))!~{]]^^/(}aq", +"rc2[<<<<::__(//^]~!)',,>;;;;;--;;;;>>,,,''''''',,>>;;---==---;>>,,''',,>;----;;>>>>;;;;;>>>;-*%%$%&*-;;----;>,,,,;-*&*=-;>,>;->>;*%%*->;;-=***=---------==*&&%%&&&&**==----====--;;------;>,')!~{{~!!))''''')!~]^/(:<[}}|||||}[[<_(/^]~!)',,,>>>>>>,,,'')))!{_9o", +"rc1<__(/^]]~!)',,>;;;-----;;;>>,,''))))))))'',>>;;------;;>>,,''',,>;;-----;>>,,>;;;;>>,>;-*&%$$%*=-;-----;>,,,>;-*&&*=;>,,>;-;>;=&%&->>;--=*&*=----------=*&&%%%&&&&**==----====--;;;------;;,')!~{]]{~!))',,,'')!{]^(_:[}}||111||}[[:_(^]{!)',,,>>>;>>>>>,'^6n", +"p0<^{~))',>>;;;-----;;;>>,,')))!!!!!!!)))',>;;-------;>>,'''''',>;--===-;>,,,,>>;;;>,,>;-*%%$$%&=-;;--=--;>,,,>;-=&&&*-;>,>;;;;>;=*&&->>;;-==*&*=----------=*&&&%%%&&&&**==---======--;;;;------;>,)!~{]]]{~!))',,,,'))~]^/(:<[}||11111||}[<:_/^]{!)',,>>>;;>{4m", +"n6^'>;;-------;;;>>,,''))!!~~{{{{~!!)',,>;;-----;;>>,'')))'',>;-====-;>,''',>>;;;>,,>;-*%%$$$%*-;;--==--;>,,,>;-=*&&*=->,,>;;;;>;==&&=;>>;--=*&&*=----------==*&&&%%%&&&&&**==--==***==-;;;;;--===-;;,')!{]]]]]~!)',,,,,,')!{]^(_:<[}|1122221||}[<:(/^]~!)',,]4m", +"m3!;-----;;;>,,''))!!~{{]]]]]{{!!)',>;;------;>>,'))))))',>;-=**==-;,'))',>>;;>,,,>;-*&%$$$%&=-;--===--;>,,,,>;=*&&&*-;>,,>;-;>>;-=&%*->>;;-==*&&=------------=**&&%%%%&&&&&**==--==****=--;;;;;--===--;>')!{]]^^]]~!)',,>,,,,')~]^/(:<[}||12222221|}}[:_(^]](8n", +"m3!;;;>>,,''))!~{]]]^^^]]]]~!)',>;;------;>>,'))!!!))',>;-=***=-;,')))',>;;;>,,,>;-*&%$$$$%*--;--====-;>,,,,>;-*&&&*=-;>,,>;-;>>;-=%%&->,>;--=*&&&=------------=**&&&%%%%&&*&&&**=====**&**=-;;;>;;--====-;>,)!{]^^^^]]~!)',,>>>,,')!{]^(_:<[}|1222233221|}[[|bq", +"m4]',''))!~{]]]^^^^^^]]{!)',>;;------;;>,'))!!!!!)',>;-=***=-;,')!!)',>;;>>,,,>;=*&%$$$$%&=-;--=====-;>,,,,>;-=&&&&*=;>>,>;--;>,;-=&%&=>,>;;-==*&&*=-------------=*&&&&%%%%&**&&&&*=====*&&&**=-;;>>;;--====--;,')~]^^/^^^]~!)',>>>>>,,))~]^/(_:[[}|1223333336fs", +"n7(~!~{]]]^^^^^^^^]{~)',>;;------;;>,'))!~{{~!!),>;-=***=-;,')!~!)',>;;>,,',>;=*&%$$$$$%*-;;-=====-;>,,,,,>;-=*&&&*=-;>>>>;--;>,;-=&%%=;,,;;--==*&&*=-------------=*&&&&%%%%%&**&&&&**====*&&&&*=--;>>>>;--====--;>')!]]^///^^]~!)',>>>>>,,')!{]^/(:<[}||22348gt", +"o9:^^^^^//^^^^]{!)),>;;------;;>,'))!~{]]{~!),>;-=***=-;>')~{~!)',>;;>,'',>;=*%%$$$$$%&=-;-======-;>,,,,,>;-=*&&&&*=;>>,,>;-;>,,>--*%%*-,,>;;--=**&&*--------------=**&*&&%%%%&&***&&&&*====*&&%&&*=-;>>>>>;--=====-;>,)!{]^////^^]~!),,>;;;>>,'))~{]^(_:<[}|5fs", +"p0[(///^^]]{!)',>;;--=----;>,'))!{]]]]]{!)'>;-=***=-;>')~]]{!),>;;>>,'',>;=*%%$$$$$$%*----======-;>,,,,,>;-=*&&&&&=-;>>,,>;;;>,,>;-=&%&->,,;;--==*&&&=---------------=*&***&%%%%&&***&&&&*====*&&%%&&*=-;>>>>>;--=====-;>,'!~]^/(((//^]~)',,>;;;;>,,')!~]^/(:|cr", +"p0[/^]]~!)',>;;--===--;>,,')!{]]^^^]]~)',;-=***==;>')~]]]{!',>;;>,,'',>;=*&%%$$$$$%&=-;-=**====-;,,,,,,>;;=*&&&&&*=->>>>>>;;;>>,>;-=&%&=;,,>;---==*&&&=-------=-------=*&&***&%$%%&****&%%&&*===**&%%%&&=--;>,,,>;--==*===-;,')~]^/(((((/^]~)',,>;;;;;>,'))!]:0p", +"o9:]!)',>;--====--;;>,')!~]]^^^^^]{!',;-=***=-;>')~]]]]~),>;;;>,''',>;=*%%%%$$$$$%*---==***===->,,,,,,>;;-=*&&&&&*-;>>>>>;--;>>,>;-=&%%=;,,>;-;--==*&%&=-------=-------=*&&***&%%$%%&****&&%&&*====*&%%%%&*=-;>,,,,>;--==*===-;>,)!{^^/(((((/^]~)',>;;;;;;>,'^7n", +"n6^,>;--====--;;>,')!~]]^////^]{!',;-==*==-;>,)~]^^]]!',;;;;>,''',>-=*&%%%$$$$$%&=---=******=->,,,,,>;;;-=*&%%&&*=-;>>>,>;--;;>>>;-=&%%*;,,,;;;;-==*&%%*=;;-----=--------=*&&***&%%$%%&*==*&%%%&**===*&%%%%%&*=-;>,,,,>;--==**==-;>,'!{]^/((((((/^]~)',>;;;;;~4m", +"m3!-=====--;>,'))~{]^//(//^^{!),;-=====-;>')~]^^^]~),>;;;;,,''',>-=*%%%%%$$$$$%*=--=*******=->,,,,,>;;;-=*&&%&&&*=;>>>>,>;--;;;>>;-=&%%*->,,>;-;;-==*&%&*-;;-----=---=----=*&&**=*&%$$$%*===*&%%%&&*===*&&%%$%%&*=-;>,,,,>;--==**==--;,')~]^/((___((/^]!)',>>~4m", +"l2)-=--;>,,')!{]^^/(((//^]!),;-=====-;>,)~]^^^^]!',;;;;>,'')',>-=*&%%%%%$$$$%&=--==*&*****=->>>,,,>;;;-=*&&%&&&*=-;>>>>>>;--;;;>>;-=*&%*-;,',;;;;-===*&%&=-;-----===--==----=&&&*==*%%$$%%*===*&%%%&&*====*&%%$$%%&==-;>,,,,>;--==***=--;>,)!{]^/(____((/^{!!^5n", +"m3!>;>,')!~]]^/(((((/^]!),;-=====-;>,)~]^///^{),>;--;>,'))',>-=&&%%%%%$$$$$%*=--=*&&*****=;>>>>,,>;-;-=**&%%%%&*=;>>>>>>;--;;;;>>-===&%&=;,',>;-;;-==*&%%&=-;---;-===---==---=*&&*===&%$$$%&*===*&%%%%&*====*&%%$$$%&*=-;>,,,,,>;--=****==-;>,')~]^/(_____((/<9o", +"n5^)))!{]^/((((((/^]!',;-=====-;>,)~]^/(/^]!',;--;;>,'))',>-=&&%%%%%%$$$$%&==-=*&&&***&*=;>>>>,,>;-;--=*&%%%%&&=-;>;;>>>;--;;;;>>;-==*&&=;,',>;-;;-===*&%%&=-;---;-===---==---=*&&&*==*&%$$$%&*===*&%%%%&*====*&%%$$$$%&*=-;>,''',>;-==****==-;>,')!{]^((__::|bq", +"o8(]]^^/((((((/]{!',;-=====-;>,)!]^/((/^{),>;--;;>,'))',>-=&&%%%%%%$$$$$%*===*&&&&***&*=;>>>>,,>;----=**&%%%%&*=->>;>>>>;--;;;;>>;--=*&&=->,',;;-;;-===&&%%&=-;---;-===---==----*&%&*===*&$$#$%&==-=*&%%%%&*====**&%$$$$%%&*=-;,,''',>;-==*****=--;>,)!{]^/(:|bq", +"o0[((((__((/]{!'>;-=====-;>,)!]^/(((/]!',;---;>,')))',;-=&&%&&&&%%$$$$%&====*&%&&**&&*-;,>>>,,,;----=**&%%%%%&*=;>;;>>,>;--;>;;>>;---*&&*-;,',>;-;;;===*&&%&*=;;---;;-==---===---=&%%&*===*%$##$%*=--=*&&%%%&*=====*&%%$$$$%%*=-;>,,''',>;-==*****==-;>,')!{^<0p", +"qb}:__(/^]~)'>;-=====-;>,)!]^/(((/^{),>----;>,')))',;-=&&%&&&&&%$$#$$%*===*&%%&**&&&*->,>;>,,,;----=**&%%&%%%*=->>;;;>,>;--;>;>>>;---*&&*-;,''>;--;;-===*&%%&*-;;--;;;-==---===---=*&%&*=--=&%$##$%*=--==*&%%%&*=====*&%%$$$$$%&*=-;>,'''',>;-==*****==-;;,')(8o", +"qb}_/^]~),>;-=====-;>,)!{^/(_((/]!',;----;>,')))',;-=&&%&&&&&%%$$$$%&*===&%%%&**&&&*->,>;;,,,;----=***&%%%%%&*=;>;;;;>,;---;>;>,>;---*&&*=;>'',;;-;;;====&&%%&*-;;--;>;-==---=*==---*&%%&*=-=*&$###$&*=--==*&%%%&*======*&%$$$$$$%&*=-;>,'''',>;-==**&&**=-->]5n", +"p0<]~),>;-=====-;>,'!{^/(__((^{),>-----;>,')))',;-=&&&&&**&&%$$#$%%*===*&%%%&**&%&*->,>;;,',;----=***&%%%%%%&*->>;;;;>,;---;>;>,>;;--=***=;>,',>;;-;>-===*&%%%&=;>;--;>;-===--=**=---=&%%%*=--=*%$##$%&=----=*&%%%&*===-==*&%$$$$$$%%&*=-;,,'''',>;-==*&&&**-)3m", +"n7^';-======-;>,'!{]/(___(/]!'>;-==-;>,'))))',;-=&&&&&***&%$$#$$%&*==*&%%%&&*&&%&*;>,>;;,',;-=--=****&%%%%%&*=;>;;;;;,>;--;;;;>,>>;--=***=->,'',;;-;>;-===*&%&%&=;>;--;>;-===--=**==--=*%%%&*=--=&%$##$%*=-;--=*&%%&&*===-==*&%%$$$$$$%%*=-;>,''''',>;-==*&&*,1l", +"m3!-==*==--;,')~]^(____(^{),;-==--;>,'))))',;-=&&&&*****&%$##$%%*==*&%%%%&&*&%%&=;,,>;;,',;==--=**=*&%%&%%%&*-;>;-;;>,>;--;;;;>,>>;--=***=->,'',>;;-;>;====&&&&&&=;>;--;>>-===---=**=---=&%%%*=---*&$###$%*--;;-=*&%%&&*==---==*&%$$$#$$$%&*=-;>,'')'',>;-===,1l", +"l2'===--;,')~]^(__:_(/]!'>;-===-;>,'))))',;-=&&&&**==*&%$$#$$%&*==*&%%%%&*&&%%%=;,,>;;,',;===-=****&%%&%%%%&=->;--;;>,>;--;>;;,,,>;--=**==-;>,)'>;;-;>>-====&%&&%&=;;---;,>-=*=---=**=---=&%%%&*---=*%$###$&=-;;;-=*&%%&&*==---==*&%%$$##$$%%&*=-;,,')))',>;;)2l", +"l2)--;>,)!]^/(_::_(^{),;-===--;>,')!!)',;-=&&&**====*&%$##$%%**=*&%%%%%&&&%%%&=;,,;-;,',;===-=***=*%%%%%$%&*=;>;--;;,,;;--;>;;,,,>;--=====-;>,'',>;;-;,;====*&%&&%*-;;--->,>-=*=---=&&*=--=*%$$%*=---=&%####$&=-;;;-=*&%%&&*==----=*&&%$$###$$%%&=-;>,'')))'']4m", +"m4{,,)!{^/(_:::(/]!'>;-===-;;,'))!!)',;-=*&&**====*&%$$##$%&*=**%%$%%&&&&%%%&=;,,;-;>'';=*===***=*&%%%%$$%&*->>----;,,;;;-;>;;,,,,>---====-;>,'),>;;-;,,-====&%&&&%*->;--->,>-=*=---=&&*=---=&%$%&*=---*%$####%*=;;;;-=*&%%&&*==----==*&%$$###$$$%&*=-;>,'))!/7n", +"n6/~{]/(_:::_(^{),;-====-;>,'))!!)',;-=*&&*======*&%$##$%&****&%$$%%&&&&%$%&->,,;-;>'';=**===**==&%%%%%$%%&=;>;---->,,;;;-;>;;,,,,>---===-=;>,,)'>;;;->,>=*=-*&%&&%&*->;--->,>-=*=---=*&&*=--=*%$$%&=---=*%$###$%*-;>>;-=*&%%&**==-----=*&%$$####$$$%&*=-;>,)/7n", +"o9:/(_::::_/]!'>;-===--;>,'))!!)',;-=*&&*==---==&%$##$$%&*=**&%$$%%&&&%%$%&->,,;-->''>=**===&*==*%%%%%$$%&*->>----->,>;;--;>;;,',,>---==---;>,,)),;;;-;,,;====*%%&&%&=;>;--;,,,-=**---=*&&*=--=*&$$%%*=---=&$####$&=-;>>;-=*&&&&**==-----=*&%%$$####$$%%&==->]5n", +"pa|::::_(^{),;-====--;>,')!!!)',;-=*&**==----=*%$$#$$%&**=*&%$$$%%&&&%$$%*-,,,;-->''>=**===&&*==&%%%%$$$%&=;>;----;,,;;;;->>;;,',,,;--==---->,,'),;;;-->,>-*=-=&%&&&%&=;>;--;,',;=**=---*%%&=---=&%$$%&=---=*%$#@##$&=;>>>;-=*&%&&**=------==*&%$$#####$$%&*-)3m", +"qc1<:_/]!'>;=====-;>,'))!!!)'>;-=*&**==----=*&%$##$%%**==*&%$$%%&&&%%$$%*-,,,;-->''>=&&*==*&*==&%%%%%$$%%&->>-=---;,,;;;-->>;;,',',;--==-;-->,,,)'>;>;-;,,;=*=-*%%&*&%&=;>;--;,',;=&*=-;-*%%&*=--=*%$$$%*=---=&%##@#$%*=;>,>;-=*&%&&*==------==*&%$$#####$$%&,1l", +"qb|_^{),;-=====-;>,'))!!!)'>;-=****=------=*%$##$$%&*==*&%$$$%%&&&%$$$%*;,,>-=->''>-&&*==*&*==*%%%%%$$$%&*;>;-=--->,,;;;-->>;;,','';--==-;--;,,,)),;;>-->',-*=-=*%%&*&%&->>;--;,',;=&*=-;-*&%%&=--=*&$$$%&*----*&$#@@#$%*-;,,>;-=*&&&&*==-------=*&&%$$#####%;|k", +"p0:~'>;-====--;>,')!!!!)'>;-=****=--;;;-=*&$$##$%&*===*&%$$$%%&&&%$$$%*;,,>-=->,'>-&%&==*&&=-=&%%%%$$$$%&=>>;==--->,>;;;-->>-;'',''>--=*=;;-;,,,'),;;>;-;,';=*=-=&%&**&%*->>;--;,',;=&&=---=&%%&*=--=&%$$$%*=---=*%$#@@#$&=->,,,;-=*&%&&*==-------==*&%$$###$-}k", +"n6]>-=====-;;,,')!!!!)'>;-=***==--;;;;-=&%$##$$%&*==*&%$$$$%&&&%%$$$%=;,,;-=-;,'>-&%&*=*&&*-=&%$%&%$#$%%*->>-=--=;,,>;;;-->>-;'',''>--===;;-;,,,,)'>;>>-->',-**--*%%&**%%*->>;--;,',;=&&=-;-=&%%%*=--=*%$$$%&*----=&$#@@@#$&=;>,,,;-=*&%&&*==-------==*&%%$$$-}k", +"m3)-====-;>,,')!!!!)'>;-=***==-;;;;;-=*%$###$%&*===*&%$$$%%&&&%%$#$%=;,,;-=-;,'>-&%&*=*&%*=-*%$%%%$##$%&=;>;==-==;,,;;;;-->>-;'',))>---==;>;;,',,)),;;>;-;,'>=*=--*%%&*&%%*;>>;-->')';=&&*-;-=&%%%&==-=*%$$$$%*=---=*%$#@@##%*-;,,,,>-=*&%&&*==--------=*&&%%;}k", +"l2'==--;>,'))!!!!)'>;==***==-;;;>;;-=&%$##$$%*====*%%$$$%%&&&%$$#$%=>,,;===;,'>-&%%***&%*=-=&$$%%%##$$%&->>-==-=->',;;>;-->;->'',)),---==;,;->',,')';;>>-->'';**=-=&%%**&%%*;,>;-->')';=&&*-;;-*%$%%*===*&%$#$%&*=---=&%##@@#$%*->,'',;-=*&%&&*==--------==**,|k", +"l2);;;>,'))!!!!),>;==***==-;;>>>;-=*%$###$%&*====&%$$$$%&&&&%$##$&=>,,;=*=;,',-&%%&**&%&=--*%$%%%$##$%%=;,;=====-,'>;;>;-;>;->)',)),---==;,>;;'','))>;>,;--,),=**--*%%&**&%%=;,>--->')';=&&*=-;-*%$$%&====&%$##$%&=---=*%$#@@@#$%=->,'',;-=*&%&&**==-------=-'2l", +"m4~,>,'))!!!!),>;==***==-;;>>>>;-*&$###$%&*=--=*&%$$$%%&&&%%$##$&->,,;=*=;,',-&%%&**&%&=--*%$$%%$###$%&->>-*====;,'>;>>--;,;->)),)),---==;,>;;,',,)),;;>>-->'';*&=--&%%&=*%%&=>,>-=->')';=&&*=-;-*%$$%&*===*%$$#$$%*=---=&%$#@@@#$&=;,''',;-=*&%&&**==------;)2m", +"n5])')!!!!)),>-=****==-;;>>>>;-=&%$###$%&==--=*%$$$$%%&&&%%$##$&-,,,-**=;,',-&$$%**&%%*--=&$$%%%$##$$%*;,;=*====;',;;>>--;,>;,)),)),---==-,,;;,),,')';;>,;--,),-&*--=%%%*=*%%&->,>-=->))'>=&%&=-;-=%$$$%*===*&%$##$%&==--=*&$#@@@##%&=;,')',;-=&&%%&**==----;!3m", +"n7/!!!~!!),>-=****==-;>>,,>>;=*%$###$%&*=--=*&%$$$$%&&&&%$$##$*-,',-**=;,',-&$$%&*&%%&-;-*$$%%%$###$%&=>,-=*==*=>',;;>>-->,>;,)),)!,---=*-,'>;,)','))>-;,>--;))>=&=--*%$%*=&%%&->,;-=->)))>=&%&=-;-=&$$$%&*===&%$##$$%*=---=&%$#@@@#$%*->,')',>-=&&%%&**==--;!3m", +"o8({~!)),>-=****==-;>>,,,>;-*&$###$$%*=---=*%$$#$$%&&&&%$###%*;,,>-*&=;,',-&$$%&*&%%&=--=%$$%%%#@#$$%*;,>=*===*-,'>;;,;==>,;-,!),)!,-=-=*-,),;>'),,)),;;>,;=-,)'-&&=--&%%&==&%%&->,;-=-,)!)>=&%&=-;-=&$$$$%*===*%$###$%&*=--=*&$##@@@#$%*->,))',;-=&&%%&**==-!3m", +"o9_{!),>-=****==-;;>,,,>;-=&%$###$%&=----=&%$##$%%&&&&%$###%*;,,>-*&=;,',;*$$$&*&%%%=-;=%$$%%%$#@#$$%=>,;=*==*=;,'>;>,;=->,;-,!),)!'-=-=*=,),;;'),,')';->,>-->))>=&*--=%$%*==&$%*;,,;-=;,)!)>=&%&*-;;=&%$$$%&*==*&$$##$$%&==--=*%$#@@@@#$&=->'))',;-=&&%%&&*-)2m", +"o8(),;-=**&*==-;>>,,,,>;=*%$###$%&*=-;--=&$$#$$%%&&&%%$###%=;,,>=*&=;,',;*$$$%&&%$%*-;-&$$$%%$#@##$%&-,>-**==*=;',;;>,;=->,;-,!),)!'-=--==>)';;,)',,))>-;,,;--,)'-&&=--*%$%*=*%$%*;,>;==;,)!)>=&%%*=-;-*%$#$%&**=*&%$###$%&*=--==&%##@@@@#$&=;,'))',;-=&%%%&*'2l", +"n6]>-=**&*==-;>>,,,,>;-*%$####$%*=-;;-=*%$##$$%&&&&%$$##$%=;,,;=&&*-,',;*$$$%&&%$%&-;-*%$$%%%$@@#$$%=;,;=**=**=>',;;,,;=->>--'!),)!);---==;))>;,)),,)),;->,>-->)),=&&=-=&$$&==*%$%=;,>;==;,)!)>=&%%*=-;-*%$#$$%&***&%$####$%&*=--=*%$#@@@@##%*=;,'))',;-=&%%&,1l", +"m3!-**&*==-;>>,,,,,;-=&%$###$%&*-;;;-=&%$##$%%&*&&%$###$%=;,,;=&&*-,',;*$#$%&&&%%&=;;=%$$$%%$#@@#$$&-,,-**==**-,'>-;,,-=->>--'~),)~);---==;)!,;>)),>'!);-;,,;=-,));&%*--=%$%&==&%$%=;,>-==;,)!),=&%%&=---=%$##$%&&**&%$####$%%*==-==&%$#@@@@#$%*->,)))',;-=&*,|k", +"l2'=&*==-;;>,,,,,>;=*%$####$%*=-;;;-*%$###$%%&**&%$###$%=;,,;=&&*-,'';*%##$&&&%$%=-;-&$#$%%%#@@##$%*;,>=**==**;'';-;,>-=-,>--'~),)~)>---=*-'!';>)!'>,)),-;,'>-=;)!,=&&=--*%$%*-=&$$&->,>-==;,)!),=&%%&=---=&$##$$%&**&%%$####$%&*====*&$#@@@@@#$%*->')))',;-=,1l", +"l1,=*=-;;>,,,,,>;-*%$####$%&=-;;;;=*%$##$$%&&**&%$###$&=;,>-*&&*-,''>=%##$%&&%$%*-;;*%#$%%%$@@@#$$&->,;*&*=*&=>',;->,>==;,>--'~),)~!>---=*-'!)>;'!),,)!';->',;=-,!);*%*-;-&$$%=-=%$$&->,>-==;,)!),=&%%&*---=&$###$%&&**&%$####$%%*=====&%$#@@@@@#$&=->')))',>!2l", +"l2'--;;>,,,,,,;-=&$####$$&*=;;>;-=&$###$$%&**&%%$#@#$&=>,>-*%%*->''>=%##$%&&%$$&-;;=%##$%%$#@@##$%*;,>-&*==*&-,',-->,;==;,>--){),){~,---=*-,!)>;,!),>'!)>-;,'>-=;)!'-&&=--=%$$&=-*%$$&->,;-==;,)!),=&$%%*---=&$###$$%&&&&%$#####$%&*====*&%$#@@@@##%&=;,'))))^5m", +"m3!;;>,,,',,>;=*%$####$%&=-;>>;-*%$###$%&&**&%$##@#$&->,>-*%%*->''>=%##$%&&%$$%=;;-&$#$%%%#@+@#$$%=>,;=&*==**-,'>-;,,;*=;,>-;){),){~,---=*=,!!,;>)!'>,)!,-->',;=-,!)>*%&=;-*%$%*--*%$%*;>,;-==;,)!),=&$$%*=--=*%####$%&&&&%$#####$$%&*====*%$#@@@@@#$%*=;,')!(7n", +"m4{,,,,'',>;-*%$####$%&*-;>>>;=&$####$%&***&%$##@#$&->,>-&%%*->''>=%###%&&%$$%*-;-*$##$%%$#++@#$$*;,,-*&==*&*;'';-;,,;*=>,;=-){),)]{,---=*=>!~';>)!'>,)!';-;,'>-=;)!'-&%*-;=&$$%=-=&$$%*;,>;===;,)!),-&$$%*=--=*%$###$$%&&&%$$##@##$%&*====*&%$#@@+@@#$%*-;,)(8o", +"n5]','',,;-=&$#####$%*=-;>>;-*%$####$%&***&%$#@@#$&->>;=&%%*->''>=%###$%&%$$%*-;;=%##$%%$#@+@#$$%=>,>=&&==*&=>',;-;,,-*=>,;=;){),)]]'----*=;!{);;'!),>'!)>--,)';=-,!!>*%&=--=%$$&=-=&$$%=;,>;===;,)!),-&$$%&=---*%$###$$%%&&%%$##@@#$$%&*====*&%##@++@@#$%*->^6n", +"n5^)',,>;=&%$####$%&=-;>,>;=&%####$$%**=*&%$#@@#$*-;>;=&%%*->,'>=%###$%&%$$$&=;;-&$##$%%$@++@#$$&-,,;*&*==*&-,',-->,,-*=>,;=;){),)]]'----**;){)>;,!!,>,!!,--;''>-=;)~)-&%*-;-*%$$*--=%$$%=;,>-===;,)!),-&$$%&=---*%$#@##$$%%%%%$##@@##$%&*=====*%$#@@++@##$&=!4m", +"n6^),>;=*%$####$$%*=;>,,>-=&$####$%&*==*&$##@@#%*-;>;=&%%*->,'>=%###$%&%$$$%=;;-*$##$%%$#++@#$$%=;,>-&&==*&*-,'>-->,>=&=>,-=;)~),']]'-=--**-'{!,;,)~'>>)!);-;,)';=-,!!,=%%*-;-&$$%*--*%$$&=>,>-===;,)!),-&$$%&*=--=&$####$$%%%%%$##@@@#$$%&*====*&%$#@+++@##%,1l", +"n6^,;-*%$#####$%&=-;>,>;-*%$###$$%&*==*%$#@@@#%*-;;-*%%%*->,'>-%###$%&&%$$%*-;;=%##$$%$#@++@#$$&-,,;*&*==*&*;'';--,';*&->,-=;)~)>'{]'-=--=*-'{{';>)~)>>'!!,-->))>-=;)~);&%&=;-=%$$%=--*$#$&->,>-=*=;,)!),-&$$$%*=--=&$##@##$$%%%%$$#@@@##$%%&*====*&$##@++@@$;|k", +"n5{;=&%#####$%%*=;>,,>;=&$####$$%*==*&%$#@@@#%*-;;-*%$%*->,'>-&#@##%%&%$$$&-;;-%###$%%$@++@##$%*;,,-&&*==*&=>',;=;,,;**->>-=;)~'>'{]'-=--=*=,{]);;'~!,;,!!';=;')';=-,!!,=%%*-;-*$$$&-;=&$#$&->,;-**=;,)!),-&$$$%*=--=&%#@@@##$%%%%$$#@@@@#$$%&*=====&%$#@@++#-}k", +"m3)=%$#####$%&=->,,,;-*%$####$%&*==*&%$#@@@#%*-;;-*%$%&=;,,>-&$###$%&%$$$&=;>-*$##$%%$#+++@#$$&->,>=&&=-=&&-,',-=;,,-**-,>=*;)~'>'{])-=--=*=>~])>;,!~';>)!)>--,))>==;)~);&%%=-;=&$$%*--=%$#$*->>;=**=;,)!),-&$$$%&==-=&%#@@@##$$%%%$$##@@@##$%%&*====*&%$#@+@=[j", +"l1>%##@##$%&*-;>,,>;=&$##@##$%&====&$#@@@@#%*-;;=&%$%&=;,,>-&$#@#$%&%$#$%=;>;=$###$%$#@++@##$$*;,,;*&*=-*&*;,'>-=;,,-&*;,;=*;)~'>,{])-=---*=;!]!>;,!~)>;'!!,-->))'-=-,!!,=%$&=;-=%$$%=--=%##%*->>;=**=;,)!),-&$$$%&*===*%$#@@###$$%%%$##@@@@#$$%&*=====*%$###=[j", +"k};$###$$%*=->,,,>-=%$####$$%*===*&$#@@@@#%*-;-=&%$%&=;,,>-&$@@#$%&%$#$%*-;;=%#@#$$%$#+++@#$$%=>',-&&=-=*&*;'';=->,,=&*;,;=*;)!'>,~]);=-;-**;)]{,;>){)>;,!!';=-,))>==;'!);&$%*-;-*$$$&=;-*$#$%=;>>;=**=;,))),-&$$$%&*===*%$#@@@##$$%%%$$#@@@@##$%%&*====*&%$$-[j", +"k}-###$%&=-;>,,,;=&%##@##$%&*===*%$#@@@@$%*-;-=&$$%&=;,,>-&$@@#$%&%$##$&-;>-&$@##$%$#@++@##$$&-,';=&&=-=&&=>',-=->,>=&*;,;**;)!'>,~]!;=-;-**-)]]';;'~!,;>)!)>=->)!,-=-,)!'-%$%=;;=&$#$*-;-&$#$%=;>>-=**=;,)))>-&$$$%&*===*%$#@@@###$$%%$$##@@@@#$$%&**====*&%;}k", +"k}-$$$%*=;>,,,>-=%$#@@##$%&====*%$#@+@@$%*---*%$$%&=;,,>-&$@@#$%%%$##$&=;;;*$#@#$$$#@+++##$$%=>',-&&*--=&&-,',-=-,,;*&=;,;**;)!,;,~]!;=-;-=*-']]);;,!~';;'!!,-=;'!)>==;'!)>*$%&-;;=%$$%=;;=&$#$&=;>>-*&*=;,)))>-&$$$$%*===*%$#@@@@##$$$$$$##@@@@##$%%&*======,|k", +"k};%%&=-;,,,,;-*%$#@@##$%*=--=&%#@@+@#$%*--=*%$$%&=;>,>-&$@@##%%%%$#$%*-;;=%#@##$$$#+++@#$$$&-,'>=&&=--*&*;,'>==;,,;*&=>,-**;)!,;,~]!>=---=*=,{^!>->!{)>;,)!';=-,)!,-=-,)!'-%$%*-;-*$$$&=;;=%$#$&-;>;-*&*=;,')'>-&$$$$%&*==*&$#@@@@###$$$$$##@@@@@#$$%&&*===-)2l", +"k|>**=;>,,,>-=&$##@##$%&*=-==&$#@@+@#$%*=-=*%$$%&=;>,>-*$#@@#$%&%$##%*-;;-&#@@#$$$#@+++##$$%=;'';*&*---*&=;'';==;,,-&&=>,-**;)!,;,!]~>==--=*=>~^~,->){!,;>)~!,-=;)!)>==;'!)>*$$&=;;=&$#$&-;-*%##$*->>;=*&*=;,')'>-&$#$$%&*==*&%#@@@@@##$$$$$$##@@@@##$%%&*==-)3m", +"l1'--;,,,,;-*%$#@@##$%&=--=*%$#@++@#$%*===&%$$%&=;>,>-*$#@@#$%&%$##$&=;;-*$@@##$$#@+++@#$$$&-,',-&&=-;=&&=>',-*=;,,-&&=>>-&*;)!,;>!]~>==-;=*=;!^]';;'~~,;;'!!'-=-,!!,-=->)!'-%$%*-;-=%$$%*-;-&$##%*->>;=&&*=;,')'>=&$##$%&*==*&%#@@+@@###$$$$$##@@@@@#$$%&&*-)3m", +"l2!>>,',>;=&$##@@##$%*=--=*%$#@++@#$%*==*&%$$%&=->,>-*$#@@#$%%%$##$%=-;;=%#@@#$$$#++++##$$%*;,'>=&&=;-=&&-,',-*->,>=&&->>=&*;)!,;>!]{,==-;-**;)]]);;,!{);;,)~);=->)~);==;'!!>*$$%=;;-*$$$%=;;=&$#$%*->>-=&&*=;,')'>=&$##$%&**=*&%$@@++@@###$$$$##@@@@@##$%%&='2m", +"m4]',,,;-*%$#@@##$%&*=--=*%#@+++@#$%*==*%$$$%&=->,>-*$#@@#$%%%$###%*-;;=%#@@##$$#@+.+@#$$$%=>',-*&*-;-*&*-,';=*->,;=&&->;=&*;)),;>!]{,==-;-**-']^);->!{)>->)~!,-=;'~!,-=->)!'-&$$&=;;=&$#$&=;;=%$#$%=->;-*&&*=;>'',>=&$##$%%&*=*&%$#@++@@###$$$$$##@@@@##$$%*,2l", +"n5^',>;=&$##@@##$%&=---=&%#@+++@#$%*==*%$$$%&=->,>-*$#@@#$%%%$###%*-;;-&$@@@#$$#@+..+##$$$*;,',=&&=;;-&&=;,,;=*->,;*%*->;=&*>)),->)]],==-;-=*=,]^~>-;){!,-;,!~';=-,!~);==;'!!,=%$%*-;-*%$$%*-;;=%##$%=;>;-*&%*=;>,',>=&$##$$%&***&%$#@+++@@###$$$$##@@@@@##$%>1l", +"n6^'>-*%$#@@@##$%*=---=&$#@+++@#$%*=*&%$$$%&=->,>;*%#@@#$%%%%$##$&=;;-*$@@@##$##++.+@#$$$%=>'';*%&-;;=&&=>',-**-,,-&%*->;*&*>))>-;)]],==-;-=*=,{^{,-;'~~';-,)~)>==;)~!,-=->)!);&$$%=;;-&$$$%=;;-*$##$&=;>;-*%%&=->,',;=&$##$$%&***&%$#@+++@@###$$$$###@@@@@#$;|k", +"n5]>=&$##@@##$%&*=--=*%$#@+++@#$%***&%$$$%&=->,>;*%#@@##$%%%$##$%*-;;=%#@@@#$$#@+..+#$$$$&-,),-&%*->;=&&->'>=*=;,,-&%*->-*%*>))>-;)]]'==-;;=*=>~^]';-,!{);->)~!,-=-,!{);==;'!),=%$$&-;;=%$#$&=;;-&$##$&=;>;=&%%&=->,',;=&$##$$%&&**&%$#@+++@@@###$$$$##@@@@@$-}k", +"m4!=%$#@@@##$%&=---=*%$@@+++@#$%&**&%$#$%&=-;>>;*%#@@##$%%%$###%*-;;-&#@+@##$#@++.+@#$$$%=;''>=%&=;>-*%*-,,;=*=;,>=%%*;>-*%*>))>-;)]]'-*-;;-*=;!^^);->){!>-;,!~);=->){!,-=->)!);&$$%*-;-*%$$%*-;;=%$##$&-;;;=&%%&=->,,,;=&$##$$%%&**&%$#@++++@@###$$$$##@@@@#-}k", +"l2,%##@@##$$%*=---=&%#@++++@#$%&*&%$##$%&=-;>>-*%#@@@#$%&%$###$&=-;-*$@+@#####++..+#$$$$&-,)';*%*->>-&%*;,,;*&=;,>=%%=;;-&%=>))>-;)]]'-*=;;-**;)^^!>-;){~,-->)~!,-=;'~{);==;,)),=%$$&=;;-&$$$%*-;;=%###%*-;;-=&%%&=-;,,,;=&$##$$%%&***&%#@@+++@@###$$$$$##@@#=[j", +"k|;$@@@##$%&*----=&$#@++++@#$%&&&%$##$%&=-;>>;=%#@@@#$%%%$###$&=-;-=%#++@####@+..+@#$$$%*;'),=&&=;>;=&&=>,,-*&=>,;*%%=;;=&%=>))>-;)]^)-*=;;-**-']^{,-;'~{';-;'~~'-=-,!{!,-=->'!);&$$%*-;;=%$#$&=;;-*$##$%*-;;-*%%%&=-;,,,;=&$###$%%&**&&%$#@+++@@@###$$$$##@#=[j", +"k}-#@@##$%*=----*%$#@++++@#$%&&&%$##$%&*-;>>-=%#@@@#$%&%%###$%*-;;=%#++@@###@+...+#$$#$&->)';*%&->,;*%&->,>=&*->,;*%&=;;=%%=>));-;']^)-*=;;-=*=,{^],--,!{);-;,!~);==;){{);==;,)),=%$$%=;;-*%$$$&-;;-&$##$%*-;;-*%%%&=-;>,>;=&$###$%%&&**&%$#@++++@@###$$$$###-[j", +"k[-#@#$$%*=-;-=*%#@+++++@#$%&&%%$##$%&*-;>>-=%#@@@#$%%&%$###%&=;;-&$@++@###@++..+@#$$$%*;')'-&%*-,,-*%*-,,;=&*->,-&%&=;;=%%=>)';=-']^)-*=;;;=&=>~^]'-->){!,-->)~!,-=-,!]~,-=->')';*$#$&=;;-&$#$%*-;;=&$##$%=-;;=*%$%&*-;>,>;=&$###$$%&&*&&%$#@++++@@###$$$$$$-}k", +"j[-$#$%&*----=&%#@+++++@#$%%%%$$##$%&*-;;;-=%#@@@#$%%&%$#@#$&=-;-*$@++@@###@+...@#$$#$%=>')>=%&=;,>-&%*;,,;*&*;>>-&%&-;-*%%=>)';=-']^!;*=-;;=*=>!^^);-;){~'-=;'~~';=->)]]);==;,)),-%$$%*-;;=%$$$%=;>;=%###$&=-;;=&%$%&*-;>>>;=&$###$$%%&&&&%$#@++++@@@###$$$$;}k", +"k}-$$%&=----=&$#@+++++@#$%%%%$###$%&*=;;;-=%#@@@#$%%&%$#@#$%*-;-=%#+++@###@+...+@$$$$$&-,)';*%&->,>=%%=;,,-&&=;>>=%%*-;-*%%=>)';=-,{^!;*=-;;-**;)^^!>-;'~{);=-,!~)>==;'~]~,-=->')';*$#$%=;;-*%$$$&=;;-*%###$&=-;-=&%$%&*=;;>>-=&$###$$%%&&&&%$#@@++++@@###$$%;}k", +"k};%%*=-;--*%$#@+++++@#$%%%%$###$%&*=;;;-=%#@@@#$$%%%$#@@#%*=--=&#@++@@##@++..+@#$$#$%=>'),-&%=;,,;*%&=>,>=&&=;>;=%%*-;-*%%=>)';=-,{^!;*=-;;-**-']^{,--,!]!>=->)~!,-=-,!]]);==;,)),-%$#$&-;;-&$$$%*-;;-&$##$%&=-;-*%$$%&*=-;>;-=&$###$$%%&&&&%$#@@++++@@###$%;|k", +"k|>*=--;-=*%$@++++++@#$%%%$$###$%&*=;;;-=%#@@@#$$%%%$#@@#$&=---*$@+++@##@@+. .+#$$$#$&-,))>*%&=>',-&%*-,,;=%&=;>;*%%*-;-&%%=,)';=-,~^!;=*-;;-**-,]/],-->){~,-=;'~~);==;){]!,==->')';*$#$%=-;;=%$$$%=-;;=&$##$%*=;;-*%$$$&*=-;>;-=&$###$$%%&&&&%$$#@++++@@###$;|k", +"l1'---;-=&%#@+++++@@#$%%%$$###$%&*=-;;-=%$@@@##$%%%%#@@#$&=---*%#+++@@##@+. +@#$$#$%=;')'-&%*-,',=%%*;,,;*%&-;>-&%%*-;=&$%=,)';=-,~]~>=*-;>-=*=,{^^)--;){{'-=-,!~!>-=;,~]]);==;,)),-%$#$&=;;-*%$$$&=;;;=%###$%*=--=*%$$$%*=-;;;-=%$###$$$%%&&&%%$#@++++@@@#$;}k", +"l2);;;-=&$#@+++++@@#$$%%$$###$%&*=-;;-=%$@@@##$%%%%$#@#$%*---=%#+++@@##@++. .+#$$$#$&-,)),=%&=;''>*%%=;,>-&%*->>-&%&=--=%$%=,),-==>~]~>=*-;>;=*=>!^^!;=;'~{);=->)~~'-=->)]]!>==->')';*$#$%*-;;=&$$$%*-;>-*%###$%*---=&%$$$%*=-;;;-*%$####$$%%&&&&%$#@+++++@@$-}k", +"m3~>;-*%$#@+++++@@#$$%$$####$%&*=-;;-=%$@@@##$%%%%$#@@#%&=--=&$@+++@@@@++. .+@#$$$$%*;'));*%&->'';&%&=>,>=%%*->;=&%&=--=%$%=,),-==>!]~>=*=;>;=*=;!^/~>--,!{!>==;'!~)>==;'{^]';==;,'),-&$#$%=;;;=%$$$%*->;-*$###$%*---=&$$$$%*=-;;;-*%$####$$%%&&&&%$#@@++++@#-}k", +"m4~;=*%$#++++++@##$$%$$####$$%*=-;;-=%#@+@@#$%%%%$#@@#$&=---*$@+++@@@@@+. .+#$$$#$%=>)),-&%*;,),-%%&->,;*%%*->;=%%&=--*%$%=,),-*=>!]~>=*=;>;=**;)^/{,-->){~,-=-,!~!,-=-,!]^!>==->,)'>=%##$&=;;-*%$$$&=;>;=&$###$%*---=&$##$%*=-;;--*%$####$$%%&&&&%$#@@++++#=[k", +"m4!-&%#@++++++@##$$$$$####$$%*=-;;-=%$@@@@#$%%&%$#@@#$%*---=%#++++@@@@++. .+@#$$##$*-,))>=%&=>')>=%%*-,,;*%&=;>;*%%&=--*%$%-,',-*=>!]{,=&=;>>-**-']/]'-=;'~{);==>)~~';==>)]^]'-==;,'',-&$##%*-;;=&$$$%*-;>;=%$###$&=---*%$##$%&=--;-=*%$####$$%%&&&&%$$#@+++@=[j", +"m2'*$#@++++++@##$$$$$####$$%*=--;-=%$@@@@#$%%&%$#@@@$%*=--=&$@++++@@@++. .+#$$$#$%=>)!';&%&-,));*%%=;,>-&%&=;>-*%%*=--*%$&-,',-*=;!]{,=&=;>>-**-,{/^);=;'~{);==;'!{)>==;,~^^!>==->,''>=%##$%=;;;=%$$$%*-;>;*%####$&=---*%$##$%&=--;-=*%$####$$%%%&&&%%$#@++@=[j", +"l1>%#@++++++@##$$$$#####$$%&=--;-=&$@@@@#$$%&%%$@@@#%&=---*$@++++@@@++.. .+@$$$##$&-,)),=&%*;')'-&%&=>,>=%%&=;;-&%%*=-=&$$&-,',-*=;)]],=&=->>;=*=,~//!;=-,!{~,==-,)~!,-=->)]^]'-==;,'',-&$##$&-;;-*%$$$&=;>;-*$####%&=--=*%$##$%&==---=*%$####$$%%%&&&&%$#@+@=[j", +"k|;#@++++++@##$$$$#####$%%*=----=&$#@@@#$$%&%%$#@@#$&*=--*%#+++++@@++.. .+#$$$#$%=;'!);*%&=>)),=%%&->,;*%%&-;;-&%%*=-=&$$&-,',-*=;)]]'=&*->>;=*=>!^/{>-->){{'-*=>)~~);==;'{^]!>==-;,''>=%##$%*-;;=&$$$%*=;>;-&$###$%&=--=&%###$%&*=---=*%$####$$%%%&&&&%$#@#=[j", +"k}=@++++++@##$$$$##@##$%%*=----=&$#@@@#$$%%&%$#@@#$%*=--=%#+++++@@+++. .+@$$$##$&-,)!'-&%*-,))>*%%*-,,;*%%*-;;=%%%*=-=%$$&-,',-**;)]]'-**->>;=&*;)^/],-=;'~{);==;'!{!>==-,!]^{'-==;>'',-&$##$&=;;-=%$$$%*-;>;=%$###$%*=--=&$###$%&*=---=*%$####$$$%%&&&&%$#$=[j", +"j[=@+++++@##$$$$##@##$%%*=----=&$#@@@#$$%%&%$#@@#$%&=--=&$@+++++@+++. +@#$$$#$%*;'!)>=%%=;)!);&%%=;,>-&%%*-;;=%$%*--*%$$&-,',-**;)]])-**->>;=**-']/]'-=;,!]!>=*-,)~~'-==;)]^^!;==-;,''>=%###%*-;;-&$$$$&=->>;=%$###$%*=--=&$###$%&*=---=*%$####$$$%%&&&&%%%-}j", +"j[=@++++@##$$$$##@##$%%*==---=&$#@@@##$%%&%$#@@@#%&==-=*$@+++++++++.. .+#$$$##$&=>)!';&%&=,)!,-%%&=;,>=%%&=-;-*%$&=-=*%$$&-,'>=&*;)]])-**-;>>-**-,]/^);=-,!{~,-*=>)~{);==-,!^^{,-==;>,',;*$##$%=;;;=%$#$%&=;>>-*%####$%*=--*%$###$%&*==--=*%$#####$$%%&&&&%&;}k", +"j[=@++@@##$$$###@##$%%&==---=&$#@@@##$%%&%%#@@@#$&*=--=%#++++++++++. .@#$$$##%*;,!!,=%%*-'!!>=%%&->,;*%%&=;;-&%%&=-=*%$$&-,'>=&*;)]^)-**=;,>-**-,{//!;=->){{)-*=;'!{!,-==>)]^]);==-;,''>=%###$&-;;-*%$#$%*-;>;-&$####$&*=-=*%$###$%&*==-==*%$#####$$%%&&&&*>|k", +"j[=@+@@#$$$$###@##$%%&==---=&$#@+@##$%%&%%$#@@#$%*=--=&$@+.+++++++. .+#$$$$#$%=>)!);*%%=>)~);&$%*->,;*%%&=;;-&$%&=-=*%$$&-,'>=&*-']^!;**=;,>-**=>!//{>==;'~]);=*-,){~';==;'~^^{,-==;>,',;*$##$%*-;;-&$$$$&=-;>;=&$###$%&=--=*%$###$%&*==-==*%$#####$$%%&&&*,1k", +"j[=@@##$$$$##@@##$%%&*=---=&$#@+@##$%%%%%$#@@#$%&==-=*$@+.+++++++. .@#$$$##$*-,!!'-&%&-,!~'-%$%=;,>-&$%&-;;=&$%*=-=&$$$&-,'>=&*-']^!;*&=;>>;*&=;)^(],-=;,!]~,=*=>)~{)>==-,!]^]);==-;,''>-%###$&=;;;=%$#$%&=;>>;=%$###$%&=--=*%####$%&*==-==*%$#####$$%%%&*,1l", +"j[=###$$$$##@@##$%%&*=---=&$#@+@##$$%%%%$#@@@#%&*=--*%#+..+++++++. .+@$$$##$%=;'!)>=%%*;'!!,=%$&=;,>=%$%*-;;=%$%*===&$$$*-,'>=&*-']^!;*&=;>,;=&*;)^(^'-=-,!]{'-*=;'!{!,-==;){^^{,-*=;>,',;*$###%*-;;-*%$#$%*=;>>-*%####$%&=--=&%#@@#$%&*=====*%$#####$$%%%*,1l", +"j[-$#$$$$##@@##$%%&*=---=&$#@+@@#$$%%&%$#@+@#$%*=--=%#++.+++++++. .@#$$$##$&-,)!';&%&=>)~);*%%&->,;*%$%*-;;=%$%*=-=&$$$*;,'>=&*-']^!;*&=;>,;=&*-']/^);=->){]);**-,){{);==-,!^/]);==-;,',>-&$##$%=-;;-&$$$$%*-;>;-&$####$%&=--=&$#@@#$%&*=====*%$#####$$%%&,1l", +"k}-$$$$$##@@##$%%&*=---=&%#@+@@#$$%%&%$#@+@#$%*=--=&$@+.+++++++. .+#$$$##$%*;'!!,=%%&-,!~)-&$%*-,,;*%$%=-;-*%$%*=-=&$$%*;,'>=&*-']^~;*&=->,;=**-,{//~>==;'~]!>=*=>)~{!,=*->)]^^~,-*=;>,',;=%###$&=;>;=%$#$%&=-;>;=&$####$%*=--=&$#@@#$%&*=====*%$#####$$$&,1l", +"k};%$$$##@@##$%%&*=---=&%#@+@@#$$%%&%%$#@@#$%&=--=*%#+..+++++++. +@#$$$##$&=>)!);*%%*;'~~,=%$%=;,,-&$$&=;;-&%$&====%$$%*;,'>=&*-,{^~>*&*->,>-**=,~/(],==;,!]~,-*=;'!{~'-==;'~^/]);==-;,''>-&$##$%*-;;-*%$#$%&=;>>;=%$####$%*=-=*%$#@##$%&*=====*%$#####$$%>|k", +"k|;%$$##@@##$%%&*=---=*%#@++@##$%%&&%$#@@@#%&*=--=%#++.+++++++. .+#$$$###%*;,!!'-&%&=>){!>*$$&=>,>=%$%&=;;-&$$&===*%$#%*;,'>=&&-,{^~>*&*->,>-*&=>!^(]'-=-,){{);**-,){{);=*-,)]/^~,=*=;>,',;=%###$%=;;;=&$#$$%*-;>>-*%##@#$$&*=-=*%$#@##$%&*=====*%$#####$%>|k", +"k|;%$##@@##$%%&*=---=*%#@++@##$%%&%%$#@@@#$%*=--=&$@+.+++++++.. +@#$$$##$&=>)~!>=%%*-,!{);&$%&->,;=%$%*-;;=%$%&===*%$#%*;,'>=&&-,{^{,*&*-;,>-*&=;)^(^)-=->){]!>=*=>)~{!,-*=;'{^/]';==-;,,',-&$###%&-;>;=%$#$%&=-;>;-*$####$%&*=-=*%$#@##$%&*=====&%$#####$;|k", +"k|;%##@@##$%%&*=---=*%#@++@##$%%&&%$#@+@#$%&==-=*$#+..+++++++. .+#$$$###%*-,!~);*%%=;)~~'=%$%*-,,;*$$%*-;;=%$%&===*%##%*;,'>=&&-,{^{,=&*-;,,;=&*;'](/!;==;'~]~,=*=;'!{~';==-,!^/^!>=*=;>,',;=%###$%*-;;-*%$#$%&=-;>;=&$####$%&==-=*%##@##$%&*=====&%$####$;}k", +"k};$#@@##$%%&*=---=*%#@++@##$$%%&%$#@+@#$%&*=--*%#+..+++++++.. +@#$$$##$%=;)~!,-%%&=,!{!>*$$%=;,,-&$$%=-;;=%$%*===&$##%*;,'>=&&-,~^],=&&=;,,;=&*-'](/~>==;,!]{'-**-,){{)>=*=>)]^/]'-*=-;,,,,-*$###$&=;>;-&$#$$%*=;>>;=%$####$%&=--=*%#@@##$%&**====*%$###$-}k", +"k}-#@@##$%%&*=---=*%$@++@##$$%%&%%$@@@@#%&*=--=&$@+..++++++.. .+#$$$###$&-,)~)>*%%*-'~{);&$$&=>,>=%$$&=-;-*%$%*===&$##%=;,'>=&&-,~^],=&&=;,,;=&*-,~/(],==-,){]);*&=>)~{~,-*=;'~^/^!>=*=->,',>=%###$%*-;>;=%$#$$%*-;>>-=%$####$%&=--=&%#@@##$%&**====*%$##$-}k", +"k}-#@##$%%&*=---=*%$@+++@#$$%%&%%$#@+@#$%*=--=*$@+..+++++++. +@#$$$##$%=;'!~'-&%%=;){{'-%$%*->,;=%$%&=;;-*$$%*===&$##%=;,'>=&&=,~^]'=&&=;>,;=&&=>!/(^'-=->){]!>=&=;,!{{);=*->)]//]'-*=-;,,,,;*$###$%=;>;-*%$#$%&=-;>;-*%##@##$%*=--=&$#@@##$%&**====*%$#$-}k", +"k}-###$%%&*=---=*%$@+++@#$$%%&&%$#@+@#$%&=--=*%#+..+++++++.. .+#$$$$##$&->)~!,=%%&-,!{!,=%$%*;,,;*%$%*-;;-&$$%*===&$#$%=;''>=&&=,~^]'-&&=;>,>-*&=>)^(^);==;'~]~,-&*-,){{!>=*=;'~^/^!>=*=->,',>-&$###$&=;>;=&$#$$%*=;>>;-&$####$$%*=--=&$#@@##$%&**====*%$$-}k", +"j[-$#$%%&*=---=*%$@+++@##$%%&&%$#@+@#$%&*=--=&$@+..+++++++. +@#$$$##$%*;'!~);*%%*-'~{);&$$&=;,,-&$$%*-;;=&$$&*===&$#$%=;,';=&&=>!^])-&&=->,>-*&=;)](/!;==;,!]{);*&=>'~]~'-**-,!]//{,-*=-;,,',;*%###$%*-;>;=%$#$$%*-;>>;=&$####$%&*=--=&$#@@##$%&**====*%%;}k", +"k}-$$%%&*=---=*%$#+++@##$%%&&%$#@++@#$&*=--=&$@+..+++++++.. .+#$$$$##$&=>)~!,=%%%=;){{'-%$%&->,>-&$$%=-;;=%$$&===*%$#$%=>'';=&&=>!^^)-&&*->,,-*&*;'](({>==-,){]!>=&=;,!{{);=*=>){^/^);=*=->,',>-&$###$&=;>;-*%$#$%&=-;>>-=%$#@##$%&*=-=*%$#@@##$%&**====**>|k", +"k};%%%&*=----*&$#+++@##$$%%&%%$@@+@#$%*=--=*%#+..++++++++. +@#$$$##$%*-,!~)>*%%&-,!]~,=%$%*->,>=%$$&=-;;=%$%&===*%$#$%=>'';=&&=>!^^)-&&*->,,;=&*-,{/(],=*->)~]~,=&*-,){]!,-*=;,!^//{,-**-;,,',;=%####%*-;>;=&$##$%&=-;>;-*%##@##$%&=--=*%$#@@##$%&**=====,|k", +"k|;&&&*=----=&$#@++@##$$%%&%%$#@+@#$%&==--=%$@+..+++++++. .+#$$$###$&=>)~~'-&%%*;'~]);&$$%=;,,;*%$%&=;;-*%$%&===*%$#$&=>'';=&&=>!^^!;&%*->,,;=&*-,~/(^)-==;'~]{'-&&=>'~]~';**->)]//^);=*=->,',>-&$###$%=->>;=%$#$$%*=;>>;-&$#@@##$%&=--=*%$#@@#$$%&**===-'1l", +"k|>***=----=&$#@++@##$$%%&&%$#@+@#$%&*=--=&$@+..+++++++.. +@#$$$###%*-,!~!,=%%&=>){{)-%$$&=;,,;&$$%*=;;-*%$%*===*%$#$&=>'';=&&=>!^^!;&%*-;,,;=&&=>!^(/);==;,!]]);*&=;,!{{)>=*=;'~^//~,=**-;,,',;=%####$&=;>;-*%$#$%&*-;>>;=&$#@###$%*=--=*%$#@@#$$%&**==-)2l", +"l1'-=-;;;;-*%$#@@##$%%&&**&%$#@##$%*=-;;-=&$@+++@@@@@@++++..++@$%%%$$$%*->){{)>=%&=;'~]{'-&%%*-,',;*%%&=;>>;*%%&=---=&$$%*-,)'>=**-,~//{>*&=->'',-**->!^_({,-=;,!]^{,-*=;,!]]{';==;,!^((^!>==-;,')',;=%$#$%&=;>,>-*%$$%&*=;>,,;-&%$##$$%*=-;;-=&$###$%%&*==-;!3m", +"n5^)))!!!)'>;-===--;;>,,,,>;-===-;,'))!!),;=****======**&&&&&*-;>>;;-;>,)]/_(^!,>>'~^_:(]'>;>'!]^]),;;,'!{{),;;,')))'>;-;,)]^^{),,){(<[_{,,,)~]^])',)~/:}}:])')]/_:_^),')]/_:_/~'')]/_[[<(])''!{]^^^{)>;---;,)~]]!'>;-;;>,)~]]{!'>;----;>,')!!),>--=--;>,,')!(7n", +"sf632333321|}[[[[}}}||111||}[[[}}|1223332|}[<<<[[[[[[[<<<<<<<[}}||}}}}|23589852|||24799741|||245542|||1234421||122221|}}|13465421124800841|1245543112469aa95222468996311246899742124680a095312345565431}}[}}|2344421}}}||123454421}}[}}}||123332|}}[[}}||11237gt", +"xsnmmmmmmlkkjjjjjkkkkklllkkkjjjkkklllmmmlkjjjjjjjjjjjjjjjjjjjjjkkkkkkkklmnoonmlkkllmnoonmlkkklmnnmlkkkllmmmlkkkkllmllkkkklmmnnmlkllmoppomlkllmnnmmlllmnopponmlmmnooonmlllmnooonmlllmnoopponmlllmmnnnnmlkkjkkklmmmmmlkkkkkklmmnnmllkkjjkkkkllmmmlkkjjjjkkkkllmnsx"}; diff --git a/hacks/interaggregate.c b/hacks/interaggregate.c index 2517792d..08cbbe09 100644 --- a/hacks/interaggregate.c +++ b/hacks/interaggregate.c @@ -321,8 +321,8 @@ inline unsigned long trans_point(int x1, int y1, unsigned long myc, double a, } else { - int or, og, ob; - int r, g, b; + int or=0, og=0, ob=0; + int r=0, g=0, b=0; int nr, ng, nb; unsigned long c; diff --git a/hacks/noseguy.c b/hacks/noseguy.c index 205d273f..594d7462 100644 --- a/hacks/noseguy.c +++ b/hacks/noseguy.c @@ -532,7 +532,7 @@ char *progclass = "Noseguy"; char *defaults [] = { ".background: black", ".foreground: gray80", - "*program: xscreensaver-text --cols 40 | head -15", + "*program: xscreensaver-text --cols 40 | head -n15", "noseguy.font: -*-new century schoolbook-*-r-*-*-*-180-*-*-*-*-*-*", 0 }; diff --git a/hacks/noseguy.man b/hacks/noseguy.man index cc1d7243..43962ebf 100644 --- a/hacks/noseguy.man +++ b/hacks/noseguy.man @@ -45,7 +45,7 @@ The font used for the messages. This program will be run periodically, and its output will be the text of the messages. Default: - xscreensaver-text --cols 40 | head -15 + xscreensaver-text --cols 40 | head -n15 You can configure the text printed through the "Advanced" tab of .BR xscreensaver\-demo (1), diff --git a/hacks/ripples.c b/hacks/ripples.c index 0b6dc273..c30e2adf 100644 --- a/hacks/ripples.c +++ b/hacks/ripples.c @@ -99,6 +99,9 @@ static void (*draw_transparent)(short *src); - (((x)>>3)&0x11111111)) +static Bool grayscale_p; +static unsigned long grayscale(unsigned long color); + /* ------------------------------------------- */ @@ -197,13 +200,13 @@ draw_transparent_vanilla(short *src) if (dirty[pixel] > 0) { XPutPixel(buffer_map, (across<<1), (down<<1), - XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady)); + grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady))); XPutPixel(buffer_map, (across<<1)+1,(down<<1), - XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady)); + grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady))); XPutPixel(buffer_map, (across<<1), (down<<1)+1, - XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1)); + grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1))); XPutPixel(buffer_map, (across<<1)+1,(down<<1)+1, - XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1)); + grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1))); } } } @@ -257,6 +260,52 @@ bright(int dx, unsigned long color) } +static unsigned long +grayscale(unsigned long color) +{ + int red; + int green; + int blue; + int total; + int gray_r; + int gray_g; + int gray_b; + + if (!grayscale_p) + return color; + if (!transparent) + return color; + if ((rmask == 0) || (gmask == 0) || (bmask == 0)) + return color; + + red = ((color >> rshift) & rmask); + green = ((color >> gshift) & gmask); + blue = ((color >> bshift) & bmask); + total = red * gmask * bmask + green * rmask * bmask + blue * rmask * gmask; + + gray_r = total / (3 * gmask * bmask); + if (gray_r < 0) + gray_r = 0; + if (gray_r > rmask) + gray_r = rmask; + + gray_g = total / (3 * rmask * bmask); + if (gray_g < 0) + gray_g = 0; + if (gray_g > gmask) + gray_g = gmask; + + gray_b = total / (3 * rmask * gmask); + if (gray_b < 0) + gray_b = 0; + if (gray_b > bmask) + gray_b = bmask; + + return ((unsigned long) + ((gray_r << rshift) | (gray_g << gshift) | (gray_b << bshift))); +} + + static void draw_transparent_light(short *src) { @@ -310,23 +359,23 @@ draw_transparent_light(short *src) if (dx != 0) { XPutPixel(buffer_map, (across<<1), (down<<1), - bright(dx, XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady))); + bright(dx, grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady)))); XPutPixel(buffer_map, (across<<1)+1,(down<<1), - bright(dx, XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady))); + bright(dx, grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady)))); XPutPixel(buffer_map, (across<<1), (down<<1)+1, - bright(dx, XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1))); + bright(dx, grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1)))); XPutPixel(buffer_map, (across<<1)+1,(down<<1)+1, - bright(dx, XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1))); + bright(dx, grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1)))); } else { /* Could use XCopyArea, but XPutPixel is faster */ XPutPixel(buffer_map, (across<<1), (down<<1), - XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady)); + grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady))); XPutPixel(buffer_map, (across<<1)+1,(down<<1), - XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady)); + grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady))); XPutPixel(buffer_map, (across<<1), (down<<1)+1, - XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1)); + grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1))); XPutPixel(buffer_map, (across<<1)+1,(down<<1)+1, - XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1)); + grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1))); } } } @@ -757,9 +806,20 @@ init_ripples(int ndrops, int splash) add_drop(ripple_blob, splash); if (transparent) { + if (grayscale_p) + { + int across, down; + for (down = 0; down < bigheight; down++) + for (across = 0; across < bigwidth; across++) + XPutPixel(buffer_map, across, down, + grayscale(XGetPixel(orig_map, across, down))); + } + else + { /* There's got to be a better way of doing this XCopyArea? */ memcpy(buffer_map->data, orig_map->data, bigheight * buffer_map->bytes_per_line); + } } else { int across, down, color; @@ -892,6 +952,7 @@ char *defaults[] = "*stir: False", "*fluidity: 6", "*light: 0", + "*grayscale: False", #ifdef HAVE_XSHM_EXTENSION "*useSHM: True", #endif /* HAVE_XSHM_EXTENSION */ @@ -910,6 +971,7 @@ XrmOptionDescRec options[] = {"-stir", ".stir", XrmoptionNoArg, "True"}, {"-fluidity", ".fluidity", XrmoptionSepArg, 0}, {"-light", ".light", XrmoptionSepArg, 0}, + {"-grayscale", ".grayscale", XrmoptionNoArg, "True"}, #ifdef HAVE_XSHM_EXTENSION {"-shm", ".useSHM", XrmoptionNoArg, "True"}, {"-no-shm", ".useSHM", XrmoptionNoArg, "False"}, @@ -928,6 +990,7 @@ void screenhack(Display *disp, Window win) int stir = get_boolean_resource("stir", "Boolean"); int fluidity = get_integer_resource("fluidity", "Integer"); transparent = get_boolean_resource("water", "Boolean"); + grayscale_p = get_boolean_resource("grayscale", "Boolean"); #ifdef HAVE_XSHM_EXTENSION use_shm = get_boolean_resource("useSHM", "Boolean"); #endif /* HAVE_XSHM_EXTENSION */ @@ -964,9 +1027,16 @@ void screenhack(Display *disp, Window win) maxbits = MIN(MIN(BITCOUNT(rmask), BITCOUNT(gmask)), BITCOUNT(bmask)); light -= 8-maxbits; if (light < 0) light = 0; - } else + } else { + if (grayscale_p) + { + set_mask(visual->red_mask, &rmask, &rshift); + set_mask(visual->green_mask, &gmask, &gshift); + set_mask(visual->blue_mask, &bmask, &bshift); + } draw_transparent = draw_transparent_vanilla; - + } + init_ripples(0, -SPLASH); /* Start off without any drops */ /* Main drawing loop */ diff --git a/hacks/ripples.man b/hacks/ripples.man index caa26863..55160029 100644 --- a/hacks/ripples.man +++ b/hacks/ripples.man @@ -14,6 +14,7 @@ ripples - interference patterns. [\-water] [\-stir] [\-oily] +[\-grayscale] [\-colors \fInumber\fP] [\-no-shm] .SH DESCRIPTION @@ -53,6 +54,11 @@ Moving Splashes. Boolean. .B \-oily | \-no-oily Psychedelic Colors. Boolean. .TP 8 +.B \-grayscale +Convert the screen image to grayscale. +Ignored if we don't grab the screen image or if our screen doesn't have +enough color depth. +.TP 8 .B \-colors \fInumber\fP Colors Two. Default: 200. .TP 8 diff --git a/hacks/sonar.c b/hacks/sonar.c index e2ebf154..b3f3cb6a 100644 --- a/hacks/sonar.c +++ b/hacks/sonar.c @@ -38,7 +38,7 @@ * software for any purpose. It is provided "as is" without express or * implied warranty. * - * $Revision: 1.38 $ + * $Revision: 1.39 $ * * Version 1.0 April 27, 1998. * - Initial version @@ -537,8 +537,9 @@ lookupHost(ping_target *target) hent = gethostbyname (target->name); if (!hent) { - fprintf (stderr, "%s: could not resolve host: %s\n", - progname, target->name); + if (debug_p) + fprintf (stderr, "%s: could not resolve host: %s\n", + progname, target->name); return 0; } @@ -608,7 +609,7 @@ newHost(char *name) struct sockaddr_in *iaddr = (struct sockaddr_in *) &(target->address); unsigned long ip = iaddr->sin_addr.s_addr; - if ((ntohl (ip) & 0xFFFFFF00L) == 0x7f000000L) /* 127.0.0 */ + if ((ntohl (ip) & 0xFFFFFF00L) == 0x7f000000L) /* 127.0.0.x */ { if (debug_p) fprintf (stderr, "%s: ignoring loopback host %s\n", @@ -617,6 +618,19 @@ newHost(char *name) } } + /* Don't ever use broadcast (255.x.x.x) hosts */ + { + struct sockaddr_in *iaddr = (struct sockaddr_in *) &(target->address); + unsigned long ip = iaddr->sin_addr.s_addr; + if ((ntohl (ip) & 0xFF000000L) == 0xFF000000L) /* 255.x.x.x */ + { + if (debug_p) + fprintf (stderr, "%s: ignoring broadcast host %s\n", + progname, target->name); + goto target_init_error; + } + } + /* Done */ if (debug_p) diff --git a/hacks/spotlight.c b/hacks/spotlight.c index b98d54b6..7137d661 100644 --- a/hacks/spotlight.c +++ b/hacks/spotlight.c @@ -181,9 +181,9 @@ onestep (Display *dpy, Window window, Bool first_p) now = currentTimeInMs() + off; /* find new x,y */ - x = ((1 + sin(((float)now) / X_PERIOD * 2. * M_PI))/2.0) + x = ((1 + sin(((double)now) / X_PERIOD * 2. * M_PI))/2.0) * (sizex - s/2) -s/4 + MINX; - y = ((1 + sin(((float)now) / Y_PERIOD * 2. * M_PI))/2.0) + y = ((1 + sin(((double)now) / Y_PERIOD * 2. * M_PI))/2.0) * (sizey - s/2) -s/4 + MINY; if (!first_p) diff --git a/hacks/webcollage b/hacks/webcollage index 4ed61c7b..3a8ea8c9 100755 --- a/hacks/webcollage +++ b/hacks/webcollage @@ -60,20 +60,21 @@ use bytes; # Larry can take Unicode and shove it up his ass sideways. my $progname = $0; $progname =~ s@.*/@@g; -my $version = q{ $Revision: 1.127 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; +my $version = q{ $Revision: 1.129 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; my $copyright = "WebCollage $version, Copyright (c) 1999-2005" . " Jamie Zawinski \n" . " http://www.jwz.org/webcollage/\n"; -my @search_methods = ( 58, "altavista", \&pick_from_alta_vista_random_link, +my @search_methods = ( 56, "altavista", \&pick_from_alta_vista_random_link, 11, "livejournal", \&pick_from_livejournal_images, - 7, "yahoorand", \&pick_from_yahoo_random_link, + 5, "yahoorand", \&pick_from_yahoo_random_link, 10, "googlephotos", \&pick_from_google_image_photos, - 6, "googleimgs", \&pick_from_google_images, + 5, "googleimgs", \&pick_from_google_images, 3, "googlenums", \&pick_from_google_image_numbers, - 5, "flickr", \&pick_from_flickr, + 2, "flickr_recent", \&pick_from_flickr_recent, + 8, "flickr_random", \&pick_from_flickr_random, # In Apr 2002, Google asked me to stop searching them. # I asked them to add a "random link" url. They said @@ -803,6 +804,29 @@ sub pick_image_from_body($$) { return $url; } +# Given a URL and the RSS feed from that URL, pick a random image from +# the feed. This is a lot simpler than extracting images out of a page: +# we already know we have reasonable images, so we just pick one. +# Returns: the real URL of the page (preferably not the RSS version), +# and the image. + +sub pick_image_from_rss($$) { + my ( $url, $body ) = @_; + my @suitable = ($body =~ m/([^<>]+)@i); + $base = $url unless $base; + + # pick a random element of the table + if (@suitable) { + my $i = int(rand(scalar @suitable)); + my $url = $suitable[$i]; + LOG ($verbose_load, "picked image " .($i+1) . "/" . + ($#suitable+1) . ": $url"); + return ($base, $url); + } + return; +} ############################################################################ @@ -1763,8 +1787,8 @@ my @flickr_cache = (); # fifo, for ordering by age my %flickr_cache = (); # hash, for detecting dups -# flickr -sub pick_from_flickr($) { +# flickr_recent +sub pick_from_flickr_recent($) { my ($timeout) = @_; my $start = 16 * int(rand(100)); @@ -1831,6 +1855,47 @@ sub pick_from_flickr($) { return ($page, $img); } + +############################################################################ +# +# Pick images from a random RSS feed on Flickr. +# +############################################################################ + +my $flickr_rss_base = ("http://www.flickr.com/services/feeds/photos_public.gne" . + "?format=rss_200_enc&tags="); + +# Picks a random RSS feed; picks a random image from that feed; +# returns 2 URLs: the page containing the image, and the image. +# Mostly by Joe Mcmahon +# +# flickr_random +sub pick_from_flickr_random($) { + my $timeout = shift; + + my $rss = $flickr_rss_base . random_word(); + $last_search = $rss; + + print STDERR "\n\n" if ($verbose_load); + LOG ($verbose_load, "URL: $last_search"); + + $suppress_audit = 1; + + my ( $base, $body ) = get_document ($last_search, undef, $timeout); + if (!$base || !$body) { + $body = undef; + return; + } + + my $img; + ($base, $img) = pick_image_from_rss ($base, $body); + $body = undef; + return () unless defined ($img); + + LOG ($verbose_load, "redirected to: $base"); + return ($base, $img); +} + ############################################################################ # @@ -3362,6 +3427,10 @@ sub main() { pick_dictionary(); } + if ($imagemap_base && !($img_width && $img_height)) { + error ("-size WxH is required with -imagemap"); + } + init_signals(); spawn_driftnet ($driftnet_cmd) if ($driftnet_cmd); diff --git a/hacks/webcollage-helper.c b/hacks/webcollage-helper.c index 8ba09d73..3f9a0747 100644 --- a/hacks/webcollage-helper.c +++ b/hacks/webcollage-helper.c @@ -24,6 +24,7 @@ #include #include +#undef HAVE_STDLIB_H /* stupid jconfig.h! */ #include #include diff --git a/hacks/whirlygig.man b/hacks/whirlygig.man index df8c0eed..4c38e377 100644 --- a/hacks/whirlygig.man +++ b/hacks/whirlygig.man @@ -11,7 +11,7 @@ whirlygig -- zooming chains of sinusoidal spots [\-wrap 1|0] [\-db] [\-no-db] .SH DESCRIPTION -The \flwhirlygig\fP program draws a series of circles on your screen. +The \fIwhirlygig\fP program draws a series of circles on your screen. They then move about in a cyclic pattern .SH OPTIONS .I whirlygig @@ -27,33 +27,33 @@ Draw on the root window. Specify which visual to use. Legal values are the name of a visual class, or the id number (decimal or hex) of a specific visual. .TP 8 -.B \-xspeed \flspeed\fP +.B \-xspeed \fIspeed\fP Specify how fast the dots should cycle horizontally. Try out values from .01 to 4000. Random by default. .TP 8 -.B \-yspeed \flspeed\fP +.B \-yspeed \fIspeed\fP Specify how fast the dots should cycle vertically. Try out values from .01 to 4000. Random by default. .TP 8 -.B \-xamplitude \flfactor\fP +.B \-xamplitude \fIfactor\fP Specify the horizontal amplitude. Try out values from .01 to 10. Defaults to 1.0. .TP 8 -.B \-yamplitude \flfactor\fP +.B \-yamplitude \fIfactor\fP Specify the horizontal amplitude. Try out values from .01 to 10. Defaults to 1.0. .TP 8 -.B \-whirlies \fla number\fP +.B \-whirlies \fIa number\fP Specify how many whirlies you want (per line). Defaults to a random number. .TP 8 -.B \-nlines \flnumber of lines\fP +.B \-nlines \fInumber of lines\fP Specify how many lines of whirlies you want. Defaults to a random number. .TP 8 -.B \-xmode \flmode\fP +.B \-xmode \fImode\fP .TP 8 -.B \-ymode \flmode\fP +.B \-ymode \fImode\fP Specify which mode to use for calculating the x and y positions of the whirlies. Can be any of spin, funky, circle, linear, test, fun, innie or lissajous. Defaults to 'change' mode, which randomly selects a new @@ -63,37 +63,37 @@ mode for x and y every now an then. Unrecognized options default to spin. Prints some strings to the window explaining what the initially selected modes are, before displaying the whirlies. Off by default. .TP 8 -.B \-trail \fl1 or 0\fP +.B \-trail \fI1 or 0\fP Trail mode fails to erase the whirlies as they move, so they leave a multicoloured trail behind. Doesn't work if the doubled buffered mode is using the X server's double buffer extension, and the useDBEclear resource is true (which it is by default). .TP 8 -.B \-speed \flint\fP +.B \-speed \fIint\fP Specifies how fast to cycle through the internal time. Values 1,2 and 3 look ok, up to 10 is not too bad, but beyond ends up flickery. Adjust xspeed and yspeed instead. .TP 8 -.B \-start_time \flint\fP +.B \-start_time \fIint\fP Where in the internal time cycle to start. Ranges from 1 to 429496729, Defaults to a random value. .TP 8 -.B \-xoffset \flfactor\fP +.B \-xoffset \fIfactor\fP Tell the whirlies to be offset by this factor of a sin. Defaults to 1.0 .TP 8 -.B \-yoffset \flfactor\fP +.B \-yoffset \fIfactor\fP Tell the whirlies to be offset by this factor of a cos. Defaults to 1.0 .TP 8 -.B \-offset_period \flfactor\fP +.B \-offset_period \fIfactor\fP Change the period of an offset cycle Defaults to 1 .TP 8 -.B \-color_modifier \flint\fP +.B \-color_modifier \fIint\fP How many colors away from the current should the next whirly be? .TP 8 -.B \-wrap \fl1|0\fP +.B \-wrap \fI1|0\fP Causes whirlies that fall off the edge of the screen to wrap over to the other end of the screen. Otherwise they disappear and new ones to materialize on the other side of the screen. The difference is diff --git a/hacks/xlyap.c b/hacks/xlyap.c index 683c21ba..3af88507 100644 --- a/hacks/xlyap.c +++ b/hacks/xlyap.c @@ -217,7 +217,7 @@ static double minexp, maxexp, prob=0.5; static int expind[MAXFRAMES]={0}, resized[MAXFRAMES]={0}; static int numwheels=MAXWHEELS, force=0, Force=0, negative=1; static int rgb_max=65000, nostart=1, stripe_interval=7; -static int save=1, show=0, useprod=1, spinlength=256, savefile=0; +static int save=1, show=0, useprod=1, spinlength=256/*, savefile=0*/; static int maxframe=0, frame=0, dorecalc=0, mapindex=0, run=1; static char *outname="lyap.out"; @@ -246,7 +246,7 @@ static void main_event(void); static int complyap(void); static void Getkey(XKeyEvent *event); static int sendpoint(double expo); -static void save_to_file(void); +/*static void save_to_file(void);*/ static void setforcing(void); static void check_params(int mapnum, int parnum); static void usage(void); @@ -605,15 +605,15 @@ complyap(void) return FALSE; else { FlushBuffer(); - if (savefile) - save_to_file(); +/* if (savefile) + save_to_file(); */ return TRUE; } } if (b >= max_b) { FlushBuffer(); - if (savefile) - save_to_file(); +/* if (savefile) + save_to_file();*/ return TRUE; } prod = 1.0; @@ -705,8 +705,8 @@ complyap(void) return FALSE; else { FlushBuffer(); - if (savefile) - save_to_file(); +/* if (savefile) + save_to_file();*/ return TRUE; } } @@ -1316,7 +1316,7 @@ Getkey(XKeyEvent *event) redraw(exponents[frame], expind[frame], 1); break; case 'f': - case 'F': save_to_file(); break; +/* case 'F': save_to_file(); break;*/ case 'i': if (stripe_interval > 0) { stripe_interval--; if (displayplanes > 1) { @@ -1568,6 +1568,7 @@ Redraw(void) resized[frame] = 0; } +#if 0 /* Store color pics in PPM format and monochrome in PGM */ static void save_to_file(void) @@ -1643,6 +1644,7 @@ save_to_file(void) } fclose(outfile); } +#endif static void recalc(void) diff --git a/po/POTFILES.in b/po/POTFILES.in index 15d465a4..7073ce09 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,4 +1,4 @@ -# Auto-generated: Wed Jun 22 18:02:31 PDT 2005 +# Auto-generated: Fri Oct 21 23:44:10 PDT 2005 driver/demo-Gtk-conf.c driver/demo-Gtk-support.c driver/demo-Gtk-widgets.c @@ -34,6 +34,7 @@ hacks/config/bumps.xml hacks/config/cage.xml hacks/config/carousel.xml hacks/config/ccurve.xml +hacks/config/celtic.xml hacks/config/circuit.xml hacks/config/cloudlife.xml hacks/config/compass.xml @@ -42,6 +43,7 @@ hacks/config/cosmos.xml hacks/config/crackberg.xml hacks/config/critical.xml hacks/config/crystal.xml +hacks/config/cube21.xml hacks/config/cubenetic.xml hacks/config/cubestorm.xml hacks/config/cynosure.xml @@ -82,6 +84,7 @@ hacks/config/gflux.xml hacks/config/glblur.xml hacks/config/gleidescope.xml hacks/config/glforestfire.xml +hacks/config/glhanoi.xml hacks/config/glknots.xml hacks/config/glmatrix.xml hacks/config/glplanet.xml @@ -107,6 +110,7 @@ hacks/config/intermomentary.xml hacks/config/jigglypuff.xml hacks/config/jigsaw.xml hacks/config/juggle.xml +hacks/config/juggler3d.xml hacks/config/julia.xml hacks/config/kaleidescope.xml hacks/config/klein.xml @@ -188,6 +192,7 @@ hacks/config/swirl.xml hacks/config/t3d.xml hacks/config/tangram.xml hacks/config/thornbird.xml +hacks/config/timetunnel.xml hacks/config/triangle.xml hacks/config/truchet.xml hacks/config/twang.xml diff --git a/setup.com b/setup.com index b15b962a..96b59842 100644 --- a/setup.com +++ b/setup.com @@ -5,7 +5,6 @@ $ mydisk = f$trnlmn("SYS$DISK") $ mydir = mydisk+f$directory() $ anemone :== $'mydir'anemone $ anemotaxis :== $'mydir'anemotaxis -$ ant :== $'mydir'ant $ apollonian :== $'mydir'apollonian $ apple2 :== $'mydir'apple2 $ attraction :== $'mydir'attraction @@ -19,6 +18,7 @@ $ bsod :== $'mydir'bsod $ bubbles :== $'mydir'bubbles $ bumps :== $'mydir'bumps $ ccurve :== $'mydir'ccurve +$ celtic :== $'mydir'celtic $ cloudlife :== $'mydir'cloudlife $ compass :== $'mydir'compass $ coral :== $'mydir'coral diff --git a/utils/version.h b/utils/version.h index 716a2d7c..7b105c9e 100644 --- a/utils/version.h +++ b/utils/version.h @@ -1,2 +1,2 @@ static const char screensaver_id[] = - "@(#)xscreensaver 4.22 (22-Jun-2005), by Jamie Zawinski (jwz@jwz.org)"; + "@(#)xscreensaver 4.23 (21-Oct-2005), by Jamie Zawinski (jwz@jwz.org)"; diff --git a/xscreensaver.spec b/xscreensaver.spec index 12c529b1..9ebb6643 100644 --- a/xscreensaver.spec +++ b/xscreensaver.spec @@ -1,5 +1,5 @@ %define name xscreensaver -%define version 4.22 +%define version 4.23 Summary: X screen saver and locker Name: %{name} @@ -48,7 +48,7 @@ Obsoletes: xscreensaver-gl %description A modular screen saver and locker for the X Window System. -More than 190 display modes are included in this package. +More than 200 display modes are included in this package. %description base A modular screen saver and locker for the X Window System. -- 2.30.2