diff options
| author | Eli Zaretskii <eliz@gnu.org> | 2013-09-26 10:37:16 +0300 |
|---|---|---|
| committer | Eli Zaretskii <eliz@gnu.org> | 2013-09-26 10:37:16 +0300 |
| commit | b87c4ff2817e71ca71b028792200b1e069a95e04 (patch) | |
| tree | bfe00c0655fa02078a9ab2c633ea06d90c4a2064 | |
| parent | bbc108377873aa6ed7cf21c731770103096eea39 (diff) | |
| parent | ba355de014b75ed104da4777f909db70d62f2357 (diff) | |
| download | emacs-b87c4ff2817e71ca71b028792200b1e069a95e04.tar.gz | |
Merge from trunk.
352 files changed, 22094 insertions, 5901 deletions
diff --git a/ChangeLog b/ChangeLog index 09cfb9783cc..f8a219d6a15 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,87 @@ +2013-09-25 Paul Eggert <eggert@cs.ucla.edu> + + Merge from gnulib, incorporating: + 2013-09-24 manywarnings: enable nicer gcc warning messages + 2013-09-23 warnings: port --enable-gcc-warnings to Solaris Studio 12.3 + 2013-09-21 timespec: use the new TIMESPEC_RESOLUTION elsewhere + * configure.ac (WERROR_CFLAGS): Omit -fdiagnostics-show-option + and -funit-at-a-time, since manywarnings does that for us now. + +2013-09-23 Jan Djärv <jan.h.d@swipnet.se> + + * configure.ac: With clang, check for and use -Wno-switch, + -Wno-tautological-constant-out-of-range-compare and -Wno-pointer-sign. + +2013-09-23 Daniel Colascione <dancol@dancol.org> + + * configure.ac: Check for valgrind headers. + +2013-09-20 Xue Fuqiao <xfq.free@gmail.com> + + * INSTALL: New homepage of libtiff. + +2013-09-20 Paul Eggert <eggert@cs.ucla.edu> + + Work around performance bug on OS X 10.8 and earlier. + Perhaps Apple will fix this bug some day. + See the thread starting with Daniel Colascione's email in: + http://lists.gnu.org/archive/html/emacs-devel/2013-09/msg00343.html + * configure.ac (FORTIFY_SOUR): New verbatim section. + +2013-09-19 Paul Eggert <eggert@cs.ucla.edu> + + Merge from gnulib, incorporating: + 2013-09-19 stdio: OS X port of putc_unlocked + extern inline + 2013-09-19 signal: OS X port of sigaddset etc. + extern inline + 2013-09-19 extern-inline: do not always suppress extern inline on OS X + 2013-09-17 getgroups: statement without effect + 2013-08-28 headers: check that _GL_INLINE_HEADER_BEGIN is defined + +2013-09-19 Eli Zaretskii <eliz@gnu.org> + + * configure.ac <srcdir> [MINGW32]: Make sure the value of 'srcdir' + is in the full /d/foo/bar form. See the discussion in + http://lists.gnu.org/archive/html/emacs-devel/2013-09/msg00210.html, + and in particular + http://lists.gnu.org/archive/html/emacs-devel/2013-09/msg00252.html + and its followups, for the details. + +2013-09-17 Dmitry Antipov <dmantipov@yandex.ru> + + * configure.ac: Do not check for g_type_init because we + require glib >= 2.28 for GTK3, glib >= 2.10 for GTK2, + glib >= 2.26 for GSettings and glib >= 2.7.0 for GConf, so + suitable glib should provide g_type_init unconditionally. + +2013-09-15 Jan Djärv <jan.h.d@swipnet.se> + + * configure.ac: Add check for OSX 10.5, required for macfont.o. + +2013-09-09 Glenn Morris <rgm@gnu.org> + + * configure.ac (LDFLAGS_NOCOMBRELOC): New variable. + (LDFLAGS): Move nocombreloc option from here... + (LD_SWITCH_SYSTEM_TEMACS): ... to here. + +2013-09-08 Glenn Morris <rgm@gnu.org> + + * configure.ac (--without-compress-install): + Rename from --without-compress-info. (Bug#9789) + (GZIP_INFO): Remove. + (GZIP_PROG): Allow --without-compress-install to disable it. + * Makefile.in (GZIP_INFO): Remove all references. + + * info/dir: Tweak emacs-gnutls entry. + +2013-09-07 Paul Eggert <eggert@cs.ucla.edu> + + Port --without-x --enable-gcc-warnings to Fedora 19. + * configure.ac (WERROR_CFLAGS): Omit redundant use of + -Wmissing-field-initializers, -Wswitch, -Wtype-limits, + -Wunused-parameter. If there is no window system, also omit + -Wsuggest-attribute=const and -Wsuggest-attribute=noreturn; this + is needed for Fedora 19. + 2013-09-05 Dmitry Antipov <dmantipov@yandex.ru> Make --without-x compatible with --enable-gcc-warnings. @@ -117,19 +117,7 @@ packages. Note that if there is a separate `dev' or `devel' package, for use at compilation time rather than run time, you will need that as well as the corresponding run time package; typically the dev package will contain header files and a library archive. Otherwise, -you can download and build libraries from sources. - -The sources of these libraries are available by anonymous CVS from -cvs.m17n.org. - - % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/m17n login - % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/m17n co m17n-db - % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/m17n co m17n-lib - % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/m17n co libotf - -For m17n-lib, if you have problems with making the whole package -because you lack some other packages on which m17n-lib depends, try to -configure it with the option "--without-gui". +you can download the libraries from <http://www.nongnu.org/m17n/>. Note that Emacs cannot support complex scripts on a TTY, unless the terminal includes such a support. @@ -176,7 +164,7 @@ does not provide them): . libpng for PNG: http://www.libpng.org/ . libz (for PNG): http://www.zlib.net/ . libjpeg for JPEG: http://www.ijg.org/ - . libtiff for TIFF: http://www.libtiff.org/ + . libtiff for TIFF: http://www.remotesensing.org/libtiff/ . libgif for GIF: http://sourceforge.net/projects/giflib/ Emacs will configure itself to build with these libraries if the diff --git a/Makefile.in b/Makefile.in index 204099cc202..c6254fd6098 100644 --- a/Makefile.in +++ b/Makefile.in @@ -259,8 +259,6 @@ LN_S_FILEONLY = @LN_S_FILEONLY@ # We use gzip to compress installed .el files. GZIP_PROG = @GZIP_PROG@ -# If non-nil, gzip the installed Info and man pages. -GZIP_INFO = @GZIP_INFO@ # ============================= Targets ============================== @@ -662,7 +660,7 @@ install-info: info for f in `ls $$elt $$elt-[1-9] $$elt-[1-9][0-9] 2>/dev/null`; do \ (cd $${thisdir}; \ ${INSTALL_DATA} ${srcdir}/info/$$f $(DESTDIR)${infodir}/$$f); \ - ( [ -n "${GZIP_INFO}" ] && [ -n "${GZIP_PROG}" ] ) || continue ; \ + [ -n "${GZIP_PROG}" ] || continue ; \ rm -f $(DESTDIR)${infodir}/$$f.gz; \ ${GZIP_PROG} -9n $(DESTDIR)${infodir}/$$f; \ done; \ @@ -684,7 +682,7 @@ install-man: dest=`echo "$${page}" | sed -e 's/\.1$$//' -e '$(TRANSFORM)'`.1; \ (cd $${thisdir}; \ ${INSTALL_DATA} ${mansrcdir}/$${page} $(DESTDIR)${man1dir}/$${dest}); \ - ( [ -n "${GZIP_INFO}" ] && [ -n "${GZIP_PROG}" ] ) || continue ; \ + [ -n "${GZIP_PROG}" ] || continue ; \ rm -f $(DESTDIR)${man1dir}/$${dest}.gz; \ ${GZIP_PROG} -9n $(DESTDIR)${man1dir}/$${dest} || true; \ done @@ -754,12 +752,12 @@ uninstall: uninstall-$(NTDIR) uninstall-doc for elt in ${INFO_NONMISC} $${info_misc}; do \ (cd $${thisdir}; \ $(INSTALL_INFO) --remove --info-dir=$(DESTDIR)${infodir} $(DESTDIR)${infodir}/$$elt); \ - if [ -n "${GZIP_INFO}" ] && [ -n "${GZIP_PROG}" ]; then \ + if [ -n "${GZIP_PROG}" ]; then \ ext=.gz; else ext=; fi; \ rm -f $$elt$$ext $$elt-[1-9]$$ext $$elt-[1-9][0-9]$$ext; \ done; \ fi) - (if [ -n "${GZIP_INFO}" ] && [ -n "${GZIP_PROG}" ]; then \ + (if [ -n "${GZIP_PROG}" ]; then \ ext=.gz; else ext=; fi; \ if cd ${mansrcdir}; then \ for page in *.1; do \ diff --git a/admin/FOR-RELEASE b/admin/FOR-RELEASE index c578d3d37e1..ea496e16cf0 100644 --- a/admin/FOR-RELEASE +++ b/admin/FOR-RELEASE @@ -68,7 +68,6 @@ I think this is different to what you get if you just use eg `make emacs.pdf' (e.g., enable "smallbook"). ** Check the keybindings in the refcards are correct, and add any new ones. -Regenerate the pdf versions in etc/refcards/. What paper size are the English versions supposed to be on? On Debian testing, the packages texlive-lang-czechslovak and texlive-lang-polish will let you generate the cs-* and sk-* pdfs. @@ -138,7 +137,7 @@ SECTION READERS ---------------------------------- TUTORIAL cyd TUTORIAL.bg ogi -TUTORIAL.cn +TUTORIAL.cn xfq TUTORIAL.cs TUTORIAL.de wl TUTORIAL.eo @@ -146,7 +145,7 @@ TUTORIAL.es TUTORIAL.fr TUTORIAL.he eliz TUTORIAL.it -TUTORIAL.ja +TUTORIAL.ja TUTORIAL.ko TUTORIAL.nl Pieter Schoenmakers TUTORIAL.pl diff --git a/autogen/Makefile.in b/autogen/Makefile.in index f26d3dce212..19904e8631e 100644 --- a/autogen/Makefile.in +++ b/autogen/Makefile.in @@ -677,7 +677,6 @@ GSETTINGS_LIBS = @GSETTINGS_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_OBJ = @GTK_OBJ@ -GZIP_INFO = @GZIP_INFO@ GZIP_PROG = @GZIP_PROG@ HAVE_ALPHASORT = @HAVE_ALPHASORT@ HAVE_ATOLL = @HAVE_ATOLL@ diff --git a/autogen/config.in b/autogen/config.in index a8ca66e22c8..c68a257f31c 100644 --- a/autogen/config.in +++ b/autogen/config.in @@ -127,6 +127,20 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ */ #undef FIRST_PTY_LETTER +/* Without the following workaround, Emacs runs slowly on OS X 10.8. + The workaround disables some useful run-time checking, so it + should be conditional to the platforms with the performance bug. + Perhaps Apple will fix this some day; also see m4/extern-inline.m4. */ +#if defined __APPLE__ && defined __GNUC__ +# ifndef _DONT_USE_CTYPE_INLINE_ +# define _DONT_USE_CTYPE_INLINE_ +# endif +# ifndef _FORTIFY_SOURCE +# define _FORTIFY_SOURCE 0 +# endif +#endif + + /* Enable compile-time and run-time bounds-checking, and some warnings, without upsetting glibc 2.15+. */ #if !defined _FORTIFY_SOURCE && defined __OPTIMIZE__ && __OPTIMIZE__ @@ -604,9 +618,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ /* Define to 1 if you have the `gtk_window_set_has_resize_grip' function. */ #undef HAVE_GTK_WINDOW_SET_HAS_RESIZE_GRIP -/* Define to 1 if you have the `g_type_init' function. */ -#undef HAVE_G_TYPE_INIT - /* Define to 1 if netdb.h declares h_errno. */ #undef HAVE_H_ERRNO @@ -1091,6 +1102,9 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ /* Define to 1 if you have the <utmp.h> header file. */ #undef HAVE_UTMP_H +/* Define to 1 if you have the <valgrind/valgrind.h> header file. */ +#undef HAVE_VALGRIND_VALGRIND_H + /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK @@ -1645,20 +1659,28 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ 'reference to static identifier "f" in extern inline function'. This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16. - Suppress the use of extern inline on Apple's platforms, as Libc at least - through Libc-825.26 (2013-04-09) is incompatible with it; see, e.g., + Suppress the use of extern inline on problematic Apple configurations, as + Libc at least through Libc-825.26 (2013-04-09) mishandles it; see, e.g., <http://lists.gnu.org/archive/html/bug-gnulib/2012-12/msg00023.html>. Perhaps Apple will fix this some day. */ +#if (defined __APPLE__ \ + && ((! defined _DONT_USE_CTYPE_INLINE_ \ + && (defined __GNUC__ || defined __cplusplus)) \ + || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \ + && defined __GNUC__ && ! defined __cplusplus))) +# define _GL_EXTERN_INLINE_APPLE_BUG +#endif #if ((__GNUC__ \ ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \ : (199901L <= __STDC_VERSION__ \ && !defined __HP_cc \ && !(defined __SUNPRO_C && __STDC__))) \ - && !defined __APPLE__) + && !defined _GL_EXTERN_INLINE_APPLE_BUG) # define _GL_INLINE inline # define _GL_EXTERN_INLINE extern inline +# define _GL_EXTERN_INLINE_IN_USE #elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \ - && !defined __APPLE__) + && !defined _GL_EXTERN_INLINE_APPLE_BUG) # if __GNUC_GNU_INLINE__ /* __gnu_inline__ suppresses a GCC 4.2 diagnostic. */ # define _GL_INLINE extern inline __attribute__ ((__gnu_inline__)) @@ -1666,6 +1688,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ # define _GL_INLINE extern inline # endif # define _GL_EXTERN_INLINE extern +# define _GL_EXTERN_INLINE_IN_USE #else # define _GL_INLINE static _GL_UNUSED # define _GL_EXTERN_INLINE static _GL_UNUSED diff --git a/autogen/configure b/autogen/configure index 61c03785f61..5da983cdd72 100755 --- a/autogen/configure +++ b/autogen/configure @@ -1407,8 +1407,8 @@ GZIP_PROG INSTALL_INFO LN_S_FILEONLY GNULIB_WARN_CFLAGS -WARN_CFLAGS WERROR_CFLAGS +WARN_CFLAGS RANLIB ARFLAGS AR @@ -1442,7 +1442,6 @@ build_vendor build_cpu build PROFILING_CFLAGS -GZIP_INFO cache_file am__untar am__tar @@ -1545,7 +1544,7 @@ with_gnutls with_zlib with_file_notification with_makeinfo -with_compress_info +with_compress_install with_pkg_config_prog with_gameuser with_gnustep_conf @@ -2278,7 +2277,9 @@ Optional Packages: use a file notification library (LIB one of: yes, gfile, inotify, w32, no) --without-makeinfo don't require makeinfo for building manuals - --without-compress-info don't compress the installed Info pages + --without-compress-install + don't compress some files (.el, .info, etc.) when + installing. Equivalent to: make GZIP_PROG= install --with-pkg-config-prog=FILENAME file name of pkg-config for finding GTK and librsvg --with-gameuser=USER user for shared game score files @@ -4429,17 +4430,11 @@ fi ## This is an option because I do not know if all info/man support ## compressed files, nor how to test if they do so. -# Check whether --with-compress-info was given. -if test "${with_compress_info+set}" = set; then : - withval=$with_compress_info; -else - with_compress_info=$with_features -fi - -if test $with_compress_info = yes; then - GZIP_INFO=yes +# Check whether --with-compress-install was given. +if test "${with_compress_install+set}" = set; then : + withval=$with_compress_install; else - GZIP_INFO= + with_compress_install=$with_features fi @@ -4628,6 +4623,17 @@ case "${srcdir}" in * ) srcdir=`(cd "$srcdir"; pwd)` ;; esac +#### When building with MinGW inside the MSYS tree, 'pwd' produces +#### directories relative to the root of the MSYS tree, +#### e.g. '/home/user/foo' instead of '/d/MSYS/home/user/foo'. When +#### such a value of srcdir is written to the top-level Makefile, it +#### gets propagated to src/epaths.h, and that causes temacs to fail, +#### because, being a MinGW program that knows nothing of MSYS root +#### substitution, it cannot find the data directory. "pwd -W" +#### produces Windows-style 'd:/foo/bar' absolute directory names, so +#### we use it here to countermand that lossage. +test "$MSYSTEM" = "MINGW32" && srcdir=`(cd "$srcdir"; pwd -W | sed -e 's,^\([A-Za-z]\):,/\1,')` + ### Canonicalize the configuration name. # Make sure we can run config.sub. @@ -7539,23 +7545,45 @@ fi # Otherwise, run RUN-IF-NOT-FOUND. +# clang is unduly picky about some things. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler is clang" >&5 +$as_echo_n "checking whether the compiler is clang... " >&6; } +if test "${emacs_cv_clang+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #ifndef __clang__ + #error "not clang" + #endif + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + emacs_cv_clang=yes +else + emacs_cv_clang=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $emacs_cv_clang" >&5 +$as_echo "$emacs_cv_clang" >&6; } + # When compiling with GCC, prefer -isystem to -I when including system # include files, to avoid generating useless diagnostics for the files. if test "$gl_gcc_warnings" != yes; then isystem='-I' -else - isystem='-isystem ' - - # This, $nw, is the list of warnings we disable. - nw= - - case $with_x_toolkit in - lucid | athena | motif) - # Old toolkits mishandle 'const'. - nw="$nw -Wwrite-strings" - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Werror -Wunknown-warning-option" >&5 + if test "$emacs_cv_clang" = yes + then + # Turn off some warnings if supported. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Werror -Wunknown-warning-option" >&5 $as_echo_n "checking whether C compiler handles -Werror -Wunknown-warning-option... " >&6; } if test "${gl_cv_warn_c__Werror__Wunknown_warning_option+set}" = set; then : $as_echo_n "(cached) " >&6 @@ -7574,12 +7602,13 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO"; then : gl_cv_warn_c__Werror__Wunknown_warning_option=yes else gl_cv_warn_c__Werror__Wunknown_warning_option=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi @@ -7592,6 +7621,130 @@ else fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Wno-switch" >&5 +$as_echo_n "checking whether C compiler handles -Wno-switch... " >&6; } +if test "${gl_cv_warn_c__Wno_switch+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + gl_save_compiler_FLAGS="$CFLAGS" + as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Wswitch" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gl_cv_warn_c__Wno_switch=yes +else + gl_cv_warn_c__Wno_switch=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$gl_save_compiler_FLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Wno_switch" >&5 +$as_echo "$gl_cv_warn_c__Wno_switch" >&6; } +if test "x$gl_cv_warn_c__Wno_switch" = x""yes; then : + as_fn_append WARN_CFLAGS " -Wno-switch" +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Wno-tautological-constant-out-of-range-compare" >&5 +$as_echo_n "checking whether C compiler handles -Wno-tautological-constant-out-of-range-compare... " >&6; } +if test "${gl_cv_warn_c__Wno_tautological_constant_out_of_range_compare+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + gl_save_compiler_FLAGS="$CFLAGS" + as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Wtautological-constant-out-of-range-compare" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gl_cv_warn_c__Wno_tautological_constant_out_of_range_compare=yes +else + gl_cv_warn_c__Wno_tautological_constant_out_of_range_compare=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$gl_save_compiler_FLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Wno_tautological_constant_out_of_range_compare" >&5 +$as_echo "$gl_cv_warn_c__Wno_tautological_constant_out_of_range_compare" >&6; } +if test "x$gl_cv_warn_c__Wno_tautological_constant_out_of_range_compare" = x""yes; then : + as_fn_append WARN_CFLAGS " -Wno-tautological-constant-out-of-range-compare" +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Wno-pointer-sign" >&5 +$as_echo_n "checking whether C compiler handles -Wno-pointer-sign... " >&6; } +if test "${gl_cv_warn_c__Wno_pointer_sign+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + gl_save_compiler_FLAGS="$CFLAGS" + as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Wpointer-sign" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gl_cv_warn_c__Wno_pointer_sign=yes +else + gl_cv_warn_c__Wno_pointer_sign=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$gl_save_compiler_FLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Wno_pointer_sign" >&5 +$as_echo "$gl_cv_warn_c__Wno_pointer_sign" >&6; } +if test "x$gl_cv_warn_c__Wno_pointer_sign" = x""yes; then : + as_fn_append WARN_CFLAGS " -Wno-pointer-sign" +fi + + + fi +else + isystem='-isystem ' + + # This, $nw, is the list of warnings we disable. + nw= + + case $with_x_toolkit in + lucid | athena | motif) + # Old toolkits mishandle 'const'. + nw="$nw -Wwrite-strings" + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Werror" >&5 $as_echo_n "checking whether C compiler handles -Werror... " >&6; } if test "${gl_cv_warn_c__Werror+set}" = set; then : @@ -7611,12 +7764,13 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO"; then : gl_cv_warn_c__Werror=yes else gl_cv_warn_c__Werror=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi @@ -7656,36 +7810,13 @@ fi # The following line should be removable at some point. nw="$nw -Wsuggest-attribute=pure" - # clang is unduly picky about some things. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler is clang" >&5 -$as_echo_n "checking whether the compiler is clang... " >&6; } -if test "${emacs_cv_clang+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #ifndef __clang__ - #error "not clang" - #endif - -int -main () -{ + # This part is merely for shortening the command line, + # since -Wno-FOO needs to be added below regardless. + nw="$nw -Wmissing-field-initializers" + nw="$nw -Wswitch" + nw="$nw -Wtype-limits" + nw="$nw -Wunused-parameter" - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - emacs_cv_clang=yes -else - emacs_cv_clang=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $emacs_cv_clang" >&5 -$as_echo "$emacs_cv_clang" >&6; } if test $emacs_cv_clang = yes; then nw="$nw -Wcast-align" fi @@ -7909,6 +8040,8 @@ $as_echo "$gl_cv_cc_uninitialized_supported" >&6; } -Wvla \ -Wvolatile-register-var \ -Wwrite-strings \ + -fdiagnostics-show-option \ + -funit-at-a-time \ \ ; do gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item" @@ -7966,12 +8099,13 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO"; then : eval "$as_gl_Warn=yes" else eval "$as_gl_Warn=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi @@ -8005,12 +8139,13 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO"; then : gl_cv_warn_c__Wno_missing_field_initializers=yes else gl_cv_warn_c__Wno_missing_field_initializers=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi @@ -8041,12 +8176,13 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO"; then : gl_cv_warn_c__Wno_sign_compare=yes else gl_cv_warn_c__Wno_sign_compare=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi @@ -8077,12 +8213,13 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO"; then : gl_cv_warn_c__Wno_type_limits=yes else gl_cv_warn_c__Wno_type_limits=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi @@ -8113,12 +8250,13 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO"; then : gl_cv_warn_c__Wno_switch=yes else gl_cv_warn_c__Wno_switch=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi @@ -8149,12 +8287,13 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO"; then : gl_cv_warn_c__Wno_unused_parameter=yes else gl_cv_warn_c__Wno_unused_parameter=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi @@ -8185,12 +8324,13 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO"; then : gl_cv_warn_c__Wno_format_nonliteral=yes else gl_cv_warn_c__Wno_format_nonliteral=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi @@ -8224,12 +8364,13 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO"; then : gl_cv_warn_c__Wno_logical_op=yes else gl_cv_warn_c__Wno_logical_op=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi @@ -8263,12 +8404,13 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO"; then : gl_cv_warn_c__Wno_format_extra_args=yes else gl_cv_warn_c__Wno_format_extra_args=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi @@ -8299,12 +8441,13 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO"; then : gl_cv_warn_c__Wno_tautological_constant_out_of_range_compare=yes else gl_cv_warn_c__Wno_tautological_constant_out_of_range_compare=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi @@ -8335,12 +8478,13 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO"; then : gl_cv_warn_c__Wno_unused_command_line_argument=yes else gl_cv_warn_c__Wno_unused_command_line_argument=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi @@ -8371,12 +8515,13 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_link "$LINENO"; then : gl_cv_warn_c__Wno_unused_value=yes else gl_cv_warn_c__Wno_unused_value=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS="$gl_save_compiler_FLAGS" fi @@ -8390,79 +8535,6 @@ fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -fdiagnostics-show-option" >&5 -$as_echo_n "checking whether C compiler handles -fdiagnostics-show-option... " >&6; } -if test "${gl_cv_warn_c__fdiagnostics_show_option+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - - gl_save_compiler_FLAGS="$CFLAGS" - as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -fdiagnostics-show-option" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_warn_c__fdiagnostics_show_option=yes -else - gl_cv_warn_c__fdiagnostics_show_option=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CFLAGS="$gl_save_compiler_FLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__fdiagnostics_show_option" >&5 -$as_echo "$gl_cv_warn_c__fdiagnostics_show_option" >&6; } -if test "x$gl_cv_warn_c__fdiagnostics_show_option" = x""yes; then : - as_fn_append WARN_CFLAGS " -fdiagnostics-show-option" -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -funit-at-a-time" >&5 -$as_echo_n "checking whether C compiler handles -funit-at-a-time... " >&6; } -if test "${gl_cv_warn_c__funit_at_a_time+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - - gl_save_compiler_FLAGS="$CFLAGS" - as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -funit-at-a-time" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gl_cv_warn_c__funit_at_a_time=yes -else - gl_cv_warn_c__funit_at_a_time=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CFLAGS="$gl_save_compiler_FLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__funit_at_a_time" >&5 -$as_echo "$gl_cv_warn_c__funit_at_a_time" >&6; } -if test "x$gl_cv_warn_c__funit_at_a_time" = x""yes; then : - as_fn_append WARN_CFLAGS " -funit-at-a-time" -fi - - - - $as_echo "#define lint 1" >>confdefs.h @@ -8611,6 +8683,9 @@ fi +test $with_compress_install != yes && test -n "$GZIP_PROG" && \ + GZIP_PROG=" # $GZIP_PROG # (disabled by configure --without-compress-install)" + if test $opsys = gnu-linux; then # Extract the first word of "paxctl", so it can be a program name with args. set dummy paxctl; ac_word=$2 @@ -8774,13 +8849,15 @@ else fi -late_LDFLAGS=$LDFLAGS +late_LDFLAGS="$LDFLAGS" if test x$GCC = xyes; then - LDFLAGS="$LDFLAGS -Wl,-znocombreloc" + LDFLAGS_NOCOMBRELOC="-Wl,-znocombreloc" else - LDFLAGS="$LDFLAGS -znocombreloc" + LDFLAGS_NOCOMBRELOC="-znocombreloc" fi +LDFLAGS="$LDFLAGS $LDFLAGS_NOCOMBRELOC" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -znocombreloc" >&5 $as_echo_n "checking for -znocombreloc... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -8798,13 +8875,14 @@ if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else - LDFLAGS=$late_LDFLAGS + LDFLAGS_NOCOMBRELOC= { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext +LDFLAGS="$late_LDFLAGS" test "x$CANNOT_DUMP" = "x" && CANNOT_DUMP=no case "$opsys" in @@ -10033,7 +10111,11 @@ fi - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + macfont_file="" + if test "${NS_IMPL_COCOA}" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OSX 10.4 or newer" >&5 +$as_echo_n "checking for OSX 10.4 or newer... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <AppKit/AppKit.h> int @@ -10058,6 +10140,45 @@ else ns_osx_have_104=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ns_osx_have_104" >&5 +$as_echo "$ns_osx_have_104" >&6; } + + if test $ns_osx_have_104 = no; then + as_fn_error "\`OSX 10.4 or newer is required'" "$LINENO" 5; + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OSX 10.5 or newer" >&5 +$as_echo_n "checking for OSX 10.5 or newer... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <AppKit/AppKit.h> +int +main () +{ + +#ifdef MAC_OS_X_VERSION_MAX_ALLOWED +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1050 + ; /* OK */ +#else +#error "OSX 10.5 not found" +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ns_osx_have_105=yes +else + ns_osx_have_105=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ns_osx_have_105" >&5 +$as_echo "$ns_osx_have_105" >&6; } + if test $ns_osx_have_105 = yes; then + macfont_file="macfont.o" + fi + fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <Foundation/NSObjCRuntime.h> @@ -10075,9 +10196,6 @@ else ns_have_nsinteger=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - if test $ns_osx_have_104 = no; then - as_fn_error "\`OSX 10.4 or newer is required'" "$LINENO" 5; - fi if test $ns_have_nsinteger = yes; then $as_echo "#define NS_HAVE_NSINTEGER 1" >>confdefs.h @@ -10112,7 +10230,8 @@ if test "${HAVE_NS}" = yes; then leimdir="\${ns_appresdir}/leim" INSTALL_ARCH_INDEP_EXTRA= fi - NS_OBJC_OBJ="nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o" + + NS_OBJC_OBJ="nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o $macfont_file" fi CFLAGS="$tmp_CFLAGS" CPPFLAGS="$tmp_CPPFLAGS" @@ -10340,6 +10459,140 @@ fi ## $window_system is now set to the window system we will ## ultimately use. +if test "$window_system" = none && test "$gl_gcc_warnings" = yes; then + # Too many warnings for now. + nw= + nw="$nw -Wsuggest-attribute=const" + nw="$nw -Wsuggest-attribute=noreturn" + + gl_warn_set= + set x $WARN_CFLAGS; shift + for gl_warn_item + do + case " $nw " in + *" $gl_warn_item "*) + ;; + *) + gl_warn_set="$gl_warn_set $gl_warn_item" + ;; + esac + done + WARN_CFLAGS=$gl_warn_set + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Wno-unused-variable" >&5 +$as_echo_n "checking whether C compiler handles -Wno-unused-variable... " >&6; } +if test "${gl_cv_warn_c__Wno_unused_variable+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + gl_save_compiler_FLAGS="$CFLAGS" + as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Wunused-variable" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gl_cv_warn_c__Wno_unused_variable=yes +else + gl_cv_warn_c__Wno_unused_variable=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$gl_save_compiler_FLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Wno_unused_variable" >&5 +$as_echo "$gl_cv_warn_c__Wno_unused_variable" >&6; } +if test "x$gl_cv_warn_c__Wno_unused_variable" = x""yes; then : + as_fn_append WARN_CFLAGS " -Wno-unused-variable" +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Wno-unused-but-set-variable" >&5 +$as_echo_n "checking whether C compiler handles -Wno-unused-but-set-variable... " >&6; } +if test "${gl_cv_warn_c__Wno_unused_but_set_variable+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + gl_save_compiler_FLAGS="$CFLAGS" + as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Wunused-but-set-variable" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gl_cv_warn_c__Wno_unused_but_set_variable=yes +else + gl_cv_warn_c__Wno_unused_but_set_variable=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$gl_save_compiler_FLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Wno_unused_but_set_variable" >&5 +$as_echo "$gl_cv_warn_c__Wno_unused_but_set_variable" >&6; } +if test "x$gl_cv_warn_c__Wno_unused_but_set_variable" = x""yes; then : + as_fn_append WARN_CFLAGS " -Wno-unused-but-set-variable" +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Wno-unused-but-set-parameter" >&5 +$as_echo_n "checking whether C compiler handles -Wno-unused-but-set-parameter... " >&6; } +if test "${gl_cv_warn_c__Wno_unused_but_set_parameter+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + gl_save_compiler_FLAGS="$CFLAGS" + as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Wunused-but-set-parameter" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gl_cv_warn_c__Wno_unused_but_set_parameter=yes +else + gl_cv_warn_c__Wno_unused_but_set_parameter=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$gl_save_compiler_FLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Wno_unused_but_set_parameter" >&5 +$as_echo "$gl_cv_warn_c__Wno_unused_but_set_parameter" >&6; } +if test "x$gl_cv_warn_c__Wno_unused_but_set_parameter" = x""yes; then : + as_fn_append WARN_CFLAGS " -Wno-unused-but-set-parameter" +fi + + +fi + term_header= HAVE_X_WINDOWS=no HAVE_X11=no @@ -11934,17 +12187,6 @@ $as_echo "no" >&6; } SAVE_LIBS="$LIBS" CFLAGS="$SETTINGS_CFLAGS $CFLAGS" LIBS="$SETTINGS_LIBS $LIBS" - for ac_func in g_type_init -do : - ac_fn_c_check_func "$LINENO" "g_type_init" "ac_cv_func_g_type_init" -if test "x$ac_cv_func_g_type_init" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_G_TYPE_INIT 1 -_ACEOF - -fi -done - CFLAGS="$SAVE_CFLAGS" LIBS="$SAVE_LIBS" fi @@ -15892,6 +16134,19 @@ fi +for ac_header in valgrind/valgrind.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "valgrind/valgrind.h" "ac_cv_header_valgrind_valgrind_h" "$ac_includes_default" +if test "x$ac_cv_header_valgrind_valgrind_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_VALGRIND_VALGRIND_H 1 +_ACEOF + +fi + +done + + @@ -17381,6 +17636,8 @@ fi + + # Configure gnulib. Although this does not affect CFLAGS or LIBS permanently. # it temporarily reverts them to their pre-pkg-config values, # because gnulib needs to work with both src (which uses the @@ -28913,6 +29170,8 @@ if test x$ac_enable_profiling != x ; then esac fi +LD_SWITCH_SYSTEM_TEMACS="$LDFLAGS_NOCOMBRELOC $LD_SWITCH_SYSTEM_TEMACS" + ## MinGW-specific post-link processing of temacs. diff --git a/configure.ac b/configure.ac index 1e650105244..73185acac39 100644 --- a/configure.ac +++ b/configure.ac @@ -266,13 +266,9 @@ AC_SUBST(cache_file) ## This is an option because I do not know if all info/man support ## compressed files, nor how to test if they do so. -OPTION_DEFAULT_ON([compress-info],[don't compress the installed Info pages]) -if test $with_compress_info = yes; then - GZIP_INFO=yes -else - GZIP_INFO= -fi -AC_SUBST(GZIP_INFO) +OPTION_DEFAULT_ON([compress-install], + [don't compress some files (.el, .info, etc.) when installing. Equivalent to: +make GZIP_PROG= install]) AC_ARG_WITH([pkg-config-prog],dnl [AS_HELP_STRING([--with-pkg-config-prog=FILENAME], @@ -447,6 +443,17 @@ case "${srcdir}" in * ) srcdir=`(cd "$srcdir"; pwd)` ;; esac +#### When building with MinGW inside the MSYS tree, 'pwd' produces +#### directories relative to the root of the MSYS tree, +#### e.g. '/home/user/foo' instead of '/d/MSYS/home/user/foo'. When +#### such a value of srcdir is written to the top-level Makefile, it +#### gets propagated to src/epaths.h, and that causes temacs to fail, +#### because, being a MinGW program that knows nothing of MSYS root +#### substitution, it cannot find the data directory. "pwd -W" +#### produces Windows-style 'd:/foo/bar' absolute directory names, so +#### we use it here to countermand that lossage. +test "$MSYSTEM" = "MINGW32" && srcdir=`(cd "$srcdir"; pwd -W | sed -e 's,^\([[A-Za-z]]\):,/\1,')` + ### Canonicalize the configuration name. AC_CANONICAL_HOST @@ -780,10 +787,28 @@ AC_DEFUN([gl_GCC_VERSION_IFELSE], ] ) +# clang is unduly picky about some things. +AC_CACHE_CHECK([whether the compiler is clang], [emacs_cv_clang], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[ + #ifndef __clang__ + #error "not clang" + #endif + ]])], + [emacs_cv_clang=yes], + [emacs_cv_clang=no])]) + # When compiling with GCC, prefer -isystem to -I when including system # include files, to avoid generating useless diagnostics for the files. if test "$gl_gcc_warnings" != yes; then isystem='-I' + if test "$emacs_cv_clang" = yes + then + # Turn off some warnings if supported. + gl_WARN_ADD([-Wno-switch]) + gl_WARN_ADD([-Wno-tautological-constant-out-of-range-compare]) + gl_WARN_ADD([-Wno-pointer-sign]) + fi else isystem='-isystem ' @@ -826,16 +851,13 @@ else # The following line should be removable at some point. nw="$nw -Wsuggest-attribute=pure" - # clang is unduly picky about some things. - AC_CACHE_CHECK([whether the compiler is clang], [emacs_cv_clang], - [AC_COMPILE_IFELSE( - [AC_LANG_PROGRAM([[ - #ifndef __clang__ - #error "not clang" - #endif - ]])], - [emacs_cv_clang=yes], - [emacs_cv_clang=no])]) + # This part is merely for shortening the command line, + # since -Wno-FOO needs to be added below regardless. + nw="$nw -Wmissing-field-initializers" + nw="$nw -Wswitch" + nw="$nw -Wtype-limits" + nw="$nw -Wunused-parameter" + if test $emacs_cv_clang = yes; then nw="$nw -Wcast-align" fi @@ -864,9 +886,6 @@ else gl_WARN_ADD([-Wno-unused-value]) fi - gl_WARN_ADD([-fdiagnostics-show-option]) - gl_WARN_ADD([-funit-at-a-time]) - AC_DEFINE([lint], [1], [Define to 1 if the compiler is checking for lint.]) AH_VERBATIM([FORTIFY_SOURCE], [/* Enable compile-time and run-time bounds-checking, and some warnings, @@ -943,6 +962,9 @@ AC_PATH_PROG(INSTALL_INFO, install-info, :, dnl Don't use GZIP, which is used by gzip for additional parameters. AC_PATH_PROG(GZIP_PROG, gzip) +test $with_compress_install != yes && test -n "$GZIP_PROG" && \ + GZIP_PROG=" # $GZIP_PROG # (disabled by configure --without-compress-install)" + if test $opsys = gnu-linux; then AC_PATH_PROG(PAXCTL, paxctl,, [$PATH$PATH_SEPARATOR/sbin$PATH_SEPARATOR/usr/sbin]) @@ -1020,19 +1042,30 @@ dnl (Don't use `-z nocombreloc' as -z takes no arg on Irix.) dnl Treat GCC specially since it just gives a non-fatal `unrecognized option' dnl if not built to support GNU ld. -late_LDFLAGS=$LDFLAGS +dnl For a long time, -znocombreloc was added to LDFLAGS rather than +dnl LD_SWITCH_SYSTEM_TEMACS. That is: +dnl * inappropriate, as LDFLAGS is a user option but this is essential. +dnl Eg "make LDFLAGS=... all" could run into problems, +dnl http://bugs.debian.org/684788 +dnl * unnecessary, since temacs is the only thing that actually needs it. +dnl Indeed this is where it was originally, prior to: +dnl http://lists.gnu.org/archive/html/emacs-pretest-bug/2004-03/msg00170.html +late_LDFLAGS="$LDFLAGS" if test x$GCC = xyes; then - LDFLAGS="$LDFLAGS -Wl,-znocombreloc" + LDFLAGS_NOCOMBRELOC="-Wl,-znocombreloc" else - LDFLAGS="$LDFLAGS -znocombreloc" + LDFLAGS_NOCOMBRELOC="-znocombreloc" fi +LDFLAGS="$LDFLAGS $LDFLAGS_NOCOMBRELOC" + AC_MSG_CHECKING([for -znocombreloc]) AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], [AC_MSG_RESULT(yes)], - LDFLAGS=$late_LDFLAGS + LDFLAGS_NOCOMBRELOC= [AC_MSG_RESULT(no)]) +LDFLAGS="$late_LDFLAGS" dnl The function dump-emacs will not be defined and temacs will do dnl (load "loadup") automatically unless told otherwise. @@ -1606,7 +1639,10 @@ fail; [AC_MSG_ERROR([`--with-ns' was specified, but the include files are missing or cannot be compiled.])]) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <AppKit/AppKit.h>], + macfont_file="" + if test "${NS_IMPL_COCOA}" = "yes"; then + AC_MSG_CHECKING([for OSX 10.4 or newer]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <AppKit/AppKit.h>], [ #ifdef MAC_OS_X_VERSION_MAX_ALLOWED #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1040 @@ -1618,13 +1654,33 @@ fail; ])], ns_osx_have_104=yes, ns_osx_have_104=no) + AC_MSG_RESULT([$ns_osx_have_104]) + + if test $ns_osx_have_104 = no; then + AC_MSG_ERROR([`OSX 10.4 or newer is required']); + fi + AC_MSG_CHECKING([for OSX 10.5 or newer]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <AppKit/AppKit.h>], + [ +#ifdef MAC_OS_X_VERSION_MAX_ALLOWED +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1050 + ; /* OK */ +#else +#error "OSX 10.5 not found" +#endif +#endif + ])], + ns_osx_have_105=yes, + ns_osx_have_105=no) + AC_MSG_RESULT([$ns_osx_have_105]) + if test $ns_osx_have_105 = yes; then + macfont_file="macfont.o" + fi + fi AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <Foundation/NSObjCRuntime.h>], [NSInteger i;])], ns_have_nsinteger=yes, ns_have_nsinteger=no) - if test $ns_osx_have_104 = no; then - AC_MSG_ERROR([`OSX 10.4 or newer is required']); - fi if test $ns_have_nsinteger = yes; then AC_DEFINE(NS_HAVE_NSINTEGER, 1, [Define to 1 if `NSInteger' is defined.]) fi @@ -1660,7 +1716,8 @@ if test "${HAVE_NS}" = yes; then leimdir="\${ns_appresdir}/leim" INSTALL_ARCH_INDEP_EXTRA= fi - NS_OBJC_OBJ="nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o" + + NS_OBJC_OBJ="nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o $macfont_file" fi CFLAGS="$tmp_CFLAGS" CPPFLAGS="$tmp_CPPFLAGS" @@ -1777,6 +1834,11 @@ fi if test "$window_system" = none && test "$gl_gcc_warnings" = yes; then # Too many warnings for now. + nw= + nw="$nw -Wsuggest-attribute=const" + nw="$nw -Wsuggest-attribute=noreturn" + gl_MANYWARN_COMPLEMENT([WARN_CFLAGS], [$WARN_CFLAGS], [$nw]) + gl_WARN_ADD([-Wno-unused-variable]) gl_WARN_ADD([-Wno-unused-but-set-variable]) gl_WARN_ADD([-Wno-unused-but-set-parameter]) @@ -2340,7 +2402,6 @@ if test "$HAVE_GSETTINGS" = "yes" || test "$HAVE_GCONF" = "yes"; then SAVE_LIBS="$LIBS" CFLAGS="$SETTINGS_CFLAGS $CFLAGS" LIBS="$SETTINGS_LIBS $LIBS" - AC_CHECK_FUNCS([g_type_init]) CFLAGS="$SAVE_CFLAGS" LIBS="$SAVE_LIBS" fi @@ -3631,6 +3692,8 @@ AC_SUBST(KRB5LIB) AC_SUBST(DESLIB) AC_SUBST(KRB4LIB) +AC_CHECK_HEADERS(valgrind/valgrind.h) + AC_CHECK_FUNCS_ONCE(tzset) AC_MSG_CHECKING(whether localtime caches TZ) AC_CACHE_VAL(emacs_cv_localtime_cache, @@ -4636,6 +4699,24 @@ AC_SUBST(CYGWIN_OBJ) AC_SUBST(PRE_ALLOC_OBJ) AC_SUBST(POST_ALLOC_OBJ) +dnl Call this 'FORTIFY_SOUR' so that it sorts before the 'FORTIFY_SOURCE' +dnl verbatim defined above. The tricky name is apropos, as this hack +dnl makes Fortify go sour! +AH_VERBATIM([FORTIFY_SOUR], +[/* Without the following workaround, Emacs runs slowly on OS X 10.8. + The workaround disables some useful run-time checking, so it + should be conditional to the platforms with the performance bug. + Perhaps Apple will fix this some day; also see m4/extern-inline.m4. */ +#if defined __APPLE__ && defined __GNUC__ +# ifndef _DONT_USE_CTYPE_INLINE_ +# define _DONT_USE_CTYPE_INLINE_ +# endif +# ifndef _FORTIFY_SOURCE +# define _FORTIFY_SOURCE 0 +# endif +#endif +]) + # Configure gnulib. Although this does not affect CFLAGS or LIBS permanently. # it temporarily reverts them to their pre-pkg-config values, # because gnulib needs to work with both src (which uses the @@ -4718,6 +4799,8 @@ if test x$ac_enable_profiling != x ; then esac fi +LD_SWITCH_SYSTEM_TEMACS="$LDFLAGS_NOCOMBRELOC $LD_SWITCH_SYSTEM_TEMACS" + AC_SUBST(LD_SWITCH_SYSTEM_TEMACS) ## MinGW-specific post-link processing of temacs. diff --git a/doc/emacs/ChangeLog b/doc/emacs/ChangeLog index 7ff13a70718..6b4c12511dd 100644 --- a/doc/emacs/ChangeLog +++ b/doc/emacs/ChangeLog @@ -1,3 +1,18 @@ +2013-09-22 Xue Fuqiao <xfq.free@gmail.com> + + * fixit.texi (Transpose): + (Fixing Case): Remove @refill. + +2013-09-21 Xue Fuqiao <xfq.free@gmail.com> + + * maintaining.texi (VC Directory Commands): Add keybinding for + vc-log-incoming in vc-dir. + (Log Buffer): Use @emph instead of @strong. + +2013-09-12 Xue Fuqiao <xfq.free@gmail.com> + + * text.texi (Enriched Justification): Explain values of default-justification. + 2013-09-04 Xue Fuqiao <xfq.free@gmail.com> * maintaining.texi (VC Ignore): Mention `vc-ignore' with prefix argument. diff --git a/doc/emacs/fixit.texi b/doc/emacs/fixit.texi index b6eb1ed11a2..a6aff77b583 100644 --- a/doc/emacs/fixit.texi +++ b/doc/emacs/fixit.texi @@ -190,7 +190,7 @@ point forward across three other characters. It would change @samp{f@point{}oobar} into @samp{oobf@point{}ar}. This is equivalent to repeating @kbd{C-t} three times. @kbd{C-u - 4 M-t} moves the word before point backward across four words. @kbd{C-u - C-M-t} would cancel -the effect of plain @kbd{C-M-t}.@refill +the effect of plain @kbd{C-M-t}. A numeric argument of zero is assigned a special meaning (because otherwise a command with a repeat count of zero would do nothing): to @@ -216,7 +216,7 @@ Convert last word to lower case with capital initial. the word case-conversion commands @kbd{M-l}, @kbd{M-u} and @kbd{M-c} have a special feature when used with a negative argument: they do not move the cursor. As soon as you see you have mistyped the last word, you can simply -case-convert it and go on typing. @xref{Case}.@refill +case-convert it and go on typing. @xref{Case}. @node Spelling @section Checking and Correcting Spelling diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi index 4a61db5509b..7fd3fb1c9d4 100644 --- a/doc/emacs/maintaining.texi +++ b/doc/emacs/maintaining.texi @@ -599,6 +599,7 @@ the buffer and commit the change, together with your log entry. @cindex Log Edit mode @cindex mode, Log Edit @vindex vc-log-mode-hook +@c FIXME: Mention log-edit-mode-hook here? --xfq The major mode for the @file{*vc-log*} buffer is Log Edit mode, a variant of Text mode (@pxref{Text Mode}). On entering Log Edit mode, Emacs runs the hooks @code{text-mode-hook} and @code{vc-log-mode-hook} @@ -652,7 +653,7 @@ opposite way of working---generating ChangeLog entries from the Log Edit buffer. @end ifnottex - To abort a commit, just @strong{don't} type @kbd{C-c C-c} in that + To abort a commit, just @emph{don't} type @kbd{C-c C-c} in that buffer. You can switch buffers and do other editing. As long as you don't try to make another commit, the entry you were editing remains in the @file{*vc-log*} buffer, and you can go back to that buffer at @@ -1242,7 +1243,7 @@ Revisions}), and @w{@kbd{C-x v u}} (@pxref{VC Undo}). The VC Directory buffer also defines some single-key shortcuts for VC commands with the @kbd{C-x v} prefix: @kbd{=}, @kbd{+}, @kbd{l}, -@kbd{i}, @kbd{D}, @kbd{L}, @kbd{G} and @kbd{v}. +@kbd{i}, @kbd{D}, @kbd{L}, @kbd{G}, @kbd{I} and @kbd{v}. For example, you can commit a set of edited files by opening a VC Directory buffer, where the files are listed with the @samp{edited} diff --git a/doc/emacs/text.texi b/doc/emacs/text.texi index e5743b064fb..b2cb5ee3d3b 100644 --- a/doc/emacs/text.texi +++ b/doc/emacs/text.texi @@ -2086,6 +2086,7 @@ newlines are used for filling. The @key{RET} (@code{newline}) and commands, including Auto Fill (@pxref{Auto Fill}), insert only soft newlines and delete only soft newlines, leaving hard newlines alone. +@c FIXME: I don't see ‘unfilled’ in that node. --xfq Thus, when editing with Enriched mode, you should not use @key{RET} or @kbd{C-o} to break lines in the middle of filled paragraphs. Use Auto Fill mode or explicit fill commands (@pxref{Fill Commands}) @@ -2294,13 +2295,13 @@ commands do nothing on text with this setting. You can, however, still indent the left margin. @end table -@c FIXME: We should explain the effect of these symbols. --xfq @vindex default-justification You can also specify justification styles using the Justification submenu in the Text Properties menu. The default justification style is specified by the per-buffer variable @code{default-justification}. Its value should be one of the symbols @code{left}, @code{right}, -@code{full}, @code{center}, or @code{none}. +@code{full}, @code{center}, or @code{none}; their meanings correspond +to the commands above. @node Enriched Properties @subsection Setting Other Text Properties diff --git a/doc/emacs/trouble.texi b/doc/emacs/trouble.texi index 0d5ce6820c7..34783796899 100644 --- a/doc/emacs/trouble.texi +++ b/doc/emacs/trouble.texi @@ -1140,6 +1140,7 @@ Please help us keep up with the workload by designing the patch in a form that is clearly safe to install. @end itemize +@c FIXME: Include the node above? @node Contributing @section Contributing to Emacs Development @cindex contributing to Emacs diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog index 8b5aa65ff96..2fa3fc13e31 100644 --- a/doc/lispref/ChangeLog +++ b/doc/lispref/ChangeLog @@ -1,3 +1,35 @@ +2013-09-22 Xue Fuqiao <xfq.free@gmail.com> + + * nonascii.texi (Default Coding Systems): Typo fix. + +2013-09-21 Xue Fuqiao <xfq.free@gmail.com> + + * nonascii.texi (Coding System Basics): Add information about carriage-return. + +2013-09-14 Eli Zaretskii <eliz@gnu.org> + + * display.texi (Display Margins): State the units of measuring + margin width. (Bug#15375) + +2013-09-13 Eli Zaretskii <eliz@gnu.org> + + * text.texi (Not Intervals): Minor wording fix. + +2013-09-12 Xue Fuqiao <xfq.free@gmail.com> + + * functions.texi (Obsolete Functions): Add an index for obsolete + functions. + +2013-09-11 Xue Fuqiao <xfq.free@gmail.com> + + * nonascii.texi (Character Properties): Character properties fix + for decimal-digit-value and digit-value. + +2013-09-08 Stefan Monnier <monnier@iro.umontreal.ca> + + * macros.texi (Defining Macros): Prefer "function" to "lambda + expression" (bug#15296). + 2013-08-28 Paul Eggert <eggert@cs.ucla.edu> * Makefile.in (SHELL): Now @SHELL@, not /bin/sh, diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi index ff9d98170d1..8ebf440c9fe 100644 --- a/doc/lispref/display.texi +++ b/doc/lispref/display.texi @@ -4189,13 +4189,15 @@ them a nonzero width. The usual way to do that is to set these variables: @defvar left-margin-width -This variable specifies the width of the left margin. -It is buffer-local in all buffers. +This variable specifies the width of the left margin, in character +cell (a.k.a.@: ``column'') units. It is buffer-local in all buffers. +A value of @code{nil} means no left marginal area. @end defvar @defvar right-margin-width -This variable specifies the width of the right margin. -It is buffer-local in all buffers. +This variable specifies the width of the right margin, in character +cell units. It is buffer-local in all buffers. A value of @code{nil} +means no right marginal area. @end defvar Setting these variables does not immediately affect the window. These @@ -4206,15 +4208,18 @@ Thus, you can make changes take effect by calling You can also set the margin widths immediately. @defun set-window-margins window left &optional right -This function specifies the margin widths for window @var{window}. -The argument @var{left} controls the left margin and -@var{right} controls the right margin (default @code{0}). +This function specifies the margin widths for window @var{window}, in +character cell units. The argument @var{left} controls the left +margin, and @var{right} controls the right margin (default @code{0}). @end defun @defun window-margins &optional window -This function returns the left and right margins of @var{window} -as a cons cell of the form @code{(@var{left} . @var{right})}. -If @var{window} is @code{nil}, the selected window is used. +This function returns the width of the left and right margins of +@var{window} as a cons cell of the form @w{@code{(@var{left} +. @var{right})}}. If one of the two marginal areas does not exist, +its width is returned as @code{nil}; if neither of the two margins exist, +the function returns @code{(nil)}. If @var{window} is @code{nil}, the +selected window is used. @end defun @node Images diff --git a/doc/lispref/functions.texi b/doc/lispref/functions.texi index 39a9ff6b62c..f1d8c54f49c 100644 --- a/doc/lispref/functions.texi +++ b/doc/lispref/functions.texi @@ -1135,6 +1135,7 @@ examining or altering the structure of closure objects. @node Obsolete Functions @section Declaring Functions Obsolete +@cindex obsolete functions You can mark a named function as @dfn{obsolete}, meaning that it may be removed at some point in the future. This causes Emacs to warn diff --git a/doc/lispref/macros.texi b/doc/lispref/macros.texi index 5520bbbd1df..a2526f383aa 100644 --- a/doc/lispref/macros.texi +++ b/doc/lispref/macros.texi @@ -191,8 +191,8 @@ During Compile}). @section Defining Macros A Lisp macro object is a list whose @sc{car} is @code{macro}, and -whose @sc{cdr} is a lambda expression. Expansion of the macro works -by applying the lambda expression (with @code{apply}) to the list of +whose @sc{cdr} is a function. Expansion of the macro works +by applying the function (with @code{apply}) to the list of @emph{unevaluated} arguments from the macro call. It is possible to use an anonymous Lisp macro just like an anonymous diff --git a/doc/lispref/nonascii.texi b/doc/lispref/nonascii.texi index f351829e4cf..94a7bdf1b23 100644 --- a/doc/lispref/nonascii.texi +++ b/doc/lispref/nonascii.texi @@ -478,14 +478,14 @@ unassigned codepoints, the value is the character itself. @item decimal-digit-value Corresponds to the Unicode @code{Numeric_Value} property for -characters whose @code{Numeric_Type} is @samp{Digit}. The value is an -integer number. For unassigned codepoints, the value is @code{nil}, -which means @acronym{NaN}, or ``not-a-number''. +characters whose @code{Numeric_Type} is @samp{Decimal}. The value is +an integer number. For unassigned codepoints, the value is +@code{nil}, which means @acronym{NaN}, or ``not-a-number''. @item digit-value Corresponds to the Unicode @code{Numeric_Value} property for -characters whose @code{Numeric_Type} is @samp{Decimal}. The value is -an integer number. Examples of such characters include compatibility +characters whose @code{Numeric_Type} is @samp{Digit}. The value is an +integer number. Examples of such characters include compatibility subscript and superscript digits, for which the value is the corresponding number. For unassigned codepoints, the value is @code{nil}, which means @acronym{NaN}. @@ -549,6 +549,8 @@ is @code{nil}, which means the character itself. @defun get-char-code-property char propname This function returns the value of @var{char}'s @var{propname} property. +@c FIXME: Use ‘?\s’ instead of ‘? ’ for the space character in the +@c first example? --xfq @example @group (get-char-code-property ? 'general-category) @@ -684,6 +686,7 @@ which case the returned charset must be supported by that coding system (@pxref{Coding Systems}). @end defun +@c TODO: Explain the properties here and add indexes such as ‘charset property’. @defun charset-plist charset This function returns the property list of the character set @var{charset}. Although @var{charset} is a symbol, this is not the @@ -849,6 +852,8 @@ systems specifies its own translation tables, the table that is the value of this variable, if non-@code{nil}, is applied after them. @end defvar +@c FIXME: This variable is obsolete since 23.1. We should mention +@c that here or simply remove this defvar. --xfq @defvar translation-table-for-input Self-inserting characters are translated through this translation table before they are inserted. Search commands also translate their @@ -957,7 +962,8 @@ Unix convention, used on GNU and Unix systems, is to use the linefeed character (also called newline). The DOS convention, used on MS-Windows and MS-DOS systems, is to use a carriage-return and a linefeed at the end of a line. The Mac convention is to use just -carriage-return. +carriage-return. (This was the convention used on the Macintosh +system prior to OS X.) @cindex base coding system @cindex variant coding system @@ -1566,7 +1572,7 @@ the alist; otherwise it returns @code{nil}. If @var{operation} is @code{insert-file-contents}, the argument corresponding to the target may be a cons cell of the form -@code{(@var{filename} . @var{buffer})}). In that case, @var{filename} +@code{(@var{filename} . @var{buffer})}. In that case, @var{filename} is a file name to look up in @code{file-coding-system-alist}, and @var{buffer} is a buffer that contains the file's contents (not yet decoded). If @code{file-coding-system-alist} specifies a function to diff --git a/doc/lispref/text.texi b/doc/lispref/text.texi index c4250f2f0ba..aa19338ddaf 100644 --- a/doc/lispref/text.texi +++ b/doc/lispref/text.texi @@ -3920,10 +3920,11 @@ between one interval and two. Insertion of text at the border between intervals also raises questions that have no satisfactory answer. - However, it is easy to arrange for editing to behave consistently for -questions of the form, ``What are the properties of this character?'' -So we have decided these are the only questions that make sense; we have -not implemented asking questions about where intervals start or end. + However, it is easy to arrange for editing to behave consistently +for questions of the form, ``What are the properties of text at this +buffer or string position?'' So we have decided these are the only +questions that make sense; we have not implemented asking questions +about where intervals start or end. In practice, you can usually use the text property search functions in place of explicit interval boundaries. You can think of them as finding diff --git a/doc/misc/ChangeLog b/doc/misc/ChangeLog index 22148deace0..4a52e2314ca 100644 --- a/doc/misc/ChangeLog +++ b/doc/misc/ChangeLog @@ -1,3 +1,21 @@ +2013-09-14 Glenn Morris <rgm@gnu.org> + + * eshell.texi: Markup fixes. + +2013-09-11 Xue Fuqiao <xfq.free@gmail.com> + + * ido.texi (Interactive Substring Matching): Use @key{RET} instead + of @kbd{RET}. + (Prefix Matching): Add an index. + +2013-09-08 Glenn Morris <rgm@gnu.org> + + * emacs-gnutls.texi: Tweak direntry. + +2013-09-06 Michael Albinus <michael.albinus@gmx.de> + + * tramp.texi (Alternative Syntax): Remove chapter. + 2013-08-28 Paul Eggert <eggert@cs.ucla.edu> * Makefile.in (SHELL): Now @SHELL@, not /bin/sh, diff --git a/doc/misc/emacs-gnutls.texi b/doc/misc/emacs-gnutls.texi index 740dfee41ed..b1c4c13c5ff 100644 --- a/doc/misc/emacs-gnutls.texi +++ b/doc/misc/emacs-gnutls.texi @@ -25,7 +25,7 @@ modify this GNU manual.'' @dircategory Emacs network features @direntry -* GnuTLS: (emacs-gnutls). The Emacs GnuTLS integration. +* Emacs GnuTLS: (emacs-gnutls). The Emacs GnuTLS integration. @end direntry @titlepage diff --git a/doc/misc/eshell.texi b/doc/misc/eshell.texi index 4604b262e72..bbe741a7a1d 100644 --- a/doc/misc/eshell.texi +++ b/doc/misc/eshell.texi @@ -353,7 +353,7 @@ sudo is an alias, defined as "*sudo $*" @vindex eshell-prefer-lisp-functions If you would prefer to use the built-in commands instead of the external -commands, set @var{eshell-prefer-lisp-functions} to @code{t}. +commands, set @code{eshell-prefer-lisp-functions} to @code{t}. Some of the built-in commands have different behaviour from their external counterparts, and some have no external counterpart. Most of @@ -515,7 +515,7 @@ Aliases are commands that expand to a longer input line. For example, with the command invocation @samp{alias ll ls -l}; with this defined, running @samp{ll foo} in Eshell will actually run @samp{ls -l foo}. Aliases defined (or deleted) by the @command{alias} command are -automatically written to the file named by @var{eshell-aliases-file}, +automatically written to the file named by @code{eshell-aliases-file}, which you can also edit directly (although you will have to manually reload it). @@ -539,7 +539,7 @@ by @code{!foo:n}. The history ring is loaded from a file at the start of every session, and written back to the file at the end of every session. The file path -is specified in @var{eshell-history-file-name}. Unlike other shells, +is specified in @code{eshell-history-file-name}. Unlike other shells, such as Bash, Eshell can not be configured to keep a history ring of a different size than that of the history file. @@ -721,11 +721,11 @@ terminal emulator. Programs that need a terminal to display output properly are referred to in this manual as ``visual commands,'' because they are not simply line-oriented. You must tell Eshell which commands are visual, by -adding them to @var{eshell-visual-commands}; for commands that are +adding them to @code{eshell-visual-commands}; for commands that are visual for only certain @emph{sub}-commands -- e.g. @samp{git log} but -not @samp{git status} -- use @var{eshell-visual-subcommands}; and for +not @samp{git status} -- use @code{eshell-visual-subcommands}; and for commands that are visual only when passed certain options, use -@var{eshell-visual-options}. +@code{eshell-visual-options}. @section Redirection Redirection is mostly the same in Eshell as it is in other command @@ -740,16 +740,16 @@ on the right-hand side, into which it inserts the output of the left-hand side. e.g., @samp{echo hello >>> #<buffer *scratch*>} inserts the string @code{"hello"} into the @code{*scratch*} buffer. -@var{eshell-virtual-targets} is a list of mappings of virtual device +@code{eshell-virtual-targets} is a list of mappings of virtual device names to functions. Eshell comes with two virtual devices: @file{/dev/kill}, which sends the text to the kill ring, and @file{/dev/clip}, which sends text to the clipboard. You can, of course, define your own virtual targets. They are defined -by adding a list of the form @code{("/dev/name" function mode)} to -@var{eshell-virtual-targets}. The first element is the device name; -@code{function} may be either a lambda or a function name. If -@code{mode} is nil, then the function is the output function; if it is +by adding a list of the form @samp{("/dev/name" @var{function} @var{mode})} to +@code{eshell-virtual-targets}. The first element is the device name; +@var{function} may be either a lambda or a function name. If +@var{mode} is nil, then the function is the output function; if it is non-nil, then the function is passed the redirection mode as a symbol--@code{overwrite} for @code{>}, @code{append} for @code{>>}, or @code{insert} for @code{>>>}--and the function is expected to return @@ -774,7 +774,7 @@ Eshell module.} You also need to load the following as shown: @example (eval-when-compile - (require 'cl) + (require 'cl-lib) (require 'esh-mode) (require 'eshell)) diff --git a/doc/misc/ido.texi b/doc/misc/ido.texi index 623fb4bfa79..64885179259 100644 --- a/doc/misc/ido.texi +++ b/doc/misc/ido.texi @@ -258,7 +258,7 @@ Buffer: 23@{123456 | 123@} At this point, you still have two matching buffers. If you want the first buffer in the list, you can simply press @key{RET}. If you want the second in the list, you can press @kbd{C-s} to move it to the top -of the list and then press @kbd{RET} to select it. +of the list and then press @key{RET} to select it. However, if you type @kbd{4}, you'll only have one match left: @@ -366,6 +366,7 @@ users Ido offers in addition to the default substring matching method the only difference to the description of the substring matching above. +@cindex toggle prefix matching You can toggle prefix matching with @kbd{C-p} (@code{ido-toggle-prefix}). diff --git a/doc/misc/texinfo.tex b/doc/misc/texinfo.tex index 9ba8c949fd1..bfd765dd211 100644 --- a/doc/misc/texinfo.tex +++ b/doc/misc/texinfo.tex @@ -3,7 +3,7 @@ % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % -\def\texinfoversion{2013-08-20.10} +\def\texinfoversion{2013-09-11.11} % % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, @@ -322,10 +322,13 @@ % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). + \def\commmonheadfootline{\let\hsize=\pagewidth \texinfochars} + % \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi - \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% + \global\setbox\headlinebox = \vbox{\commmonheadfootline \makeheadline}% + % \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi - \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% + \global\setbox\footlinebox = \vbox{\commmonheadfootline \makefootline}% % {% % Have to do this stuff outside the \shipout because we want it to @@ -2891,6 +2894,15 @@ end \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi } +% +% @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if +% FMTNAME is tex, else ELSE-TEXT. +\long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish} +\long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{% + \def\inlinefmtname{#1}% + \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi +} +% % For raw, must switch into @tex before parsing the argument, to avoid % setting catcodes prematurely. Doing it this way means that, for % example, @inlineraw{html, foo{bar} gets a parse error instead of being @@ -2907,6 +2919,23 @@ end \endgroup % close group opened by \tex. } +% @inlineifset{VAR, TEXT} expands TEXT if VAR is @set. +% +\long\def\inlineifset#1{\doinlineifset #1,\finish} +\long\def\doinlineifset#1,#2,\finish{% + \def\inlinevarname{#1}% + \expandafter\ifx\csname SET\inlinevarname\endcsname\relax + \else\ignorespaces#2\fi +} + +% @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set. +% +\long\def\inlineifclear#1{\doinlineifclear #1,\finish} +\long\def\doinlineifclear#1,#2,\finish{% + \def\inlinevarname{#1}% + \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi +} + \message{glyphs,} % and logos. @@ -4202,7 +4231,7 @@ end \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { - \catcode`\- = \active \catcode`\_ = \active + \catcode`\-=\active \catcode`\_=\active % \gdef\makevalueexpandable{% \let\value = \expandablevalue @@ -4222,7 +4251,12 @@ end % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). -% +% +% Unfortunately, this has the consequence that when _ is in the *value* +% of an @set, it does not print properly in the roman fonts (get the cmr +% dot accent at position 126 instead). No fix comes to mind, and it's +% been this way since 2003 or earlier, so just ignore it. +% \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% @@ -6276,8 +6310,8 @@ end \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other - \catcode`\`=\other - \catcode`\'=\other + \catcode `\`=\other + \catcode `\'=\other \escapechar=`\\ % % ' is active in math mode (mathcode"8000). So reset it, and all our @@ -6301,7 +6335,7 @@ end \let\/=\ptexslash \let\*=\ptexstar \let\t=\ptext - \expandafter \let\csname top\endcsname=\ptextop % outer + \expandafter \let\csname top\endcsname=\ptextop % we've made it outer \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% @@ -9944,11 +9978,9 @@ directory should work if nowhere else does.} \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote -\catcode`\~=\active -\def~{{\tt\char126}} +\catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde \chardef\hat=`\^ -\catcode`\^=\active -\def^{{\tt \hat}} +\catcode`\^=\active \def\activehat{{\tt \hat}} \let^ = \activehat \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} @@ -9958,16 +9990,26 @@ directory should work if nowhere else does.} \catcode`\|=\active \def|{{\tt\char124}} + \chardef \less=`\< -\catcode`\<=\active -\def<{{\tt \less}} +\catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless \chardef \gtr=`\> -\catcode`\>=\active -\def>{{\tt \gtr}} -\catcode`\+=\active -\def+{{\tt \char 43}} -\catcode`\$=\active -\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix +\catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr +\catcode`\+=\active \def+{{\tt \char 43}} +\catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix + +% used for headline/footline in the output routine, in case the page +% breaks in the middle of an @tex block. +\def\texinfochars{% + \let< = \activeless + \let> = \activegtr + \let~ = \activetilde + \let^ = \activehat + \markupsetuplqdefault \markupsetuprqdefault + \let\b = \strong + \let\i = \smartitalic + % in principle, all other definitions in \tex have to be undone too. +} % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi index 03c6da3b73f..aa4cea58f04 100644 --- a/doc/misc/tramp.texi +++ b/doc/misc/tramp.texi @@ -225,7 +225,6 @@ Configuring @value{tramp} for use Using @value{tramp} * Filename Syntax:: @value{tramp} filename conventions. -* Alternative Syntax:: URL-like filename syntax. * Filename completion:: Filename completion. * Ad-hoc multi-hops:: Declaring multiple hops in the file name. * Remote processes:: Integration with other @value{emacsname} packages. @@ -2356,7 +2355,6 @@ minute you have already forgotten that you hit that key! @menu * Filename Syntax:: @value{tramp} filename conventions. -* Alternative Syntax:: URL-like filename syntax. * Filename completion:: Filename completion. * Ad-hoc multi-hops:: Declaring multiple hops in the file name. * Remote processes:: Integration with other @value{emacsname} packages. @@ -2453,46 +2451,6 @@ by adding @file{#<port>} to the host name, like in @file{@trampfn{ssh, daniel, melancholia#42, .emacs}}. -@node Alternative Syntax -@section URL-like filename syntax -@cindex filename syntax -@cindex filename examples - -Additionally to the syntax described in the previous chapter, it is -possible to use a URL-like syntax for @value{tramp}. This can be -switched on by customizing the variable @code{tramp-syntax}. Please -note that this feature is experimental for the time being. - -The variable @code{tramp-syntax} must be set before requiring @value{tramp}: - -@lisp -(setq tramp-syntax 'url) -(require 'tramp) -@end lisp - -Then, a @value{tramp} filename would look like this: -@file{/@var{method}://@var{user}@@@var{machine}:@var{port}/@var{path/to.file}}. -@file{/@var{method}://} is mandatory, all other parts are optional. -@file{:@var{port}} is useful for methods only who support this. - -The last example from the previous section would look like this: -@file{/ssh://daniel@@melancholia/.emacs}. - -For the time being, @code{tramp-syntax} can have the following values: - -@itemize @w{} -@ifset emacs -@item @code{ftp}---That is the default syntax -@item @code{url}---URL-like syntax -@end ifset -@ifset xemacs -@item @code{sep}---That is the default syntax -@item @code{url}---URL-like syntax -@item @code{ftp}---EFS-like syntax -@end ifset -@end itemize - - @node Filename completion @section Filename completion @cindex filename completion diff --git a/etc/CONTRIBUTE b/etc/CONTRIBUTE index 3ccd180aa0c..5d6b4238c97 100644 --- a/etc/CONTRIBUTE +++ b/etc/CONTRIBUTE @@ -60,6 +60,11 @@ answer any questions you may have (or point you to the people with the answers), at the emacs-devel@gnu.org mailing list. A copyright disclaimer is also a possibility, but we prefer an assignment. +Note that the disclaimer, like an assignment, involves you sending +signed paperwork to the FSF (simply saying "this is in the public domain" +is not enough). Also, a disclaimer cannot be applied to future work, it +has to be repeated each time you want to send something new. + We can accept small changes (roughly, fewer than 15 lines) without an assignment. This is a cumulative limit (e.g. three separate 5 line patches) over all your contributions. @@ -94,8 +99,7 @@ revise your patch, send it as a followup to the initial topic. ** Description -For bug fixes, a description of the bug and how your patch fixes this -bug. +For bug fixes, a description of the bug and how your patch fixes it. For new features, a description of the feature and your implementation. @@ -103,7 +107,7 @@ For new features, a description of the feature and your implementation. A ChangeLog entry as plaintext (separate from the patch). -See the various ChangeLog files for format and content. Note that, +See the existing ChangeLog files for format and content. Note that, unlike some other projects, we do require ChangeLogs also for documentation, i.e. Texinfo files. @@ -112,24 +116,16 @@ Manual, for how to write good log entries. ** The patch itself. -Please use "Context Diff" format. - If you are accessing the Bazaar repository, make sure your copy is up-to-date (e.g. with `bzr pull'), then use bzr diff --no-aliases --diff-options=-cp Else, use diff -cp OLD NEW -If your version of diff does not support these options, then get the -latest version of GNU Diff. - ** Mail format. -We prefer to get the patches as inline plain text. - -Please be aware of line wrapping which will make the patch unreadable -and useless for us. To avoid that, you can use MIME attachments or, -as a last resort, uuencoded gzipped text. +We prefer to get the patches as plain text, either inline (be careful +your mail client does not change line breaks) or as MIME attachments. ** Please reread your patch before submitting it. @@ -179,18 +175,12 @@ by following links from http://savannah.gnu.org/mail/?group=emacs . ** Document your changes. -Think carefully about whether your change requires updating the -documentation. If it does, you can either do this yourself or add an -item to the NEWS file. - -If you document your change in NEWS, please mark the NEWS entry with -the documentation status of the change: if you submit the changes for -the manuals, mark it with "+++"; if it doesn't need to be documented, -mark it with "---"; if it needs to be documented, but you didn't -submit documentation changes, leave the NEWS entry unmarked. (These -marks are checked by the Emacs maintainers to make sure every change -was reflected in the manuals.) +Any change that matters to end-users should have a NEWS entry. +Think about whether your change requires updating the documentation +(both manuals and doc-strings). If you know it does not, mark the NEWS +entry with "---". If you know that *all* the necessary documentation +updates have been made, mark the entry with "+++". Otherwise do not mark it. ** Understanding Emacs Internals. diff --git a/etc/ChangeLog b/etc/ChangeLog index c1cb67a6a67..06ca0f3f8bc 100644 --- a/etc/ChangeLog +++ b/etc/ChangeLog @@ -1,3 +1,17 @@ +2013-09-22 Daniel Colascione <dancol@dancol.org> + + * NEWS: Mention new bool-vector functionality. + +aaaa2013-09-15 Jan Djärv <jan.h.d@swipnet.se> + + * NEWS: Mention the macfont backend. + +2013-09-09 Glenn Morris <rgm@gnu.org> + + * refcards/Makefile (PS_ENGLISH, PS_CZECH, PS_FRENCH, PS_GERMAN) + (PS_POLISH, PS_PORTUGUESE, PS_RUSSIAN, PS_SLOVAKIAN, PS_TARGETS): + Use substitution refs. + 2013-08-15 Glenn Morris <rgm@gnu.org> * refcards/calccard.pdf, refcards/cs-dired-ref.pdf: @@ -714,7 +728,7 @@ * refcards/vipcard.tex, refcards/viperCard.tex: Update short copyright year to 2012. -2012-01-04 Chong Yidong <cyd@stupidchicken.com> +2012-01-04 Chong Yidong <cyd@stupidchicken.com> * org/README: Rename from COPYRIGHT-AND-LICENSE. @@ -34,6 +34,10 @@ build time. To prevent this, use the configure option `--with-file-notification-no'. See below for file-notify features. FIXME? This feature is not available for the Nextstep port. (?) +** The configure option `without-compress-info' has been generalized, +and renamed to `without-compress-install'. It now prevents compression +of _any_ files during installation. + ** The configure option --with-crt-dir has been removed. It is no longer needed, as the crt*.o files are no longer linked specially. @@ -50,6 +54,11 @@ and zlib-format compressed data. ** Emacs for NS (OSX, GNUStep) can be built with ImageMagick support. pkg-config is required to find ImageMagick libraries. +** For OSX >= 10.5, the Core text based font backend from the Mac port is used. +For GNUStep and OSX 10.4 the old backend is used. +To use the old backend by default, do on the command line: +% defaults write org.gnu.Emacs FontBackend ns + * Startup Changes in Emacs 24.4 @@ -84,6 +93,10 @@ simply disabling Transient Mark mode does the same thing. ** `initial-buffer-choice' can now specify a function to set up the initial buffer. +** The *Messages* buffer is created in a new major mode `messages-buffer-mode', +and read-only. Code that might create the *Messages* buffer should +call the function `messages-buffer' to do so and set the mode. + ** `remember-notes' creates a buffer whose content is saved on kill-emacs. You may think of it as a *scratch* buffer whose content is preserved. In fact, it was designed as a replacement for *scratch* buffer and can @@ -262,10 +275,16 @@ whole tree revisions. *** In VC directory mode, `L' lists the change log for the current VC controlled tree in a window. +*** In VC directory mode, `I' shows a log of changes that will be +received with a pull operation. + *** `C-x v G' (globally) and `G' (in VC directory mode) ignores a file under current version control system. When called with a prefix argument, you can remove a file from the ignored file list. +*** `cvs-append-to-ignore' has been renamed to `vc-cvs-append-to-ignore' +because it is moved to vc-cvs.el. + ** cl-lib *** New macro cl-tagbody. @@ -332,6 +351,10 @@ This is useful to avoid a query when you have no key for that name. *** key bindings to navigate through and select the completions. *** The icomplete-separator is customizable, and its default has changed. *** Removed icomplete-show-key-bindings. +*** Icomplete-mode by defaults applies to all forms of minibuffer completion. +(setq icomplete-with-completion-tables '(internal-complete-buffer)) +will revert to the old behavior. + ** Ido *** Ido has a manual now. @@ -461,6 +484,8 @@ todo-mode.el has been made obsolete and renamed otodo-mode.el. ** Tramp +*** The experimental url syntax for remote file names is withdrawn. + +++ *** New connection method "adb", which allows to access Android devices by the Android Debug Bridge. The variable `tramp-adb-program' @@ -604,9 +629,30 @@ file using `set-file-extended-attributes'. ** `visited-file-modtime' now returns -1 for nonexistent files. Formerly it returned a list (-1 LOW USEC PSEC), but this was ambiguous in the presence of files with negative time stamps. + +** The cars of the elements in `interpreter-mode-alist' are now treated +as regexps rather than literal strings. Technically this is an +incompatible change, but unless you are using interpreter-mode-alist +for something (not just adding elements to it), it ought not to affect you. + * Lisp Changes in Emacs 24.4 +** New bool-vector set operation functions: +*** `bool-vector-exclusive-or' +*** `bool-vector-union' +*** `bool-vector-intersection' +*** `bool-vector-set-difference' +*** `bool-vector-not' +*** `bool-vector-subset' +*** `bool-vector-count-matches' +*** `bool-vector-count-matches-at' + +** Comparison functions =, <, >, <=, >= now take many arguments. + +** The second argument of `eval' can now be a lexical-environment. + +** `with-demoted-errors' takes an additional argument `format'. +++ ** New function `define-error'. @@ -754,6 +800,11 @@ used in place of the 9th element of `file-attributes'. `preserve-extended-attributes' as it now handles both SELinux context and ACL entries. +** The `common-substring' argument of display-completion-list is obsolete. +Either use `completion-all-completions' which already returns highlighted +strings (including for partial or substring completion) or call +`completion-hilit-commonality' to add the highlight. + ** Changes to the Emacs Lisp Coding Conventions in Emacs 24.4 *** The package descriptor and name of global variables, constants, diff --git a/etc/refcards/Makefile b/etc/refcards/Makefile index 36abf67d594..0931540e4d8 100644 --- a/etc/refcards/Makefile +++ b/etc/refcards/Makefile @@ -58,42 +58,16 @@ PDF_SLOVAKIAN = \ PDF_TARGETS = $(PDF_ENGLISH) $(PDF_CZECH) $(PDF_FRENCH) $(PDF_GERMAN) \ $(PDF_POLISH) $(PDF_PORTUGUESE) $(PDF_RUSSIAN) $(PDF_SLOVAKIAN) -PS_ENGLISH = \ - calccard.ps \ - dired-ref.ps \ - gnus-booklet.ps \ - gnus-refcard.ps \ - orgcard.ps \ - refcard.ps \ - survival.ps \ - vipcard.ps \ - viperCard.ps - -PS_CZECH = \ - cs-dired-ref.ps \ - cs-refcard.ps \ - cs-survival.ps - -PS_FRENCH = \ - fr-dired-ref.ps \ - fr-refcard.ps \ - fr-survival.ps \ - -PS_GERMAN = de-refcard.ps - -PS_POLISH = pl-refcard.ps - -PS_PORTUGUESE = pt-br-refcard.ps - -PS_RUSSIAN = ru-refcard.ps - -PS_SLOVAKIAN = \ - sk-dired-ref.ps \ - sk-refcard.ps \ - sk-survival.ps - -PS_TARGETS = $(PS_ENGLISH) $(PS_CZECH) $(PS_FRENCH) $(PS_GERMAN) \ - $(PS_POLISH) $(PS_PORTUGUESE) $(PS_RUSSIAN) $(PS_SLOVAKIAN) +PS_ENGLISH = $(PDF_ENGLISH:.pdf=.ps) +PS_CZECH = $(PDF_CZECH:.pdf=.ps) +PS_FRENCH = $(PDF_FRENCH:.pdf=.ps) +PS_GERMAN = $(PDF_GERMAN:.pdf=.ps) +PS_POLISH = $(PDF_POLISH:.pdf=.ps) +PS_PORTUGUESE = $(PDF_PORTUGUESE:.pdf=.ps) +PS_RUSSIAN = $(PDF_RUSSIAN:.pdf=.ps) +PS_SLOVAKIAN = $(PDF_SLOVAKIAN:.pdf=.ps) + +PS_TARGETS = $(PDF_TARGETS:.pdf=.ps) ## For emacsver.tex. @@ -41,7 +41,7 @@ Emacs editing modes Emacs network features * EUDC: (eudc). Emacs client for directory servers (LDAP, PH). * Gnus: (gnus). The newsreader Gnus. -* GnuTLS: (emacs-gnutls). The Emacs GnuTLS integration. +* Emacs GnuTLS: (emacs-gnutls). The Emacs GnuTLS integration. * Mairix: (mairix-el). Emacs interface to the Mairix mail indexer. * MH-E: (mh-e). Emacs interface to the MH mail system. * Message: (message). Mail and news composition mode that diff --git a/leim/ChangeLog b/leim/ChangeLog index 3e25c0edbe1..11186603df8 100644 --- a/leim/ChangeLog +++ b/leim/ChangeLog @@ -1,3 +1,9 @@ +2013-09-05 Jean Haidouk <haidouk@yandex.com> (tiny change) + + * quail/latin-alt.el ("french-alt-postfix", "latin-alt-postfix"): + * quail/latin-pre.el ("french-prefix"): + * quail/latin-post.el ("french-postfix"): Add `œ' and `Œ'. + 2013-08-28 Paul Eggert <eggert@cs.ucla.edu> * Makefile.in (SHELL): Now @SHELL@, not /bin/sh, diff --git a/leim/quail/latin-alt.el b/leim/quail/latin-alt.el index fdfc89f4eca..6841947524f 100644 --- a/leim/quail/latin-alt.el +++ b/leim/quail/latin-alt.el @@ -938,7 +938,7 @@ Par exemple: a` -> à e' -> é. En doublant la frappe des diacritiques, ils s'isoleront de la lettre. Par exemple: e'' -> e' -<e dans l'o> n'est pas disponible." +Œ est produit par O/." nil t nil nil nil nil nil nil nil nil t) (quail-define-rules @@ -959,7 +959,9 @@ Par exemple: e'' -> e' ("i^" ?î) ("i\"" ?ï) ("O^" ?Ô) + ("O/" ?Œ) ("o^" ?ô) + ("o/" ?œ) ("U`" ?Ù) ("U^" ?Û) ("U\"" ?Ü) @@ -988,7 +990,9 @@ Par exemple: e'' -> e' ("i^^" ["i^"]) ("i\"\"" ["i\""]) ("O^^" ["O^"]) + ("O//" ["O/"]) ("o^^" ["o^"]) + ("o//" ["o/"]) ("U``" ["U`"]) ("U^^" ["U^"]) ("U\"\"" ["U\""]) @@ -1423,6 +1427,7 @@ Doubling the postfix separates the letter and postfix: e.g. a'' -> a' ("O'" ?Ó) ("O-" ?Ō) ("O/" ?Ø) + ("O/" ?Œ) ("O:" ?Ő) ("O\"" ?Ö) ("O^" ?Ô) @@ -1515,6 +1520,7 @@ Doubling the postfix separates the letter and postfix: e.g. a'' -> a' ("o'" ?ó) ("o-" ?ō) ("o/" ?ø) + ("o/" ?œ) ("o:" ?ő) ("o\"" ?ö) ("o^" ?ô) diff --git a/leim/quail/latin-post.el b/leim/quail/latin-post.el index 67cd0648951..7fa3d88e8c6 100644 --- a/leim/quail/latin-post.el +++ b/leim/quail/latin-post.el @@ -1013,7 +1013,7 @@ Par exemple: a` -> à e' -> é. En doublant la frappe des diacritiques, ils s'isoleront de la lettre. Par exemple: e'' -> e' -<e dans l'o> n'est pas disponible." +Œ est produit par O/." nil t nil nil nil nil nil nil nil nil t) (quail-define-rules @@ -1034,7 +1034,9 @@ Par exemple: e'' -> e' ("i^" ?î) ("i\"" ?ï) ("O^" ?Ô) + ("O/" ?Œ) ("o^" ?ô) + ("o/" ?œ) ("U`" ?Ù) ("U^" ?Û) ("U\"" ?Ü) @@ -1063,7 +1065,9 @@ Par exemple: e'' -> e' ("i^^" ["i^"]) ("i\"\"" ["i\""]) ("O^^" ["O^"]) + ("O//" ["O/"]) ("o^^" ["o^"]) + ("o//" ["o/"]) ("U``" ["U`"]) ("U^^" ["U^"]) ("U\"\"" ["U\""]) @@ -2099,7 +2103,7 @@ of characters from a single Latin-N charset. dot | . | z. -> ż stroke | / | d/ -> đ nordic | / | d/ -> ð t/ -> þ a/ -> å e/ -> æ o/ -> ø - others | / | s/ -> ß ?/ -> ¿ !/ -> ¡ // -> ° + others | / | s/ -> ß ?/ -> ¿ !/ -> ¡ // -> ° o/ -> œ | various | << -> « >> -> » o_ -> º a_ -> ª Doubling the postfix separates the letter and postfix: e.g. a'' -> a' diff --git a/leim/quail/latin-pre.el b/leim/quail/latin-pre.el index 4b4179ebf82..c6085f34290 100644 --- a/leim/quail/latin-pre.el +++ b/leim/quail/latin-pre.el @@ -264,6 +264,7 @@ Key translation rules are: diaeresis | \" | \"i -> ï cedilla | ~ or , | ~c -> ç ,c -> ç symbol | ~ | ~> -> » ~< -> « + misc | / | /o -> œ " nil t nil nil nil nil nil nil nil nil t) (quail-define-rules @@ -295,6 +296,9 @@ Key translation rules are: ("\"e" ?ë) ("\"i" ?ï) ("\" " ?\") + ("/o" ?œ) + ("/O" ?Œ) + ("/ " ?/) ("~<" ?\«) ("~>" ?\») ("~C" ?Ç) diff --git a/lib-src/ChangeLog b/lib-src/ChangeLog index d2e9dd18177..1186a0c025c 100644 --- a/lib-src/ChangeLog +++ b/lib-src/ChangeLog @@ -1,3 +1,9 @@ +2013-09-20 Paul Eggert <eggert@cs.ucla.edu> + + A simpler, centralized INLINE. + * profile.c (INLINE): New macro. + (SYSTIME_INLINE): Remove. + 2013-08-28 Paul Eggert <eggert@cs.ucla.edu> * Makefile.in (SHELL): Now @SHELL@, not /bin/sh, diff --git a/lib-src/profile.c b/lib-src/profile.c index bddfea76334..aab44a0fe86 100644 --- a/lib-src/profile.c +++ b/lib-src/profile.c @@ -29,9 +29,9 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ ** abstraction : a stopwatch ** operations: reset_watch, get_time */ -#include <config.h> -#define SYSTIME_INLINE EXTERN_INLINE +#define INLINE EXTERN_INLINE +#include <config.h> #include <inttypes.h> #include <stdio.h> diff --git a/lib/acl-internal.h b/lib/acl-internal.h index 7e6d77a5fd4..55c224ca883 100644 --- a/lib/acl-internal.h +++ b/lib/acl-internal.h @@ -60,6 +60,9 @@ extern int aclsort (int, int, struct acl *); # define fchmod(fd, mode) (-1) #endif +#ifndef _GL_INLINE_HEADER_BEGIN + #error "Please include config.h first." +#endif _GL_INLINE_HEADER_BEGIN #ifndef ACL_INTERNAL_INLINE # define ACL_INTERNAL_INLINE _GL_INLINE diff --git a/lib/binary-io.h b/lib/binary-io.h index 317fe3d3c20..423c2ae3fff 100644 --- a/lib/binary-io.h +++ b/lib/binary-io.h @@ -25,6 +25,9 @@ so we include it here first. */ #include <stdio.h> +#ifndef _GL_INLINE_HEADER_BEGIN + #error "Please include config.h first." +#endif _GL_INLINE_HEADER_BEGIN #ifndef BINARY_IO_INLINE # define BINARY_IO_INLINE _GL_INLINE diff --git a/lib/dtotimespec.c b/lib/dtotimespec.c index ecce2e5bcc5..064f7d3a0a9 100644 --- a/lib/dtotimespec.c +++ b/lib/dtotimespec.c @@ -29,41 +29,31 @@ struct timespec dtotimespec (double sec) { - enum { BILLION = 1000 * 1000 * 1000 }; double min_representable = TYPE_MINIMUM (time_t); double max_representable = - ((TYPE_MAXIMUM (time_t) * (double) BILLION + (BILLION - 1)) - / BILLION); - struct timespec r; + ((TYPE_MAXIMUM (time_t) * (double) TIMESPEC_RESOLUTION + + (TIMESPEC_RESOLUTION - 1)) + / TIMESPEC_RESOLUTION); if (! (min_representable < sec)) - { - r.tv_sec = TYPE_MINIMUM (time_t); - r.tv_nsec = 0; - } + return make_timespec (TYPE_MINIMUM (time_t), 0); else if (! (sec < max_representable)) - { - r.tv_sec = TYPE_MAXIMUM (time_t); - r.tv_nsec = BILLION - 1; - } + return make_timespec (TYPE_MAXIMUM (time_t), TIMESPEC_RESOLUTION - 1); else { time_t s = sec; - double frac = BILLION * (sec - s); + double frac = TIMESPEC_RESOLUTION * (sec - s); long ns = frac; ns += ns < frac; - s += ns / BILLION; - ns %= BILLION; + s += ns / TIMESPEC_RESOLUTION; + ns %= TIMESPEC_RESOLUTION; if (ns < 0) { s--; - ns += BILLION; + ns += TIMESPEC_RESOLUTION; } - r.tv_sec = s; - r.tv_nsec = ns; + return make_timespec (s, ns); } - - return r; } diff --git a/lib/execinfo.in.h b/lib/execinfo.in.h index 6cfc8d56d2d..344f26add2b 100644 --- a/lib/execinfo.in.h +++ b/lib/execinfo.in.h @@ -20,6 +20,9 @@ #ifndef _GL_EXECINFO_H #define _GL_EXECINFO_H +#ifndef _GL_INLINE_HEADER_BEGIN + #error "Please include config.h first." +#endif _GL_INLINE_HEADER_BEGIN #ifndef _GL_EXECINFO_INLINE # define _GL_EXECINFO_INLINE _GL_INLINE diff --git a/lib/getgroups.c b/lib/getgroups.c index 9856adc1a4d..e71b5439c7e 100644 --- a/lib/getgroups.c +++ b/lib/getgroups.c @@ -86,7 +86,7 @@ rpl_getgroups (int n, gid_t *group) } saved_errno = errno; free (gbuf); - errno == saved_errno; + errno = saved_errno; return result; } diff --git a/lib/openat.h b/lib/openat.h index eb90990da1d..7208f4459fe 100644 --- a/lib/openat.h +++ b/lib/openat.h @@ -26,6 +26,9 @@ #include <unistd.h> #include <stdbool.h> +#ifndef _GL_INLINE_HEADER_BEGIN + #error "Please include config.h first." +#endif _GL_INLINE_HEADER_BEGIN #if !HAVE_OPENAT diff --git a/lib/signal.in.h b/lib/signal.in.h index 54849504d77..a531487e355 100644 --- a/lib/signal.in.h +++ b/lib/signal.in.h @@ -195,6 +195,20 @@ typedef int verify_NSIG_constraint[NSIG <= 32 ? 1 : -1]; # endif +/* When also using extern inline, suppress the use of static inline in + standard headers of problematic Apple configurations, as Libc at + least through Libc-825.26 (2013-04-09) mishandles it; see, e.g., + <http://lists.gnu.org/archive/html/bug-gnulib/2012-12/msg00023.html>. + Perhaps Apple will fix this some day. */ +#if (defined _GL_EXTERN_INLINE_IN_USE && defined __APPLE__ \ + && (defined __i386__ || defined __x86_64__)) +# undef sigaddset +# undef sigdelset +# undef sigemptyset +# undef sigfillset +# undef sigismember +#endif + /* Test whether a given signal is contained in a signal set. */ # if @HAVE_POSIX_SIGNALBLOCKING@ /* This function is defined as a macro on Mac OS X. */ diff --git a/lib/stat-time.h b/lib/stat-time.h index 2d3b5cd6514..d58eddde334 100644 --- a/lib/stat-time.h +++ b/lib/stat-time.h @@ -23,6 +23,9 @@ #include <sys/stat.h> #include <time.h> +#ifndef _GL_INLINE_HEADER_BEGIN + #error "Please include config.h first." +#endif _GL_INLINE_HEADER_BEGIN #ifndef _GL_STAT_TIME_INLINE # define _GL_STAT_TIME_INLINE _GL_INLINE diff --git a/lib/stdio.in.h b/lib/stdio.in.h index 06cbad00d3d..76e62fba6ba 100644 --- a/lib/stdio.in.h +++ b/lib/stdio.in.h @@ -124,6 +124,15 @@ #define _GL_STDIO_STRINGIZE(token) #token #define _GL_STDIO_MACROEXPAND_AND_STRINGIZE(token) _GL_STDIO_STRINGIZE(token) +/* When also using extern inline, suppress the use of static inline in + standard headers of problematic Apple configurations, as Libc at + least through Libc-825.26 (2013-04-09) mishandles it; see, e.g., + <http://lists.gnu.org/archive/html/bug-gnulib/2012-12/msg00023.html>. + Perhaps Apple will fix this some day. */ +#if (defined _GL_EXTERN_INLINE_IN_USE && defined __APPLE__ \ + && defined __GNUC__ && defined __STDC__) +# undef putc_unlocked +#endif #if @GNULIB_DPRINTF@ # if @REPLACE_DPRINTF@ diff --git a/lib/timespec-add.c b/lib/timespec-add.c index 6ce2c73064f..d628237fe56 100644 --- a/lib/timespec-add.c +++ b/lib/timespec-add.c @@ -18,7 +18,7 @@ /* Written by Paul Eggert. */ /* Return the sum of two timespec values A and B. On overflow, return - an extremal value. This assumes 0 <= tv_nsec <= 999999999. */ + an extremal value. This assumes 0 <= tv_nsec < TIMESPEC_RESOLUTION. */ #include <config.h> #include "timespec.h" @@ -28,11 +28,10 @@ struct timespec timespec_add (struct timespec a, struct timespec b) { - struct timespec r; time_t rs = a.tv_sec; time_t bs = b.tv_sec; int ns = a.tv_nsec + b.tv_nsec; - int nsd = ns - 1000000000; + int nsd = ns - TIMESPEC_RESOLUTION; int rns = ns; if (0 <= nsd) @@ -59,13 +58,11 @@ timespec_add (struct timespec a, struct timespec b) { high_overflow: rs = TYPE_MAXIMUM (time_t); - rns = 999999999; + rns = TIMESPEC_RESOLUTION - 1; } } else rs += bs; - r.tv_sec = rs; - r.tv_nsec = rns; - return r; + return make_timespec (rs, rns); } diff --git a/lib/timespec-sub.c b/lib/timespec-sub.c index 97c9f9de88c..3f3adea28d6 100644 --- a/lib/timespec-sub.c +++ b/lib/timespec-sub.c @@ -18,8 +18,8 @@ /* Written by Paul Eggert. */ /* Return the difference between two timespec values A and B. On - overflow, return an extremal value. This assumes 0 <= tv_nsec <= - 999999999. */ + overflow, return an extremal value. This assumes 0 <= tv_nsec < + TIMESPEC_RESOLUTION. */ #include <config.h> #include "timespec.h" @@ -29,7 +29,6 @@ struct timespec timespec_sub (struct timespec a, struct timespec b) { - struct timespec r; time_t rs = a.tv_sec; time_t bs = b.tv_sec; int ns = a.tv_nsec - b.tv_nsec; @@ -37,7 +36,7 @@ timespec_sub (struct timespec a, struct timespec b) if (ns < 0) { - rns = ns + 1000000000; + rns = ns + TIMESPEC_RESOLUTION; if (rs == TYPE_MINIMUM (time_t)) { if (bs <= 0) @@ -59,13 +58,11 @@ timespec_sub (struct timespec a, struct timespec b) else { rs = TYPE_MAXIMUM (time_t); - rns = 999999999; + rns = TIMESPEC_RESOLUTION - 1; } } else rs -= bs; - r.tv_sec = rs; - r.tv_nsec = rns; - return r; + return make_timespec (rs, rns); } diff --git a/lib/timespec.h b/lib/timespec.h index c7450ad8de0..d0c029b5704 100644 --- a/lib/timespec.h +++ b/lib/timespec.h @@ -21,6 +21,9 @@ # include <time.h> +#ifndef _GL_INLINE_HEADER_BEGIN + #error "Please include config.h first." +#endif _GL_INLINE_HEADER_BEGIN #ifndef _GL_TIMESPEC_INLINE # define _GL_TIMESPEC_INLINE _GL_INLINE diff --git a/lib/u64.h b/lib/u64.h index d8009ad3913..af8441f52e5 100644 --- a/lib/u64.h +++ b/lib/u64.h @@ -19,6 +19,9 @@ #include <stdint.h> +#ifndef _GL_INLINE_HEADER_BEGIN + #error "Please include config.h first." +#endif _GL_INLINE_HEADER_BEGIN #ifndef _GL_U64_INLINE # define _GL_U64_INLINE _GL_INLINE diff --git a/lib/unistd.in.h b/lib/unistd.in.h index 2ea9af43652..874c628a63b 100644 --- a/lib/unistd.in.h +++ b/lib/unistd.in.h @@ -116,6 +116,9 @@ # include <getopt.h> #endif +#ifndef _GL_INLINE_HEADER_BEGIN + #error "Please include config.h first." +#endif _GL_INLINE_HEADER_BEGIN #ifndef _GL_UNISTD_INLINE # define _GL_UNISTD_INLINE _GL_INLINE diff --git a/lib/utimens.c b/lib/utimens.c index 013843d6da4..44a33c1d791 100644 --- a/lib/utimens.c +++ b/lib/utimens.c @@ -90,10 +90,12 @@ validate_timespec (struct timespec timespec[2]) assert (timespec); if ((timespec[0].tv_nsec != UTIME_NOW && timespec[0].tv_nsec != UTIME_OMIT - && (timespec[0].tv_nsec < 0 || 1000000000 <= timespec[0].tv_nsec)) + && ! (0 <= timespec[0].tv_nsec + && timespec[0].tv_nsec < TIMESPEC_RESOLUTION)) || (timespec[1].tv_nsec != UTIME_NOW && timespec[1].tv_nsec != UTIME_OMIT - && (timespec[1].tv_nsec < 0 || 1000000000 <= timespec[1].tv_nsec))) + && ! (0 <= timespec[1].tv_nsec + && timespec[1].tv_nsec < TIMESPEC_RESOLUTION))) { errno = EINVAL; return -1; diff --git a/lib/utimens.h b/lib/utimens.h index 82a72a7a451..f1633c966aa 100644 --- a/lib/utimens.h +++ b/lib/utimens.h @@ -26,6 +26,9 @@ int lutimens (char const *, struct timespec const [2]); # include <fcntl.h> # include <sys/stat.h> +#ifndef _GL_INLINE_HEADER_BEGIN + #error "Please include config.h first." +#endif _GL_INLINE_HEADER_BEGIN #ifndef _GL_UTIMENS_INLINE # define _GL_UTIMENS_INLINE _GL_INLINE diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 527f363362f..cf450c55612 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,786 @@ +2013-09-26 Leo Liu <sdl.web@gmail.com> + + * minibuffer.el (completion-all-sorted-completions): Make args + optional as they are. + +2013-09-25 Daniel Colascione <dancol@dancol.org> + + * emacs-lisp/cl-macs.el (cl-type-spec): Tell edebug what type + specs are and that they're not evaluated. + +2013-09-24 Sam Steingold <sds@gnu.org> + + * midnight.el (clean-buffer-list-kill-regexps) + (clean-buffer-list-kill-buffer-names): Update for the new Man + buffer naming which includes the object name. + +2013-09-23 Stefan Monnier <monnier@iro.umontreal.ca> + + * eshell/esh-cmd.el (eshell--sep-terms): New var. + (eshell-parse-command, eshell-parse-pipeline): Use it since + eshell-separate-commands requires a dynamic scoped var. + Reported by Jan Moringen <jmoringe@techfak.uni-bielefeld.de>. + +2013-09-23 Leo Liu <sdl.web@gmail.com> + + * autoinsert.el (auto-insert-alist): Make the value of + lexical-binding match its file setting. + +2013-09-23 Juanma Barranquero <lekktu@gmail.com> + + * vc/vc-sccs.el (vc-sccs-search-project-dir): Mark unused argument. + + * autoarg.el (autoarg-kp-digit-argument): + * electric.el (Electric-command-loop): + * kmacro.el (kmacro-step-edit-insert): + Do not set universal-argument-num-events. + +2013-09-22 Leo Liu <sdl.web@gmail.com> + + * files.el (interpreter-mode-alist): Add octave. + +2013-09-21 Alan Mackenzie <acm@muc.de> + + C++: fontify identifier in declaration following "public:" correctly. + * progmodes/cc-langs.el (c-decl-start-colon-kwd-re): New lang var + to match "public", etc. + (c-decl-prefix-re): Add ":" into the C++ value. + * progmodes/cc-engine.el (c-find-decl-prefix-search): Refactor a + bit. Add a check for a ":" preceded by "public", etc. + +2013-09-21 Eli Zaretskii <eliz@gnu.org> + + * files.el (auto-mode-alist): Support OBJFILE-gdb.gdb script files + recognized by GDB 7.5 and later. + +2013-09-21 Xue Fuqiao <xfq.free@gmail.com> + + * vc/vc-dir.el (vc-dir-mode-map): Add keybinding for vc-log-incoming. + +2013-09-20 Stefan Monnier <monnier@iro.umontreal.ca> + + * subr.el (internal--call-interactively): New const. + (called-interactively-p): Use it (bug#3984). + +2013-09-20 Xue Fuqiao <xfq.free@gmail.com> + + * vc/pcvs.el (cvs-mode-ignore): + * vc/vc-cvs.el (vc-cvs-ignore, vc-cvs-append-to-ignore): Rename + cvs-append-to-ignore to vc-cvs-append-to-ignore. + +2013-09-19 Stefan Monnier <monnier@iro.umontreal.ca> + + * eshell/em-ls.el: Use advice. Remove redundant :group keywords. + (eshell-ls-orig-insert-directory): Remove. + (eshell-ls-unload-hook): Not a defcustom any more. Use advice-remove. + (eshell-ls-use-in-dired): Use advice-add/remove. + (eshell-ls--insert-directory): Rename from eshell-ls-insert-directory. + Add `orig-fun' arg for use in :around advice. + Make it check (redundantly) eshell-ls-use-in-dired. + +2013-09-19 Glenn Morris <rgm@gnu.org> + + * emacs-lisp/cl-macs.el (cl-defsubst): Remove unused local `pbody'. + + * simple.el (x-selection-owner-p, x-selection-exists-p): Declare. + + * emacs-lisp/eieio.el (class-parent): Undo previous change. + +2013-09-19 Michael Albinus <michael.albinus@gmx.de> + + * net/tramp-sh.el (tramp-get-remote-id): Do not raise an error. + (tramp-get-remote-uid-with-id, tramp-get-remote-gid-with-id) + (tramp-get-remote-python): New defuns. + (tramp-get-remote-uid-with-perl) + (tramp-get-remote-gid-with-perl): New defuns. Perl code + contributed by yary <not.com@gmail.com> (tiny change). + (tramp-get-remote-uid-with-python) + (tramp-get-remote-gid-with-python): New defuns. Python code + contributed by Andrey Tykhonov <atykhonov@gmail.com> (tiny change). + (tramp-get-remote-uid, tramp-get-remote-gid): Use new defuns. + +2013-09-19 Glenn Morris <rgm@gnu.org> + + * emacs-lisp/eieio.el (class-parent): Don't use defalias with macros. + + * eshell/em-unix.el (eshell-remove-entries): + Rename argument to avoid name-clash with global `top-level'. + + * eshell/esh-proc.el (eshell-kill-process-function): + Remove eshell-reset-after-proc from eshell-kill-hook if present. + (eshell-reset-after-proc): Remove unused arg `proc'. + + * eshell/esh-util.el (eshell-read-hosts-file): Use `filename' arg. + (directory-files-and-attributes): Mark unused arg. + + * eshell/em-unix.el (eshell-remove-entries): + Remove unused arg `path'. Update callers. + + * eshell/em-hist.el (eshell-hist-parse-arguments): + Remove unused arg `silent'. Update callers. + + * eshell/em-ls.el (eshell-ls-use-in-dired): Use `symbol' arg. + Fix (f)boundp mix-up. + + * eshell/em-smart.el (eshell-smart-scroll-window) + (eshell-disable-after-change): + * eshell/em-term.el (eshell-term-sentinel): Mark unused arg. + +2013-09-18 Alan Mackenzie <acm@muc.de> + + Fix fontification of type when followed by "const". + * progmodes/cc-engine.el (c-forward-decl-or-cast-1): Don't exclude + "known" types from fontification. + +2013-09-18 Glenn Morris <rgm@gnu.org> + + * emacs-lisp/chart.el (x-display-color-cells): Declare. + (chart-face-list): Drop Emacsen without display-color-p. + + * net/eww.el (libxml-parse-html-region): Declare. + (eww-display-html): Explicit error if no libxml2 support. + + * doc-view.el (doc-view-mode): Silence --without-x compilation. + + * image.el (image-type-from-buffer, image-multi-frame-p): + Remove --without-x warning/error. + + * mouse.el (mouse-yank-primary): + * term.el (term-mouse-paste): + Reorder to silence --without-x compilation. + + * mpc.el (doc-view-mode): Silence --without-x compilation. + + * mail/rmailmm.el (rmail-mime-set-bulk-data): + Silence --without-x compilation. + + * progmodes/gud.el (gud-find-file, gud-mode): + Silence --without-x compilation. + (tooltip-mode): Declare. + + * wdired.el (dired-backup-overwrite): Remove declaration. + (wdired-mode-map): Add doc string. + + * custom.el (x-get-resource): Declare. + + * eshell/em-glob.el (ange-cache): + * eshell/em-unix.el (ange-cache): Declare. + + * faces.el (x-display-list, x-open-connection, x-get-resource): + Declare. + + * follow.el (scroll-bar-toolkit-scroll, scroll-bar-drag) + (scroll-bar-scroll-up, scroll-bar-scroll-down, mwheel-scroll): + Declare. + + * frame.el (x-display-grayscale-p, x-display-name): Declare. + + * net/gnutls.el (gnutls-log-level): Declare. + + * net/shr.el (image-size, image-animate): Declare. + + * simple.el (font-info): Declare. + + * subr.el (x-popup-dialog): Declare. + + * term/common-win.el (x-select-enable-primary) + (x-last-selected-text-primary, x-last-selected-text-clipboard): + Declare. + + * term/ns-win.el (x-handle-args): Declare. + + * term/x-win.el (x-select-enable-clipboard): Declare. + + * term/w32-win.el (create-default-fontset): Declare. + + * w32-common-fns.el (x-server-version, x-select-enable-clipboard): + Declare. + + * window.el (x-display-pixel-height, tool-bar-lines-needed): Declare. + (fit-frame-to-buffer): Explicit error if --without-x. + (mouse-autoselect-window-select): Silence compiler. + + * dframe.el (x-sensitive-text-pointer-shape, x-pointer-shape): Declare. + + * eshell/em-cmpl.el (eshell-complete-parse-arguments): + * eshell/em-hist.el (eshell/history, eshell-isearch-backward): + * eshell/em-pred.el (eshell-parse-modifiers, eshell-pred-file-time): + * eshell/esh-util.el (eshell-sublist): + Remove unused local variables. + + * eshell/esh-io.el (x-select-enable-clipboard): Declare. + + * textmodes/two-column.el: Make 2C-split work for --without-x. + (scroll-bar-columns): Autoload. + (top-level): Require fringe when compiling. + +2013-09-18 Leo Liu <sdl.web@gmail.com> + + * subr.el (add-hook): Robustify to handle closure as well. + +2013-09-17 Glenn Morris <rgm@gnu.org> + + * simple.el (messages-buffer-mode-map): Unbind "g". + +2013-09-17 Stefan Monnier <monnier@iro.umontreal.ca> + + * help-mode.el (help-mode-finish): Use derived-mode-p. + Remove obsolete highlighting. + + * play/life.el (life-mode): Use define-derived-mode. Derive from + special-mode. + (life): Let-bind inhibit-read-only. + (life-setup): Avoid `setq'. Use `life-mode'. + + * emacs-lisp/package.el (package-generate-autoloads): Remove `require' + which should not be needed any more. + (package-menu-refresh, package-menu-describe-package): Use user-error. + + * eshell/esh-cmd.el (eshell-post-rewrite-command-function): New var. + (eshell-post-rewrite-command-hook): Make obsolete. + (eshell-parse-command): Simplify. + (eshell-structure-basic-command): Remove unused arg `vocal-test'. + (eshell--cmd): Declare. + (eshell-parse-pipeline): Remove unused var `final-p'. + Pass a dynvar to eshell-post-rewrite-command-hook. + Implement the new eshell-post-rewrite-command-function. + (eshell-invoke-directly): Remove unused arg `input'. + * eshell/esh-io.el (eshell-io-initialize): + Use eshell-post-rewrite-command-function (bug#15399). + (eshell--apply-redirections): Rename from eshell-apply-redirections; + adjust to new calling convention. + (eshell-create-handles): Rename args to avoid clashing with dynvar + `standard-output'. + +2013-09-17 Glenn Morris <rgm@gnu.org> + + * simple.el (messages-buffer-mode): New major mode. + (messages-buffer): New function. + * startup.el (normal-top-level): Switch mode of *Messages* buffer. + * emacs-lisp/ert.el (ert--force-message-log-buffer-truncation) + (ert-run-test): Use `messages-buffer' function. + (ert--force-message-log-buffer-truncation): Ignore read-only. + * help.el (view-echo-area-messages): Use `messages-buffer' function. + * mail/emacsbug.el (report-emacs-bug): Use `messages-buffer' function. + +2013-09-17 Stefan Monnier <monnier@iro.umontreal.ca> + + * subr.el (eval-after-load): Preserve evaluation order (bug#15389). + + * abbrev.el (abbrev--check-chars): Fix thinko (bug#15329). + +2013-09-16 Stefan Monnier <monnier@iro.umontreal.ca> + + * icomplete.el (icomplete-in-buffer): New var. + (icomplete-pre-command-hook, icomplete-post-command-hook): Remove those + vars and replace them with functions. + (icomplete-minibuffer-setup): Adjust accordingly. + (icomplete--completion-table, icomplete--completion-predicate) + (icomplete--field-string, icomplete--field-beg, icomplete--field-end): + New functions. + (icomplete-forward-completions, icomplete-backward-completions) + (icomplete-simple-completing-p, icomplete-exhibit) + (icomplete-completions): Use them. + (icomplete--in-region-buffer): New var. + (icomplete--in-region-setup): New function. + (icomplete-mode): Use it. + + * eshell/esh-opt.el: Fix last change to set lexical-vars properly + (bug#15379). + (eshell--do-opts): Rename from eshell-do-opt, remove arg `body-fun', + return args and options. + (eshell-eval-using-options): Use the new return value of + eshell--do-opts to set the options's vars in their scope. + (eshell--set-option): Rename from eshell-set-option. + Add arg `opt-vals'. + (eshell--process-option): Rename from eshell-process-option. + Add arg `opt-vals'. + (eshell--process-args): Use an `opt-vals' alist to store the options's + values during their processing and return them additionally to the + remaining args. + +2013-09-15 Dmitry Gutov <dgutov@yandex.ru> + + * progmodes/ruby-mode.el (ruby-operator-re): Consider line + continuation character an operator, as far as indentation is + concerned (Bug#15369). + +2013-09-15 Martin Rudalics <rudalics@gmx.at> + + * window.el (window--state-put-2): Don't process buffer state + when buffer doesn't exist any more (Bug#15382). + +2013-09-15 Glenn Morris <rgm@gnu.org> + + * eshell/em-unix.el (eshell/rm): + Make -f ignore missing files. (Bug#15373) + + * eshell/esh-cmd.el (eshell--local-vars): New variable. (Bug#15372) + (eshell-rewrite-for-command): Add for loop vars to eshell--local-vars. + * eshell/esh-var.el (eshell-get-variable): Respect eshell--local-vars. + +2013-09-14 Glenn Morris <rgm@gnu.org> + + * eshell/esh-var.el (eshell-variable-aliases-list): Fix doc typo. + +2013-09-13 Glenn Morris <rgm@gnu.org> + + * dired-x.el (dired-guess-shell-alist-user): Doc fix. + (dired-guess-default): Make `file' available in the env. (Bug#15363) + +2013-09-13 Dmitry Antipov <dmantipov@yandex.ru> + + * frame.el (x-focus-frame): Mark as declared in frame.c. + +2013-09-13 Stefan Monnier <monnier@iro.umontreal.ca> + + * ls-lisp.el: Use advice-add. + (original-insert-directory): Remove. + (ls-lisp--insert-directory): Rename from insert-directory; add + `orig-fun' argument. + (insert-directory): Advise. + +2013-09-13 Eli Zaretskii <eliz@gnu.org> + + * term.el (term-emulate-terminal): Decode the command string + before passing it to term-command-hook. (Bug#15337) + +2013-09-13 Glenn Morris <rgm@gnu.org> + + * eshell/esh-util.el (ange-cache): Move declaration earlier. + + * eshell/esh-ext.el (eshell-search-path): Declare. + + * eshell/em-prompt.el (eshell/pwd): Autoload it. + Otherwise an error occurs if eshell-dirs module not loaded. + + * progmodes/gdb-mi.el (gud-cont, gud-step): Declare. + +2013-09-13 Michael Albinus <michael.albinus@gmx.de> + + * net/tramp.el (tramp-check-proper-method-and-host): Rename it from + `tramp-check-proper-host'. Check for a valid method name. + + * net/tramp-adb.el (tramp-adb-maybe-open-connection): + * net/tramp-gvfs.el (tramp-gvfs-maybe-open-connection): + * net/tramp-sh.el (tramp-maybe-open-connection): + * net/tramp-smb.el (tramp-smb-maybe-open-connection): Call it. + + * net/tramp-cache.el (tramp-cache-print): Don't print text properties + also for hash values. + +2013-09-12 Stefan Monnier <monnier@iro.umontreal.ca> + + * term/ns-win.el (parameters): Don't declare as dynamic. + (before-make-frame-hook): Don't add ineffective function. + + * eshell/*.el: Use lexical-binding (bug#15231). + +2013-09-12 Kenichi Handa <handa@gnu.org> + + * composite.el (compose-gstring-for-graphic): Handle enclosing mark. + +2013-09-12 Glenn Morris <rgm@gnu.org> + + * vc/vc-svn.el (vc-svn-dir-status-files, vc-svn-dir-extra-headers) + (vc-svn-ignore, vc-svn-retrieve-tag): Mark unused arguments. + + * subr.el (do-after-load-evaluation): Also give compiler warnings + when obsolete files are used (except by obsolete files). + + * vc/vc-svn.el (vc-svn-parse-status): If there are multiple files + in the status output, assume `filename' is the first. (Bug#15322) + + * vc/vc.el (vc-deduce-fileset): Doc fix. + + * calc/calc-help.el (Info-goto-node): + * progmodes/cperl-mode.el (Info-find-node): + * vc/ediff.el (Info-goto-node): Update declarations. + + * vc/vc-dispatcher.el (vc-dir-refresh): Declare. + + * vc/vc-bzr.el (vc-compilation-mode): Declare. + (vc-bzr-pull): Require vc-dispatcher. + * vc/vc-git.el (vc-compilation-mode): Declare. + (vc-git-pull): Require vc-dispatcher. + + * progmodes/ruby-mode.el (ruby-syntax-propertize-function): Declare. + + * progmodes/octave.el (help-button-action): Declare. + + * shell.el (shell-directory-tracker): Output error as a message + rather than just returning it as a string. + (shell-process-pushd): Remove useless use of message. + + * dframe.el (dframe-timer-fn): + * files.el (dir-locals-read-from-file): + * mpc.el (mpc--status-timer-run, mpc--status-idle-timer-run) + (mpc-format): + * reveal.el (reveal-post-command): + * saveplace.el (load-save-place-alist-from-file): + * shell.el (shell-resync-dirs): + * w32-common-fns.el (x-get-selection-value): + * emacs-lisp/copyright.el (copyright-find-copyright): + * emacs-lisp/eldoc.el (eldoc-print-current-symbol-info): + * emulation/tpu-edt.el (tpu-copy-keyfile): + * play/bubbles.el (bubbles--mark-neighbourhood): + * progmodes/executable.el + (executable-make-buffer-file-executable-if-script-p): + * term/pc-win.el (x-get-selection-value): Use with-demoted-errors. + +2013-09-12 Stefan Monnier <monnier@iro.umontreal.ca> + + Cleanup Eshell to rely less on dynamic scoping. + * eshell/esh-opt.el (eshell-eval-using-options): Don't bind usage-msg, + last-value, and ext-command here. Bind `args' closer to `body'. + (temp-args, last-value, usage-msg, ext-command, args): Don't defvar. + (eshell--args): Declare new dynamic var. + (eshell-do-opt): Add argument `args'. Bind our own usage-msg, + last-value, and ext-command. Pass `args' to `body'. + (eshell-process-args): Bind eshell--args. + (eshell-set-option): Use eshell--args. + * eshell/eshell.el (eshell): Use derived-mode-p. + * eshell/esh-var.el (eshell-parse-variable): Use backquote. + (eshell-parse-variable-ref): Remove unused vars `end' and `err'. + (eshell-glob-function): Declare. + * eshell/esh-util.el: Require cl-lib. + (eshell-read-hosts-file): Avoid add-to-list. + * eshell/esh-cmd.el (eshell-parse-lisp-argument): Remove unused var + `err'. + * eshell/em-unix.el (compilation-scroll-output, locate-history-list): + Declare. + (eshell/diff): Remove unused var `err'. + * eshell/em-rebind.el (eshell-delete-backward-char): Remove unused arg + `killflag'. + * eshell/em-pred.el (eshell-parse-modifiers): Remove unused var `err'. + * eshell/em-ls.el (eshell-ls-highlight-alist): Move defvars before + first use. + * eshell/em-glob.el (eshell-glob-matches, message-shown): + Move declaration before first use. + * eshell/em-alias.el (eshell-maybe-replace-by-alias): Use backquotes. + * autorevert.el (auto-revert-notify-handler): Use `cl-dolist' since we + rely on cl-return. + +2013-09-12 Glenn Morris <rgm@gnu.org> + + * term/ns-win.el (global-map): Remove binding for ispell-next, + deleted 1999-05-29. (Bug#15357) + +2013-09-11 Glenn Morris <rgm@gnu.org> + + * echistory.el (electric-command-history): Remove call to deleted func. + + * play/landmark.el (landmark-mode): Fix typos. + + * vc/vc-cvs.el (cvs-append-to-ignore): Fix arg spec. + Check cvs-sort-ignore-file is bound. + + * savehist.el: No need for cl when compiling on Emacs. + +2013-09-11 Stefan Monnier <monnier@iro.umontreal.ca> + + * eshell/esh-mode.el (eshell-mode-syntax-table): Fix up initialization + (bug#15338). + (eshell-self-insert-command, eshell-send-invisible): + Remove unused argument. + (eshell-handle-control-codes): Remove unused var `orig'. + Avoid delete-backward-char. + + * files.el (set-auto-mode): Simplify a bit further. + +2013-09-11 Glenn Morris <rgm@gnu.org> + + * files.el (interpreter-mode-alist): Remove \\` \\' parts. + (set-auto-mode): Don't regexp-quote elements. + * progmodes/python.el (interpreter-mode-alist): Remove \\` \\'. + * progmodes/cc-mode.el (interpreter-mode-alist): + * progmodes/ruby-mode.el (interpreter-mode-alist): + Revert previous change. + +2013-09-11 Stefan Monnier <monnier@iro.umontreal.ca> + + * play/snake.el (snake-mode): + * play/mpuz.el (mpuz-mode): + * play/landmark.el (lm-mode): + * play/blackbox.el (blackbox-mode): + * play/5x5.el (5x5-mode): + * obsolete/options.el (Edit-options-mode): + * net/quickurl.el (quickurl-list-mode): + * net/newst-treeview.el (newsticker-treeview-mode): + * mail/rmailsum.el (rmail-summary-mode): + * mail/mspools.el (mspools-mode): + * locate.el (locate-mode): + * ibuffer.el (ibuffer-mode): + * emulation/ws-mode.el (wordstar-mode): + * emacs-lisp/debug.el (debugger-mode): + * array.el (array-mode): + * net/eudc.el (eudc-mode): Use define-derived-mode. + * net/mairix.el (mairix-searches-mode-font-lock-keywords): + Move initialization into declaration. + (mairix-searches-mode): Use define-derived-mode. + * net/eudc-hotlist.el (eudc-hotlist-mode): Use define-derived-mode. + (eudc-edit-hotlist): Use dolist. + * man.el (Man-mode-syntax-table): Rename from man-mode-syntax-table. + (Man-mode): Use define-derived-mode. + * info.el (Info-edit-mode-map): Rename from Info-edit-map. + (Info-edit-mode): Use define-derived-mode. + (Info-cease-edit): Use Info-mode. + * eshell/esh-mode.el (eshell-mode-syntax-table): Move initialization + into declaration. + (eshell-mode): Use define-derived-mode. + * chistory.el (command-history-mode-map): Rename from + command-history-map. + (command-history-mode): Use define-derived-mode. + (Command-history-setup): Remove function. + * calc/calc.el (calc-trail-mode-map): New var. + (calc-trail-mode): Use define-derived-mode. + (calc-trail-buffer): Set calc-main-buffer manually. + * bookmark.el (bookmark-insert-annotation): New function. + (bookmark-edit-annotation): Use it. + (bookmark-edit-annotation-mode): Make it a proper major mode. + (bookmark-send-edited-annotation): Use derived-mode-p. + * arc-mode.el (archive-mode): Move kill-all-local-variables a tiny bit + closer to its ideal place. Use \' to match EOS. + + * profiler.el (profiler-calltree-find): Use function-equal. + +2013-09-10 Glenn Morris <rgm@gnu.org> + + * files.el (interpreter-mode-alist): Convert to regexps. + (set-auto-mode): Adapt for this. (Bug#15306) + * progmodes/cperl-mode.el (cperl-clobber-mode-lists): + Comment out unused variable. + * progmodes/cc-mode.el (interpreter-mode-alist): + * progmodes/python.el (interpreter-mode-alist): + * progmodes/ruby-mode.el (interpreter-mode-alist): Convert to regexps. + * progmodes/sh-script.el (sh-set-shell): + No longer use interpreter-mode-alist to get list of shells. + + * progmodes/cc-mode.el (awk-mode): Remove duplicate autoload. + +2013-09-10 Stefan Monnier <monnier@iro.umontreal.ca> + + * simple.el: Use set-temporary-overlay-map for universal-argument. + (universal-argument-map): Don't use default-bindings (bug#15317). + Bind switch-frame explicitly. Replace universal-argument-minus with + a conditional binding. + (universal-argument-num-events, saved-overriding-map): Remove. + (restore-overriding-map): Remove. + (universal-argument--mode): Rename from save&set-overriding-map, + and rewrite. + (universal-argument, universal-argument-more, negative-argument) + (digit-argument): Adjust accordingly. + (universal-argument-minus): Remove. + (universal-argument-other-key): Remove. + + * subr.el (with-demoted-errors): Add `format' argument. + +2013-09-10 Michael Albinus <michael.albinus@gmx.de> + + * net/tramp.el (tramp-cleanup): Remove. Functionality added to + `tramp-cleanup-connection'. + + * net/tramp-cmds.el (tramp-cleanup-connection): Add optional + parameters KEEP-DEBUG and KEEP-PASSWORD. + + * net/tramp.el (tramp-file-name-handler): + * net/tramp-adb.el (tramp-adb-maybe-open-connection): + * net/tramp-sh.el (tramp-open-connection-setup-interactive-shell) + (tramp-maybe-open-connection): + * net/tramp-smb.el (tramp-smb-maybe-open-connection): + Use `tramp-cleanup-connection'. + + * net/tramp-sh.el (tramp-maybe-open-connection): + Catch 'uname-changed inside the progress reporter. + +2013-09-10 Glenn Morris <rgm@gnu.org> + + * simple.el (read-minibuffer): Unbreak it. (Bug#15318) + + * dired-x.el (dired-mark-sexp): Unbreak for systems where ls + returns "alternate access method" in mode (eg "-rw-r--r--."). + +2013-09-08 Glenn Morris <rgm@gnu.org> + + * saveplace.el (load-save-place-alist-from-file): + Demote errors. (Bug#15305) + +2013-09-08 Michael Albinus <michael.albinus@gmx.de> + + Improve compatibility with older Emacsen, and XEmacs. + + * net/tramp.el (tramp-find-method, tramp-find-user): Call `propertize' + only if it is bound. It isn't for XEmacs. + (with-tramp-progress-reporter): Do not let-bind `result'. + This yields to scoping errors in XEmacs. + (tramp-handle-make-auto-save-file-name): New function, moved from + tramp-sh.el. + + * net/tramp-adb.el (tramp-adb-file-name-handler-alist): Add handler + for `make-auto-save-file-name'. + (tramp-adb--gnu-switches-to-ash): + Use `tramp-compat-replace-regexp-in-string'. + + * net/tramp-cache.el (tramp-cache-print): Call + `substring-no-properties' only if it is bound. It isn't for XEmacs. + + * net/tramp-cmds.el (tramp-bug): Call `propertize' only if it is + bound. It isn't for XEmacs. + + * net/tramp-compat.el (tramp-compat-copy-file): + Catch `wrong-number-of-arguments' error. + (tramp-compat-replace-regexp-in-string): New defun. + + * net/tramp-gvfs.el (tramp-gvfs-file-name-handler-alist): Add handler + for `make-auto-save-file-name'. + (tramp-gvfs-handle-copy-file): Use `tramp-compat-funcall' for + `copy-file'. + (tramp-gvfs-file-gvfs-monitor-file-process-filter) + (tramp-gvfs-file-name): Use `tramp-compat-replace-regexp-in-string'. + (tramp-synce-list-devices): Use `push' instead of `pushnew'. + + * net/tramp-gw.el (tramp-gw-open-network-stream): + Use `tramp-compat-replace-regexp-in-string'. + + * net/tramp-sh.el (tramp-sh-file-name-handler-alist): + Call `tramp-handle-make-auto-save-file-name'. + (tramp-sh-handle-make-auto-save-file-name): Move to tramp.el. + (tramp-sh-file-gvfs-monitor-dir-process-filter) + (tramp-sh-file-inotifywait-process-filter): + Use `tramp-compat-replace-regexp-in-string'. + (tramp-compute-multi-hops): Use `push' instead of `pushnew'. + + * net/tramp-smb.el (tramp-smb-file-name-handler-alist): Add handler + for `make-auto-save-file-name'. + (tramp-smb-handle-copy-directory): + Call `tramp-compat-replace-regexp-in-string'. + (tramp-smb-get-file-entries): Use `push' instead of `pushnew'. + (tramp-smb-handle-copy-file): Improve error message. + (tramp-smb-handle-rename-file): Rename directly only in case + `newname' does not exist yet. This is a restriction of smbclient. + (tramp-smb-maybe-open-connection): Rerun the function only when + `auth-sources' is non-nil. + +2013-09-08 Kenichi Handa <handa@gnu.org> + + * international/characters.el: Set category "^" (Combining) for + more characters. + +2013-09-07 Alan Mackenzie <acm@muc.de> + + Correctly fontify Java class constructors. + * progmodes/cc-langs.el (c-type-decl-suffix-key): Now matches ")" + in Java Mode. + (c-recognize-typeless-decls): Set the Java value to t. + * progmodes/cc-engine.el (c-forward-decl-or-cast-1): + While handling a "(", add a check for, effectively, Java, and handle a + "typeless" declaration there. + +2013-09-07 Roland Winkler <winkler@gnu.org> + + * textmodes/bibtex.el (bibtex-biblatex-entry-alist): Add optional + field subtitle for entry type book. + +2013-09-06 Stefan Monnier <monnier@iro.umontreal.ca> + + * minibuffer.el: Make minibuffer-complete call completion-in-region + rather than other way around. + (completion--some, completion-pcm--find-all-completions): + Don't delay signals when debugging. + (minibuffer-completion-contents): Beware fields within the + minibuffer contents. + (completion-all-sorted-completions): Use defvar-local. + (completion--do-completion, completion--cache-all-sorted-completions) + (completion-all-sorted-completions, minibuffer-force-complete): + Add args `beg' and `end'. + (completion--in-region-1): New fun, extracted from minibuffer-complete. + (minibuffer-complete): Use completion-in-region. + (completion-complete-and-exit): New fun, extracted from + minibuffer-complete-and-exit. + (minibuffer-complete-and-exit): Use it. + (completion--complete-and-exit): Rename from + minibuffer--complete-and-exit. + (completion-in-region--single-word): New function, extracted from + minibuffer-complete-word. + (minibuffer-complete-word): Use it. + (display-completion-list): Make `common-substring' argument obsolete. + (completion--in-region): Call completion--in-region-1 instead of + minibuffer-complete. + (completion-help-at-point): Pass boundaries to + minibuffer-completion-help as args rather than via an overlay. + (completion-pcm--string->pattern): Use `any-delim'. + (completion-pcm--optimize-pattern): New function. + (completion-pcm--pattern->regex): Handle `any-delim'. + * icomplete.el (icomplete-forward-completions) + (icomplete-backward-completions, icomplete-completions): + Adjust calls to completion-all-sorted-completions and + completion--cache-all-sorted-completions. + (icomplete-with-completion-tables): Default to t. + * emacs-lisp/crm.el (crm--current-element): Rename from + crm--select-current-element. Don't put an overlay but return the + boundaries instead. + (crm--completion-command): Take two new args to bind to the boundaries. + (crm-completion-help): Adjust accordingly. + (crm-complete): Use completion-in-region. + (crm-complete-word): Use completion-in-region--single-word. + (crm-complete-and-exit): Use completion-complete-and-exit. + +2013-09-06 Stefan Monnier <monnier@iro.umontreal.ca> + + * dired-x.el (dired-mark-sexp): Bind the vars lexically rather + than dynamically. + +2013-09-06 Juri Linkov <juri@jurta.org> + + * info.el (Info-display-images-node): When image file doesn't exist + display text version of the image if it's provided in the Info file. + Otherwise, display the location of missing image from SRC attribute. + Add help-echo text property from ALT attribute. (Bug#15279) + +2013-09-06 Stefan Monnier <monnier@iro.umontreal.ca> + + * abbrev.el (edit-abbrevs-mode-map): Rename from edit-abbrevs-map. + (edit-abbrevs-mode): Use define-derived-mode. + + * epa.el (epa--encode-coding-string, epa--decode-coding-string) + (epa--select-safe-coding-system, epa--derived-mode-p): Make it obvious + that it's defined. + (epa-key-list-mode, epa-key-mode, epa-info-mode): + Use define-derived-mode. + + * epg.el (epg-start-encrypt): Minor CSE simplification. + +2013-09-06 William Xu <william.xwl@gmail.com> + + * arc-mode.el: Add support for 7za (bug#15264). + (archive-7z-program): New var. + (archive-zip-extract, archive-zip-expunge, archive-zip-update) + (archive-zip-update-case, archive-7z-extract, archive-7z-expunge) + (archive-7z-update, archive-zip-extract, archive-7z-summarize): Use it. + +2013-09-06 Michael Albinus <michael.albinus@gmx.de> + + Remove URL syntax. + + * net/tramp.el (tramp-syntax, tramp-prefix-format) + (tramp-postfix-method-format, tramp-prefix-ipv6-format) + (tramp-postfix-ipv6-format, tramp-prefix-port-format) + (tramp-postfix-host-format, tramp-file-name-regexp) + (tramp-completion-file-name-regexp) + (tramp-completion-dissect-file-name) + (tramp-handle-substitute-in-file-name): Remove 'url case. + (tramp-file-name-regexp-url) + (tramp-completion-file-name-regexp-url): Remove constants. + +2013-09-06 Glenn Morris <rgm@gnu.org> + + * replace.el (replace-string): Doc fix re start/end. (Bug#15275) + +2013-09-05 Dmitry Gutov <dgutov@yandex.ru> + + * progmodes/ruby-mode.el (ruby-font-lock-keywords): Move "Perl-ish + keywords" below "here-doc beginnings" (Bug#15270). + 2013-09-05 Stefan Monnier <monnier@iro.umontreal.ca> * subr.el (pop): Use `car-safe'. @@ -59,6 +842,30 @@ 2013-09-04 Stefan Monnier <monnier@iro.umontreal.ca> + * vc/vc-dispatcher.el (vc-run-delayed): New macro. + (vc-do-command, vc-set-async-update): + * vc/vc-mtn.el (vc-mtn-dir-status): + * vc/vc-hg.el (vc-hg-dir-status, vc-hg-dir-status-files) + (vc-hg-pull, vc-hg-merge-branch): + * vc/vc-git.el (vc-git-dir-status-goto-stage, vc-git-pull) + (vc-git-merge-branch): + * vc/vc-cvs.el (vc-cvs-print-log, vc-cvs-dir-status) + (vc-cvs-dir-status-files): + * vc/vc-bzr.el (vc-bzr-pull, vc-bzr-merge-branch, vc-bzr-dir-status) + (vc-bzr-dir-status-files): + * vc/vc-arch.el (vc-arch-dir-status): Use vc-run-delayed. + * vc/vc-annotate.el: Use lexical-binding. + (vc-annotate-display-select, vc-annotate): Use vc-run-delayed. + (vc-sentinel-movepoint): Declare. + (vc-annotate): Don't use `goto-line'. + * vc/vc.el (vc-diff-internal): Prefer a closure to `(lambda...). + (vc-diff-internal, vc-log-internal-common): Use vc-run-delayed. + (vc-sentinel-movepoint): Declare. + * vc/vc-svn.el: Use lexical-binding. + (vc-svn-dir-status, vc-svn-dir-status-files): Use vc-run-delayed. + * vc/vc-sccs.el: + * vc/vc-rcs.el: Use lexical-binding. + * autorevert.el (auto-revert-notify-handler): Explicitly ignore `deleted'. Don't drop errors silently. @@ -3602,7 +4409,7 @@ * term/xterm.el (xterm--query): Stop after first matching handler. (Bug#14615) -2013-06-14 Ivan Kanis <ivan@kanis.fr> +2013-06-14 Ivan Kanis <ivan@kanis.fr> Add support for dired in saveplace. * dired.el (dired-initial-position-hook): New variable. @@ -6212,7 +7019,7 @@ (vc-exec-after): Allow code to be a function. Use add/remove-function. (compilation-error-regexp-alist, view-old-buffer-read-only): Declare. -2013-04-19 Masatake YAMATO <yamato@redhat.com> +2013-04-19 Masatake YAMATO <yamato@redhat.com> * progmodes/sh-script.el (sh-imenu-generic-expression): Handle function names with a single character. (Bug#14111) diff --git a/lisp/ChangeLog.16 b/lisp/ChangeLog.16 index 7692a0fffa8..b18d2bf9da4 100644 --- a/lisp/ChangeLog.16 +++ b/lisp/ChangeLog.16 @@ -7788,7 +7788,7 @@ (ruby-syntax-propertize-function): Adjust for changes in `ruby-syntax-propertize-heredoc'. -2012-08-09 Nobuyoshi Nakada <nobu@ruby-lang.org> +2012-08-09 Nobuyoshi Nakada <nobu@ruby-lang.org> * progmodes/ruby-mode.el (ruby-mode-map): Remove deprecated binding (use `M-;' instead). diff --git a/lisp/abbrev.el b/lisp/abbrev.el index d82e2eabd84..458d8741ac8 100644 --- a/lisp/abbrev.el +++ b/lisp/abbrev.el @@ -67,13 +67,15 @@ be replaced by its expansion." (put 'abbrev-mode 'safe-local-variable 'booleanp) -(defvar edit-abbrevs-map +(defvar edit-abbrevs-mode-map (let ((map (make-sparse-keymap))) (define-key map "\C-x\C-s" 'abbrev-edit-save-buffer) (define-key map "\C-x\C-w" 'abbrev-edit-save-to-file) (define-key map "\C-c\C-c" 'edit-abbrevs-redefine) map) "Keymap used in `edit-abbrevs'.") +(define-obsolete-variable-alias 'edit-abbrevs-map + 'edit-abbrevs-mode-map "24.4") (defun kill-all-abbrevs () "Undefine all defined abbrevs." @@ -144,16 +146,6 @@ Otherwise display all abbrevs." (set-buffer-modified-p nil) (current-buffer)))) -(defun edit-abbrevs-mode () - "Major mode for editing the list of abbrev definitions. -\\{edit-abbrevs-map}" - (interactive) - (kill-all-local-variables) - (setq major-mode 'edit-abbrevs-mode) - (setq mode-name "Edit-Abbrevs") - (use-local-map edit-abbrevs-map) - (run-mode-hooks 'edit-abbrevs-mode-hook)) - (defun edit-abbrevs () "Alter abbrev definitions by editing a list of them. Selects a buffer containing a list of abbrev definitions with @@ -615,9 +607,9 @@ An obsolete but still supported calling form is: "Check if the characters in ABBREV have word syntax in either the current (if global is nil) or standard syntax table." (with-syntax-table - (cond ((null global) (standard-syntax-table)) + (cond ((null global) (syntax-table)) ;; ((syntax-table-p global) global) - (t (syntax-table))) + (t (standard-syntax-table))) (when (string-match "\\W" abbrev) (let ((badchars ()) (pos 0)) @@ -1013,6 +1005,11 @@ SORTFUN is passed to `sort' to change the default ordering." (sort entries (lambda (x y) (funcall sortfun (nth 2 x) (nth 2 y))))))) +;; Keep it after define-abbrev-table, since define-derived-mode uses +;; define-abbrev-table. +(define-derived-mode edit-abbrevs-mode special-mode "Edit-Abbrevs" + "Major mode for editing the list of abbrev definitions.") + (provide 'abbrev) ;;; abbrev.el ends here diff --git a/lisp/arc-mode.el b/lisp/arc-mode.el index 5f001ad977b..c22205d5634 100644 --- a/lisp/arc-mode.el +++ b/lisp/arc-mode.el @@ -218,9 +218,14 @@ Archive and member name will be added." ;; ------------------------------ ;; Zip archive configuration +(defvar archive-7z-program (let ((7z (or (executable-find "7z") + (executable-find "7za")))) + (when 7z + (file-name-nondirectory 7z)))) + (defcustom archive-zip-extract (cond ((executable-find "unzip") '("unzip" "-qq" "-c")) - ((executable-find "7z") '("7z" "x" "-so")) + (archive-7z-program `(,archive-7z-program "x" "-so")) ((executable-find "pkunzip") '("pkunzip" "-e" "-o-")) (t '("unzip" "-qq" "-c"))) "Program and its options to run in order to extract a zip file member. @@ -239,7 +244,7 @@ be added." (defcustom archive-zip-expunge (cond ((executable-find "zip") '("zip" "-d" "-q")) - ((executable-find "7z") '("7z" "d")) + (archive-7z-program `(,archive-7z-program "d")) ((executable-find "pkzip") '("pkzip" "-d")) (t '("zip" "-d" "-q"))) "Program and its options to run in order to delete zip file members. @@ -252,7 +257,7 @@ Archive and member names will be added." (defcustom archive-zip-update (cond ((executable-find "zip") '("zip" "-q")) - ((executable-find "7z") '("7z" "u")) + (archive-7z-program `(,archive-7z-program "u")) ((executable-find "pkzip") '("pkzip" "-u" "-P")) (t '("zip" "-q"))) "Program and its options to run in order to update a zip file member. @@ -266,7 +271,7 @@ file. Archive and member name will be added." (defcustom archive-zip-update-case (cond ((executable-find "zip") '("zip" "-q" "-k")) - ((executable-find "7z") '("7z" "u")) + (archive-7z-program `(,archive-7z-program "u")) ((executable-find "pkzip") '("pkzip" "-u" "-P")) (t '("zip" "-q" "-k"))) "Program and its options to run in order to update a case fiddled zip member. @@ -321,7 +326,7 @@ Archive and member name will be added." ;; 7z archive configuration (defcustom archive-7z-extract - '("7z" "x" "-so") + `(,archive-7z-program "x" "-so") "Program and its options to run in order to extract a 7z file member. Extraction should happen to standard output. Archive and member name will be added." @@ -333,7 +338,7 @@ be added." :group 'archive-7z) (defcustom archive-7z-expunge - '("7z" "d") + `(,archive-7z-program "d") "Program and its options to run in order to delete 7z file members. Archive and member names will be added." :version "24.1" @@ -344,7 +349,7 @@ Archive and member names will be added." :group 'archive-7z) (defcustom archive-7z-update - '("7z" "u") + `(,archive-7z-program "u") "Program and its options to run in order to update a 7z file member. Options should ensure that specified directory will be put into the 7z file. Archive and member name will be added." @@ -678,9 +683,9 @@ archive. ;; At present we cannot create archives from scratch (funcall (or (default-value 'major-mode) 'fundamental-mode)) (if (and (not force) archive-files) nil + (kill-all-local-variables) (let* ((type (archive-find-type)) (typename (capitalize (symbol-name type)))) - (kill-all-local-variables) (make-local-variable 'archive-subtype) (setq archive-subtype type) @@ -756,7 +761,7 @@ archive. ((looking-at "..-l[hz][0-9ds]-") 'lzh) ((looking-at "....................[\334]\247\304\375") 'zoo) ((and (looking-at "\C-z") ; signature too simple, IMHO - (string-match "\\.[aA][rR][cC]$" + (string-match "\\.[aA][rR][cC]\\'" (or buffer-file-name (buffer-name)))) 'arc) ;; This pattern modeled on the BSD/GNU+Linux `file' command. @@ -1864,7 +1869,7 @@ This doesn't recover lost files, it just undoes changes in the buffer itself." (cond ((member-ignore-case (car archive-zip-extract) '("pkunzip" "pkzip")) (archive-*-extract archive name archive-zip-extract)) - ((equal (car archive-zip-extract) "7z") + ((equal (car archive-zip-extract) archive-7z-program) (let ((archive-7z-extract archive-zip-extract)) (archive-7z-extract archive name))) (t @@ -2088,7 +2093,7 @@ This doesn't recover lost files, it just undoes changes in the buffer itself." (file buffer-file-name) (files ())) (with-temp-buffer - (call-process "7z" nil t nil "l" "-slt" file) + (call-process archive-7z-program nil t nil "l" "-slt" file) (goto-char (point-min)) ;; Four dashes start the meta info section that should be skipped. ;; Archive members start with more than four dashes. diff --git a/lisp/array.el b/lisp/array.el index e60cbdfffc1..8c4f609e626 100644 --- a/lisp/array.el +++ b/lisp/array.el @@ -800,7 +800,7 @@ Return COLUMN." (put 'array-mode 'mode-class 'special) ;;;###autoload -(defun array-mode () +(define-derived-mode array-mode fundamental-mode "Array" "Major mode for editing arrays. Array mode is a specialized mode for editing arrays. An array is @@ -863,9 +863,6 @@ take a numeric prefix argument): \\[array-display-local-variables] Display the current values of local variables. Entering array mode calls the function `array-mode-hook'." - - (interactive) - (kill-all-local-variables) (make-local-variable 'array-buffer-line) (make-local-variable 'array-buffer-column) (make-local-variable 'array-row) @@ -888,13 +885,9 @@ Entering array mode calls the function `array-mode-hook'." (+ (floor (1- array-max-column) array-columns-per-line) (if array-rows-numbered 2 1))) (message "") - (setq major-mode 'array-mode) - (setq mode-name "Array") (force-mode-line-update) (set (make-local-variable 'truncate-lines) t) - (setq overwrite-mode 'overwrite-mode-textual) - (use-local-map array-mode-map) - (run-mode-hooks 'array-mode-hook)) + (setq overwrite-mode 'overwrite-mode-textual)) diff --git a/lisp/autoarg.el b/lisp/autoarg.el index 6878995454a..7501f09c773 100644 --- a/lisp/autoarg.el +++ b/lisp/autoarg.el @@ -75,7 +75,6 @@ (setq prefix-arg (if (zerop digit) '- (- digit)))) (t (setq prefix-arg digit)))) - (setq universal-argument-num-events (length (this-command-keys))) (setq overriding-terminal-local-map universal-argument-map)) (defvar autoarg-kp-mode-map diff --git a/lisp/autoinsert.el b/lisp/autoinsert.el index daa654889b6..3801a790374 100644 --- a/lisp/autoinsert.el +++ b/lisp/autoinsert.el @@ -166,7 +166,7 @@ If this contains a %s, that will be replaced by the matching rule." "Short description: " ";;; " (file-name-nondirectory (buffer-file-name)) " --- " str (make-string (max 2 (- 80 (current-column) 27)) ?\s) - "-*- lexical-binding: t; -*-" + "-*- lexical-binding: t; -*-" '(setq lexical-binding t) " ;; Copyright (C) " (format-time-string "%Y") " " diff --git a/lisp/autorevert.el b/lisp/autorevert.el index 0e2b6f32cf3..65526f07e1b 100644 --- a/lisp/autorevert.el +++ b/lisp/autorevert.el @@ -548,7 +548,7 @@ will use an up-to-date value of `auto-revert-interval'" (cl-assert (stringp file)) (when (eq action 'renamed) (cl-assert (stringp file1))) ;; Loop over all buffers, in order to find the intended one. - (dolist (buffer buffers) + (cl-dolist (buffer buffers) (when (buffer-live-p buffer) (with-current-buffer buffer (when (and (stringp buffer-file-name) diff --git a/lisp/bookmark.el b/lisp/bookmark.el index 9514317809b..ce0d6831a3a 100644 --- a/lisp/bookmark.el +++ b/lisp/bookmark.el @@ -862,31 +862,25 @@ It takes one argument, the name of the bookmark, as a string.") map) "Keymap for editing an annotation of a bookmark.") - -(defun bookmark-edit-annotation-mode (bookmark-name-or-record) - "Mode for editing the annotation of bookmark BOOKMARK-NAME-OR-RECORD. -When you have finished composing, type \\[bookmark-send-annotation]. - -\\{bookmark-edit-annotation-mode-map}" - (interactive) - (kill-all-local-variables) - (make-local-variable 'bookmark-annotation-name) - (setq bookmark-annotation-name bookmark-name-or-record) - (use-local-map bookmark-edit-annotation-mode-map) - (setq major-mode 'bookmark-edit-annotation-mode - mode-name "Edit Bookmark Annotation") +(defun bookmark-insert-annotation (bookmark-name-or-record) (insert (funcall bookmark-edit-annotation-text-func bookmark-name-or-record)) (let ((annotation (bookmark-get-annotation bookmark-name-or-record))) (if (and annotation (not (string-equal annotation ""))) - (insert annotation))) - (run-mode-hooks 'text-mode-hook)) + (insert annotation)))) + +(define-derived-mode bookmark-edit-annotation-mode + text-mode "Edit Bookmark Annotation" + "Mode for editing the annotation of bookmarks. +When you have finished composing, type \\[bookmark-send-annotation]. + +\\{bookmark-edit-annotation-mode-map}") (defun bookmark-send-edited-annotation () "Use buffer contents as annotation for a bookmark. Lines beginning with `#' are ignored." (interactive) - (if (not (eq major-mode 'bookmark-edit-annotation-mode)) + (if (not (derived-mode-p 'bookmark-edit-annotation-mode)) (error "Not in bookmark-edit-annotation-mode")) (goto-char (point-min)) (while (< (point) (point-max)) @@ -906,7 +900,10 @@ Lines beginning with `#' are ignored." (defun bookmark-edit-annotation (bookmark-name-or-record) "Pop up a buffer for editing bookmark BOOKMARK-NAME-OR-RECORD's annotation." (pop-to-buffer (generate-new-buffer-name "*Bookmark Annotation Compose*")) - (bookmark-edit-annotation-mode bookmark-name-or-record)) + (bookmark-insert-annotation bookmark-name-or-record) + (bookmark-edit-annotation-mode) + (set (make-local-variable 'bookmark-annotation-name) + bookmark-name-or-record)) (defun bookmark-buffer-name () diff --git a/lisp/calc/calc-help.el b/lisp/calc/calc-help.el index 2b7b56c3f89..641453568ca 100644 --- a/lisp/calc/calc-help.el +++ b/lisp/calc/calc-help.el @@ -30,7 +30,7 @@ (require 'calc-macs) ;; Declare functions which are defined elsewhere. -(declare-function Info-goto-node "info" (nodename &optional fork)) +(declare-function Info-goto-node "info" (nodename &optional fork strict-case)) (declare-function Info-last "info" ()) diff --git a/lisp/calc/calc.el b/lisp/calc/calc.el index 2eeb880c34d..2795a177a41 100644 --- a/lisp/calc/calc.el +++ b/lisp/calc/calc.el @@ -1387,7 +1387,12 @@ Notations: 3.14e6 3.14 * 10^6 (calc-check-defines)) (setplist 'calc-define nil))))) -(defun calc-trail-mode (&optional buf) +(defvar calc-trail-mode-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map calc-mode-map) + map)) + +(define-derived-mode calc-trail-mode fundamental-mode "Calc Trail" "Calc Trail mode. This mode is used by the *Calc Trail* buffer, which records all results obtained by the GNU Emacs Calculator. @@ -1397,26 +1402,18 @@ the Trail. This buffer uses the same key map as the *Calculator* buffer; calculator commands given here will actually operate on the *Calculator* stack." - (interactive) - (fundamental-mode) - (use-local-map calc-mode-map) - (setq major-mode 'calc-trail-mode) - (setq mode-name "Calc Trail") (setq truncate-lines t) (setq buffer-read-only t) (make-local-variable 'overlay-arrow-position) (make-local-variable 'overlay-arrow-string) - (when buf - (set (make-local-variable 'calc-main-buffer) buf)) (when (= (buffer-size) 0) (let ((buffer-read-only nil)) - (insert (propertize "Emacs Calculator Trail\n" 'face 'italic)))) - (run-mode-hooks 'calc-trail-mode-hook)) + (insert (propertize "Emacs Calculator Trail\n" 'face 'italic))))) (defun calc-create-buffer () "Create and initialize a buffer for the Calculator." (set-buffer (get-buffer-create "*Calculator*")) - (or (eq major-mode 'calc-mode) + (or (derived-mode-p 'calc-mode) (calc-mode)) (setq max-lisp-eval-depth (max max-lisp-eval-depth 1000)) (when calc-always-load-extensions @@ -1439,7 +1436,7 @@ commands given here will actually operate on the *Calculator* stack." (when (get-buffer-window "*Calc Keypad*") (calc-keypad) (set-buffer (window-buffer))) - (if (eq major-mode 'calc-mode) + (if (derived-mode-p 'calc-mode) (calc-quit) (let ((oldbuf (current-buffer))) (calc-create-buffer) @@ -1490,7 +1487,7 @@ commands given here will actually operate on the *Calculator* stack." (if (and (equal (buffer-name) "*Gnuplot Trail*") (> (recursion-depth) 0)) (exit-recursive-edit) - (if (eq major-mode 'calc-edit-mode) + (if (derived-mode-p 'calc-edit-mode) (calc-edit-finish arg) (if calc-was-keypad-mode (calc-keypad) @@ -1504,13 +1501,13 @@ commands given here will actually operate on the *Calculator* stack." (if (and (equal (buffer-name) "*Gnuplot Trail*") (> (recursion-depth) 0)) (exit-recursive-edit)) - (if (eq major-mode 'calc-edit-mode) + (if (derived-mode-p 'calc-edit-mode) (calc-edit-cancel) (if (and interactive calc-embedded-info (eq (current-buffer) (aref calc-embedded-info 0))) (calc-embedded nil) - (unless (eq major-mode 'calc-mode) + (unless (derived-mode-p 'calc-mode) (calc-create-buffer)) (run-hooks 'calc-end-hook) (if (integerp calc-undo-length) @@ -1631,10 +1628,10 @@ See calc-keypad for details." (if (math-lessp 1 time) (calc-record time "(t)")))) (or (memq 'no-align calc-command-flags) - (eq major-mode 'calc-trail-mode) + (derived-mode-p 'calc-trail-mode) (calc-align-stack-window)) (and (memq 'position-point calc-command-flags) - (if (eq major-mode 'calc-mode) + (if (derived-mode-p 'calc-mode) (progn (goto-char (point-min)) (forward-line (1- calc-final-point-line)) @@ -1664,7 +1661,7 @@ See calc-keypad for details." (setq calc-command-flags (cons f calc-command-flags)))) (defun calc-select-buffer () - (or (eq major-mode 'calc-mode) + (or (derived-mode-p 'calc-mode) (if calc-main-buffer (set-buffer calc-main-buffer) (let ((buf (get-buffer "*Calculator*"))) @@ -1801,7 +1798,7 @@ See calc-keypad for details." (and calc-embedded-info (calc-embedded-mode-line-change)))))) (defun calc-align-stack-window () - (if (eq major-mode 'calc-mode) + (if (derived-mode-p 'calc-mode) (progn (let ((win (get-buffer-window (current-buffer)))) (if win @@ -1988,7 +1985,7 @@ See calc-keypad for details." (defvar calc-any-evaltos nil) (defun calc-refresh (&optional align) (interactive) - (and (eq major-mode 'calc-mode) + (and (derived-mode-p 'calc-mode) (not calc-executing-macro) (let* ((buffer-read-only nil) (save-point (point)) @@ -2016,7 +2013,7 @@ See calc-keypad for details." (calc-align-stack-window) (goto-char save-point)) (if save-mark (set-mark save-mark)))) - (and calc-embedded-info (not (eq major-mode 'calc-mode)) + (and calc-embedded-info (not (derived-mode-p 'calc-mode)) (with-current-buffer (aref calc-embedded-info 1) (calc-refresh align))) (setq calc-refresh-count (1+ calc-refresh-count))) @@ -2078,12 +2075,13 @@ the United States." (null (buffer-name calc-trail-buffer))) (save-excursion (setq calc-trail-buffer (get-buffer-create "*Calc Trail*")) - (let ((buf (or (and (not (eq major-mode 'calc-mode)) + (let ((buf (or (and (not (derived-mode-p 'calc-mode)) (get-buffer "*Calculator*")) (current-buffer)))) (set-buffer calc-trail-buffer) - (or (eq major-mode 'calc-trail-mode) - (calc-trail-mode buf))))) + (unless (derived-mode-p 'calc-trail-mode) + (calc-trail-mode) + (set (make-local-variable 'calc-main-buffer) buf))))) (or (and calc-trail-pointer (eq (marker-buffer calc-trail-pointer) calc-trail-buffer)) (with-current-buffer calc-trail-buffer @@ -2152,7 +2150,7 @@ the United States." (defun calc-trail-here () (interactive) - (if (eq major-mode 'calc-trail-mode) + (if (derived-mode-p 'calc-trail-mode) (progn (beginning-of-line) (if (bobp) diff --git a/lisp/cedet/ChangeLog b/lisp/cedet/ChangeLog index 50467fa6e37..ed3301510f0 100644 --- a/lisp/cedet/ChangeLog +++ b/lisp/cedet/ChangeLog @@ -1,9 +1,55 @@ +2013-09-20 Glenn Morris <rgm@gnu.org> + + * semantic.el (semantic-new-buffer-fcn-was-run, semantic-active-p): + Move from here... + * semantic/fw.el: ...to here. + +2013-09-18 Glenn Morris <rgm@gnu.org> + + * semantic/find.el (semantic-brute-find-first-tag-by-name): + Replace obsolete function assoc-ignore-case with assoc-string. + + * semantic/complete.el (tooltip-mode, tooltip-frame-parameters) + (tooltip-show): Declare. + +2013-09-17 Stefan Monnier <monnier@iro.umontreal.ca> + + * semantic/symref/list.el (semantic-symref-results-mode): + Use define-derived-mode. + (semantic-symref-produce-list-on-results): Set up the results here + instead of in semantic-symref-results-mode. Move after + semantic-symref-current-results's defvar now that it refers to that var. + (semantic-symref-auto-expand-results) + (semantic-symref-results-summary-function) + (semantic-symref-results-mode-hook): Remove redundant :group arg. + (semantic-symref, semantic-symref-symbol, semantic-symref-regexp): + Initialize directly in the let. + +2013-09-13 Glenn Morris <rgm@gnu.org> + + * semantic/ia.el (semantic-ia-complete-symbol-menu): + Comment it out, since it cannot work. (Bug#14522) + +2013-09-12 Glenn Morris <rgm@gnu.org> + + * semantic/find.el (semantic-find-first-tag-by-name): + Replace obsolete function assoc-ignore-case with assoc-string. + +2013-09-11 Stefan Monnier <monnier@iro.umontreal.ca> + + * semantic/grammar.el (semantic-grammar-mode): Use define-derived-mode. + (semantic-grammar-mode-syntax-table): Rename from + semantic-grammar-syntax-table. + (semantic-grammar-mode-map): Rename from semantic-grammar-map. + * data-debug.el (data-debug-mode-map): Rename from data-debug-map. + (data-debug-mode): Use define-derived-mode. + 2013-09-05 Glenn Morris <rgm@gnu.org> * semantic/fw.el (semantic-make-local-hook): Simplify by dropping Emacs <= 20. -2013-07-29 David Engster <deng@randomsample.de> +2013-07-29 David Engster <deng@randomsample.de> * lisp/cedet/cedet.el (cedet-packages): Remove speedbar since its development does no longer happens in CEDET upstream but in Emacs @@ -15,18 +61,18 @@ * semantic/decorate/mode.el (semantic-decoration-on-includes-p-default) - (semantic-decoration-on-includes-highlight-default): Declare for + (semantic-decoration-on-includes-highlight-default): Declare for byte compiler. * semantic/wisent/python.el (semantic/format): New require. -2013-07-27 Eric Ludlam <zappo@gnu.org> +2013-07-27 Eric Ludlam <zappo@gnu.org> - * lisp/cedet/semantic/edit.el (semantic-edits-splice-remove): Wrap - debug message removing middle tag in semantic-edits-verbose-flag + * lisp/cedet/semantic/edit.el (semantic-edits-splice-remove): + Wrap debug message removing middle tag in semantic-edits-verbose-flag check. -2013-07-27 David Engster <deng@randomsample.de> +2013-07-27 David Engster <deng@randomsample.de> * semantic/bovine/el.el (semantic/db-el): New require. @@ -69,8 +115,8 @@ `semantic/decorate/include' anymore. (semantic-toggle-decoration-style): Error if an unknown decoration style is toggled. - (define-semantic-decoration-style): Add new :load option. When - :load is specified, add autoload tokens for the definition + (define-semantic-decoration-style): Add new :load option. + When :load is specified, add autoload tokens for the definition functions so that code is loaded when the mode is used. (semantic-decoration-on-includes): New autoload definition for highlighting includes. @@ -94,8 +140,8 @@ * semantic/ctxt.el (semantic-ctxt-end-of-symbol): New. (semantic-ctxt-current-symbol-default): New. - * semantic/bovine/el.el (semantic-default-elisp-setup): Add - autoload cookie. Explain existence. + * semantic/bovine/el.el (semantic-default-elisp-setup): + Add autoload cookie. Explain existence. (footer): Add local variable for loaddefs. * semantic/db.el (semanticdb-file-table-object): Add new filter, @@ -120,7 +166,7 @@ * ede/cpp-root.el (ede-preprocessor-map): Protect against init problems. - * ede/proj.el (ede-proj-target): Added a new "custom" option for + * ede/proj.el (ede-proj-target): Add a new "custom" option for custom symbols representing a compiler or linker instead of restricting things to only the predefined compilers and linkers. @@ -198,15 +244,15 @@ 2013-04-27 David Engster <deng@randomsample.de> * semantic/complete.el - (semantic-collector-calculate-completions-raw): If - `completionslist' is not set, refresh the cache if necessary and + (semantic-collector-calculate-completions-raw): + If `completionslist' is not set, refresh the cache if necessary and use it for completions. This fixes the `semantic-collector-buffer-deep' collector (bug#14265). 2013-03-26 Leo Liu <sdl.web@gmail.com> - * semantic/senator.el (senator-copy-tag-to-register): Move - register handling logic from register.el. (Bug#14052) + * semantic/senator.el (senator-copy-tag-to-register): + Move register handling logic from register.el. (Bug#14052) 2013-03-21 Eric Ludlam <zappo@gnu.org> @@ -223,17 +269,17 @@ * semantic/find.el (semantic-filter-tags-by-class): New function. - * semantic/tag-ls.el (semantic-tag-similar-p-default): Add - short-circuit in case tag1 and 2 are identical. + * semantic/tag-ls.el (semantic-tag-similar-p-default): + Add short-circuit in case tag1 and 2 are identical. * semantic/analyze/fcn.el - (semantic-analyze-dereference-metatype-stack): Use - `semantic-tag-similar-p' instead of 'eq' when comparing two tags + (semantic-analyze-dereference-metatype-stack): + Use `semantic-tag-similar-p' instead of 'eq' when comparing two tags during metatype evaluation in case they are the same, but not the same node. (Tweaked patch from Tomasz Gajewski) (Tiny change) - * semantic/db-find.el (semanticdb-partial-synchronize): Fix - require to semantic/db-typecache to be correct. + * semantic/db-find.el (semanticdb-partial-synchronize): + Fix require to semantic/db-typecache to be correct. (semanticdb-find-tags-external-children-of-type): Make this a brutish search by default. @@ -243,19 +289,19 @@ input tag as the place to start searching for externally defined methods. - * semantic/db-file.el (semanticdb-default-save-directory): Doc - fix: Add ref to default value. + * semantic/db-file.el (semanticdb-default-save-directory): + Doc fix: Add ref to default value. - * semantic/complete.el (semantic-complete-post-command-hook): When - detecting if cursor is outside completion area, do so if cursor + * semantic/complete.el (semantic-complete-post-command-hook): + When detecting if cursor is outside completion area, do so if cursor moves before start of overlay, or the original starting location of the overlay (i.e., if user deletes past beginning of the overlay region). (semantic-complete-inline-tag-engine): Initialize original start of `semantic-complete-inline-overlay'. - * semantic/bovine/c.el (semantic-c-describe-environment): Update - some section titles. Test semanticdb table before printing it. + * semantic/bovine/c.el (semantic-c-describe-environment): + Update some section titles. Test semanticdb table before printing it. (semantic-c-reset-preprocessor-symbol-map): Update `semantic-lex-spp-macro-symbol-obarray' outside the loop over all the files contributing to its value. @@ -271,8 +317,8 @@ * srecode/cpp.el (srecode-semantic-handle-:c): Replace all characters in FILENAME_SYMBOL that aren't valid CPP symbol chars. - * srecode/map.el (srecode-map-validate-file-for-mode): Force - semantic to load if it is not active in the template being added + * srecode/map.el (srecode-map-validate-file-for-mode): + Force semantic to load if it is not active in the template being added to the map. * srecode/srt.el: Add local variables for setting the autoload @@ -287,7 +333,7 @@ has both a version variable and a Version: comment, always use `call-next-method'. - * ede/cpp-root.el (ede-set-project-variables): Deleted. + * ede/cpp-root.el (ede-set-project-variables): Delete. `ede-preprocessor-map' does the job this function was attempting to do with :spp-table. (ede-preprocessor-map): Update file tests to provide better @@ -302,8 +348,8 @@ 2013-03-21 David Engster <deng@randomsample.de> * semantic/bovine/c.el (semantic-get-local-variables): Also add a - new variable 'this' if we are in an inline member function. For - detecting this, we check overlays at point if there is a class + new variable 'this' if we are in an inline member function. + For detecting this, we check overlays at point if there is a class spanning the current function. Also, the variable 'this' has to be a pointer. @@ -350,14 +396,14 @@ 2013-03-21 Tomasz Gajewski <tomga@wp.pl> (tiny change) - * ede/cpp-root.el (ede-project-autoload, initialize-instance): Fix - EDE file symbol to match rename. Fix ede-cpp-root symbol to + * ede/cpp-root.el (ede-project-autoload, initialize-instance): + Fix EDE file symbol to match rename. Fix ede-cpp-root symbol to include -project in name. 2013-03-21 Alex Ott <alexott@gmail.com> - * cedet-files.el (cedet-files-list-recursively): New. Recursively - find files whose names are matching to given regex. + * cedet-files.el (cedet-files-list-recursively): New. + Recursively find files whose names are matching to given regex. * ede.el (ede-current-project): Rewrite to avoid imperative style. @@ -943,7 +989,7 @@ (semantic-gcc-setup): If the first attempt at calling cpp fails, try straight GCC. -2012-10-01 Jan Moringen <jan.moringen@uni-bielefeld.de> +2012-10-01 Jan Moringen <jan.moringen@uni-bielefeld.de> * semantic/idle.el (semantic-idle-breadcrumbs--display-in-header-line): diff --git a/lisp/cedet/data-debug.el b/lisp/cedet/data-debug.el index c468ec1046a..4658c604211 100644 --- a/lisp/cedet/data-debug.el +++ b/lisp/cedet/data-debug.el @@ -869,7 +869,8 @@ If PARENT is non-nil, it is somehow related as a parent to thing." table) "Syntax table used in data-debug macro buffers.") -(defvar data-debug-map +(define-obsolete-variable-alias 'data-debug-map 'data-debug-mode-map "24.1") +(defvar data-debug-mode-map (let ((km (make-sparse-keymap))) (suppress-keymap km) (define-key km [mouse-2] 'data-debug-expand-or-contract-mouse) @@ -887,22 +888,15 @@ If PARENT is non-nil, it is somehow related as a parent to thing." :group 'data-debug :type 'hook) -(defun data-debug-mode () +(define-derived-mode data-debug-mode fundamental-mode "DATA-DEBUG" "Major-mode for the Analyzer debugger. -\\{data-debug-map}" - (interactive) - (kill-all-local-variables) - (setq major-mode 'data-debug-mode - mode-name "DATA-DEBUG" - comment-start ";;" +\\{data-debug-mode-map}" + (setq comment-start ";;" comment-end "" buffer-read-only t) - (set (make-local-variable 'comment-start-skip) + (setq-local comment-start-skip "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\);+ *") - (set-syntax-table data-debug-mode-syntax-table) - (use-local-map data-debug-map) - (run-hooks 'data-debug-hook) (buffer-disable-undo) (set (make-local-variable 'font-lock-global-modes) nil) (font-lock-mode -1) diff --git a/lisp/cedet/semantic.el b/lisp/cedet/semantic.el index 909902a71fe..2d62d848625 100644 --- a/lisp/cedet/semantic.el +++ b/lisp/cedet/semantic.el @@ -311,14 +311,6 @@ a parse of the buffer.") (semantic-varalias-obsolete 'semantic-init-db-hooks 'semantic-init-db-hook "23.2") -(defvar semantic-new-buffer-fcn-was-run nil - "Non-nil after `semantic-new-buffer-fcn' has been executed.") -(make-variable-buffer-local 'semantic-new-buffer-fcn-was-run) - -(defsubst semantic-active-p () - "Return non-nil if the current buffer was set up for parsing." - semantic-new-buffer-fcn-was-run) - (defsubst semantic-error-if-unparsed () "Raise an error if current buffer was not parsed by Semantic." (unless semantic-new-buffer-fcn-was-run diff --git a/lisp/cedet/semantic/complete.el b/lisp/cedet/semantic/complete.el index b42e24fb9c0..9af890fb6eb 100644 --- a/lisp/cedet/semantic/complete.el +++ b/lisp/cedet/semantic/complete.el @@ -1634,6 +1634,8 @@ Display mechanism using tooltip for a list of possible completions.") (error nil)) ) +(defvar tooltip-mode) + (defmethod semantic-displayor-show-request ((obj semantic-displayor-tooltip)) "A request to show the current tags table." (if (or (not (featurep 'tooltip)) (not tooltip-mode)) @@ -1726,6 +1728,9 @@ Return a cons cell (X . Y)" (+ (cdr point-pix-pos) (cadr edges) top)))) +(defvar tooltip-frame-parameters) +(declare-function tooltip-show "tooltip" (text &optional use-echo-area)) + (defun semantic-displayor-tooltip-show (text) "Display a tooltip with TEXT near cursor." (let ((point-pix-pos (semantic-displayor-point-position)) diff --git a/lisp/cedet/semantic/find.el b/lisp/cedet/semantic/find.el index f660c69ec3d..351c6163e2b 100644 --- a/lisp/cedet/semantic/find.el +++ b/lisp/cedet/semantic/find.el @@ -265,9 +265,9 @@ TABLE is a semantic tags table. See `semantic-something-to-tag-table'." "Find the first tag with NAME in TABLE. NAME is a string. TABLE is a semantic tags table. See `semantic-something-to-tag-table'. -This routine uses `assoc' to quickly find the first matching entry." - (funcall (if semantic-case-fold 'assoc-ignore-case 'assoc) - name (semantic-something-to-tag-table table))) +Respects `semantic-case-fold'." + (assoc-string name (semantic-something-to-tag-table table) + semantic-case-fold)) (defmacro semantic-find-tags-by-name (name &optional table) "Find all tags with NAME in TABLE. @@ -457,13 +457,11 @@ TABLE is a tag table. See `semantic-something-to-tag-table'." "Find a tag NAME within STREAMORBUFFER. NAME is a string. If SEARCH-PARTS is non-nil, search children of tags. If SEARCH-INCLUDE was never implemented. +Respects `semantic-case-fold'. Use `semantic-find-first-tag-by-name' instead." (let* ((stream (semantic-something-to-tag-table streamorbuffer)) - (assoc-fun (if semantic-case-fold - #'assoc-ignore-case - #'assoc)) - (m (funcall assoc-fun name stream))) + (m (assoc-string name stream semantic-case-fold))) (if m m (let ((toklst stream) diff --git a/lisp/cedet/semantic/fw.el b/lisp/cedet/semantic/fw.el index 7850e0462b2..825cdc9f0a4 100644 --- a/lisp/cedet/semantic/fw.el +++ b/lisp/cedet/semantic/fw.el @@ -321,6 +321,15 @@ Avoid using a large BODY since it is duplicated." ;;; Misc utilities ;; + +(defvar semantic-new-buffer-fcn-was-run nil + "Non-nil after `semantic-new-buffer-fcn' has been executed.") +(make-variable-buffer-local 'semantic-new-buffer-fcn-was-run) + +(defsubst semantic-active-p () + "Return non-nil if the current buffer was set up for parsing." + semantic-new-buffer-fcn-was-run) + (defsubst semantic-map-buffers (function) "Run FUNCTION for each Semantic enabled buffer found. FUNCTION does not have arguments. When FUNCTION is entered diff --git a/lisp/cedet/semantic/grammar.el b/lisp/cedet/semantic/grammar.el index ce658cd5d54..60c4ccadf65 100644 --- a/lisp/cedet/semantic/grammar.el +++ b/lisp/cedet/semantic/grammar.el @@ -860,7 +860,7 @@ Lisp code." ;; Use Unix EOLs, so that the file is portable to all platforms. (setq buffer-file-coding-system 'raw-text-unix) (erase-buffer) - (unless (eq major-mode 'emacs-lisp-mode) + (unless (derived-mode-p 'emacs-lisp-mode) (emacs-lisp-mode)) ;;;; Header + Prologue @@ -1102,7 +1102,9 @@ END is the limit of the search." ;;;; Define major mode ;;;; -(defvar semantic-grammar-syntax-table +(define-obsolete-variable-alias 'semantic-grammar-syntax-table + 'semantic-grammar-mode-syntax-table "24.1") +(defvar semantic-grammar-mode-syntax-table (let ((table (make-syntax-table (standard-syntax-table)))) (modify-syntax-entry ?\: "." table) ;; COLON (modify-syntax-entry ?\> "." table) ;; GT @@ -1170,7 +1172,9 @@ END is the limit of the search." semantic-grammar-mode-keywords-1 "Font Lock keywords used to highlight Semantic grammar buffers.") -(defvar semantic-grammar-map +(define-obsolete-variable-alias 'semantic-grammar-map + 'semantic-grammar-mode-map "24.1") +(defvar semantic-grammar-mode-map (let ((km (make-sparse-keymap))) (define-key km "|" 'semantic-grammar-electric-punctuation) @@ -1271,22 +1275,17 @@ the change bounds to encompass the whole nonterminal tag." (semantic-tag-start outer) (semantic-tag-end outer))))) -(defun semantic-grammar-mode () +(define-derived-mode semantic-grammar-mode + fundamental-mode "Semantic Grammar Framework" "Initialize a buffer for editing Semantic grammars. -\\{semantic-grammar-map}" - (interactive) - (kill-all-local-variables) - (setq major-mode 'semantic-grammar-mode - mode-name "Semantic Grammar Framework") +\\{semantic-grammar-mode-map}" (set (make-local-variable 'parse-sexp-ignore-comments) t) (set (make-local-variable 'comment-start) ";;") ;; Look within the line for a ; following an even number of backslashes ;; after either a non-backslash or the line beginning. (set (make-local-variable 'comment-start-skip) "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\);+ *") - (set-syntax-table semantic-grammar-syntax-table) - (use-local-map semantic-grammar-map) (set (make-local-variable 'indent-line-function) 'semantic-grammar-indent) (set (make-local-variable 'fill-paragraph-function) @@ -1335,15 +1334,14 @@ the change bounds to encompass the whole nonterminal tag." (semantic-make-local-hook 'semantic-edits-new-change-functions) (add-hook 'semantic-edits-new-change-functions 'semantic-grammar-edits-new-change-hook-fcn - nil t) - (semantic-run-mode-hooks 'semantic-grammar-mode-hook)) + nil t)) ;;;; ;;;; Useful commands ;;;; (defvar semantic-grammar-skip-quoted-syntax-table - (let ((st (copy-syntax-table semantic-grammar-syntax-table))) + (let ((st (copy-syntax-table semantic-grammar-mode-syntax-table))) (modify-syntax-entry ?\' "$" st) st) "Syntax table to skip a whole quoted expression in grammar code. diff --git a/lisp/cedet/semantic/ia.el b/lisp/cedet/semantic/ia.el index d087ac6fcde..d1ff7f1d9aa 100644 --- a/lisp/cedet/semantic/ia.el +++ b/lisp/cedet/semantic/ia.el @@ -149,44 +149,45 @@ Completion options are calculated with `semantic-analyze-possible-completions'." :group 'semantic :type semantic-format-tag-custom-list) -;;;###autoload -(defun semantic-ia-complete-symbol-menu (point) - "Complete the current symbol via a menu based at POINT. -Completion options are calculated with `semantic-analyze-possible-completions'." - (interactive "d") - (require 'imenu) - (let* ((a (semantic-analyze-current-context point)) - (syms (semantic-analyze-possible-completions a)) - ) - ;; Complete this symbol. - (if (not syms) - (progn - (message "No smart completions found. Trying Senator.") - (when (semantic-analyze-context-p a) - ;; This is a quick way of getting a nice completion list - ;; in the menu if the regular context mechanism fails. - (senator-completion-menu-popup))) - - (let* ((menu - (mapcar - (lambda (tag) - (cons - (funcall semantic-ia-completion-menu-format-tag-function tag) - (vector tag))) - syms)) - (ans - (imenu--mouse-menu - ;; XEmacs needs that the menu has at least 2 items. So, - ;; include a nil item that will be ignored by imenu. - (cons nil menu) - (senator-completion-menu-point-as-event) - "Completions"))) - (when ans - (if (not (semantic-tag-p ans)) - (setq ans (aref (cdr ans) 0))) - (delete-region (car (oref a bounds)) (cdr (oref a bounds))) - (semantic-ia-insert-tag ans)) - )))) +;; Disabled - see http://debbugs.gnu.org/14522 +;; ;;;###autoload +;; (defun semantic-ia-complete-symbol-menu (point) +;; "Complete the current symbol via a menu based at POINT. +;; Completion options are calculated with `semantic-analyze-possible-completions'." +;; (interactive "d") +;; (require 'imenu) +;; (let* ((a (semantic-analyze-current-context point)) +;; (syms (semantic-analyze-possible-completions a)) +;; ) +;; ;; Complete this symbol. +;; (if (not syms) +;; (progn +;; (message "No smart completions found. Trying Senator.") +;; (when (semantic-analyze-context-p a) +;; ;; This is a quick way of getting a nice completion list +;; ;; in the menu if the regular context mechanism fails. +;; (senator-completion-menu-popup))) +;; +;; (let* ((menu +;; (mapcar +;; (lambda (tag) +;; (cons +;; (funcall semantic-ia-completion-menu-format-tag-function tag) +;; (vector tag))) +;; syms)) +;; (ans +;; (imenu--mouse-menu +;; ;; XEmacs needs that the menu has at least 2 items. So, +;; ;; include a nil item that will be ignored by imenu. +;; (cons nil menu) +;; (senator-completion-menu-point-as-event) +;; "Completions"))) +;; (when ans +;; (if (not (semantic-tag-p ans)) +;; (setq ans (aref (cdr ans) 0))) +;; (delete-region (car (oref a bounds)) (cdr (oref a bounds))) +;; (semantic-ia-insert-tag ans)) +;; )))) ;;; Completions Tip ;; diff --git a/lisp/cedet/semantic/symref/list.el b/lisp/cedet/semantic/symref/list.el index c1f0a092afc..af8e18f8c55 100644 --- a/lisp/cedet/semantic/symref/list.el +++ b/lisp/cedet/semantic/symref/list.el @@ -48,18 +48,18 @@ they are used in. Display the references in `semantic-symref-results-mode'." (interactive) (semantic-fetch-tags) - (let ((ct (semantic-current-tag)) - (res nil) - ) + (let ((ct (semantic-current-tag))) ;; Must have a tag... (when (not ct) (error "Place cursor inside tag to be searched for")) ;; Check w/ user. - (when (not (y-or-n-p (format "Find references for %s? " (semantic-tag-name ct)))) + (when (not (y-or-n-p (format "Find references for %s? " + (semantic-tag-name ct)))) (error "Quit")) ;; Gather results and tags (message "Gathering References...") - (setq res (semantic-symref-find-references-by-name (semantic-tag-name ct))) - (semantic-symref-produce-list-on-results res (semantic-tag-name ct)))) + (let* ((name (semantic-tag-name ct)) + (res (semantic-symref-find-references-by-name name))) + (semantic-symref-produce-list-on-results res name)))) ;;;###autoload (defun semantic-symref-symbol (sym) @@ -72,11 +72,9 @@ Display the references in `semantic-symref-results-mode'." (interactive (list (semantic-tag-name (semantic-complete-read-tag-project "Symrefs for: ")))) (semantic-fetch-tags) - (let ((res nil) - ) - ;; Gather results and tags - (message "Gathering References...") - (setq res (semantic-symref-find-references-by-name sym)) + ;; Gather results and tags + (message "Gathering References...") + (let ((res (semantic-symref-find-references-by-name sym))) (semantic-symref-produce-list-on-results res sym))) ;;;###autoload @@ -90,28 +88,11 @@ Display the references in`semantic-symref-results-mode'." (interactive (list (semantic-tag-name (semantic-complete-read-tag-buffer-deep "Symrefs for: ")))) (semantic-fetch-tags) - (let ((res nil) - ) - ;; Gather results and tags - (message "Gathering References...") - (setq res (semantic-symref-find-text sym)) + (message "Gathering References...") + ;; Gather results and tags + (let ((res (semantic-symref-find-text sym))) (semantic-symref-produce-list-on-results res sym))) - -(defun semantic-symref-produce-list-on-results (res str) - "Produce a symref list mode buffer on the results RES." - (when (not res) (error "No references found")) - (semantic-symref-result-get-tags res t) - (message "Gathering References...done") - ;; Build a references buffer. - (let ((buff (get-buffer-create - (format "*Symref %s" str))) - ) - (switch-to-buffer-other-window buff) - (set-buffer buff) - (semantic-symref-results-mode res)) - ) - ;;; RESULTS MODE ;; (defgroup semantic-symref-results-mode nil @@ -178,36 +159,35 @@ Display the references in`semantic-symref-results-mode'." (defcustom semantic-symref-auto-expand-results nil "Non-nil to expand symref results on buffer creation." - :group 'semantic-symref-results-mode :type 'boolean) (defcustom semantic-symref-results-mode-hook nil "Hook run when `semantic-symref-results-mode' starts." - :group 'semantic-symref-results-mode :type 'hook) (defvar semantic-symref-current-results nil "The current results in a results mode buffer.") -(defun semantic-symref-results-mode (results) - ;; FIXME: Use define-derived-mode. - "Major-mode for displaying Semantic Symbol Reference RESULTS. -RESULTS is an object of class `semantic-symref-results'." - (interactive) - (kill-all-local-variables) - (setq major-mode 'semantic-symref-results-mode - mode-name "Symref" - ) - (use-local-map semantic-symref-results-mode-map) - (set (make-local-variable 'semantic-symref-current-results) - results) - (semantic-symref-results-dump results) - (goto-char (point-min)) +(defun semantic-symref-produce-list-on-results (res str) + "Produce a symref list mode buffer on the results RES." + (when (not res) (error "No references found")) + (semantic-symref-result-get-tags res t) + (message "Gathering References...done") + ;; Build a references buffer. + (let ((buff (get-buffer-create (format "*Symref %s" str)))) + (switch-to-buffer-other-window buff) + (set-buffer buff) + (semantic-symref-results-mode) + (set (make-local-variable 'semantic-symref-current-results) res) + (semantic-symref-results-dump res) + (goto-char (point-min)))) + +(define-derived-mode semantic-symref-results-mode nil "Symref" + "Major-mode for displaying Semantic Symbol Reference results." (buffer-disable-undo) + ;; FIXME: Why bother turning off font-lock? (set (make-local-variable 'font-lock-global-modes) nil) - (font-lock-mode -1) - (run-mode-hooks 'semantic-symref-results-mode-hook) - ) + (font-lock-mode -1)) (defun semantic-symref-hide-buffer () "Hide buffer with semantic-symref results." @@ -215,9 +195,8 @@ RESULTS is an object of class `semantic-symref-results'." (bury-buffer)) (defcustom semantic-symref-results-summary-function 'semantic-format-tag-prototype - "*Function to use when creating items in Imenu. + "Function to use when creating items in Imenu. Some useful functions are found in `semantic-format-tag-functions'." - :group 'semantic-symref-results-mode :type semantic-format-tag-custom-list) (defun semantic-symref-results-dump (results) diff --git a/lisp/cedet/srecode/srt-mode.el b/lisp/cedet/srecode/srt-mode.el index 2f43dc3872b..f6730fbd65f 100644 --- a/lisp/cedet/srecode/srt-mode.el +++ b/lisp/cedet/srecode/srt-mode.el @@ -188,6 +188,7 @@ we can tell font lock about them.") ;;;###autoload (define-derived-mode srecode-template-mode fundamental-mode "SRecode" + ;; FIXME: Shouldn't it derive from prog-mode? "Major-mode for writing SRecode macros." (set (make-local-variable 'comment-start) ";;") (set (make-local-variable 'comment-end) "") diff --git a/lisp/chistory.el b/lisp/chistory.el index 509324ade88..9a77793b1e1 100644 --- a/lisp/chistory.el +++ b/lisp/chistory.el @@ -121,7 +121,9 @@ The buffer is left in Command History mode." (error "No command history") (command-history-mode))))) -(defvar command-history-map +(define-obsolete-variable-alias 'command-history-map + 'command-history-mode-map "24.1") +(defvar command-history-mode-map (let ((map (make-sparse-keymap))) (set-keymap-parent map lisp-mode-shared-map) (suppress-keymap map) @@ -132,21 +134,11 @@ The buffer is left in Command History mode." map) "Keymap for `command-history-mode'.") -(defun command-history-mode () +(define-derived-mode command-history-mode fundamental-mode "Command History" "Major mode for listing and repeating recent commands. Keybindings: -\\{command-history-map}" - (interactive) - (Command-history-setup) - (setq major-mode 'command-history-mode) - (setq mode-name "Command History") - (use-local-map command-history-map) - (run-mode-hooks 'command-history-mode-hook)) - -(defun Command-history-setup () - (kill-all-local-variables) - (use-local-map command-history-map) +\\{command-history-mode-map}" (lisp-mode-variables nil) (set-syntax-table emacs-lisp-mode-syntax-table) (setq buffer-read-only t)) diff --git a/lisp/comint.el b/lisp/comint.el index 0ce7053c031..7572e8baabc 100644 --- a/lisp/comint.el +++ b/lisp/comint.el @@ -3793,25 +3793,21 @@ REGEXP-GROUP is the regular expression group in REGEXP to use." ;; comint-mode will take care of it. The following example, from shell.el, ;; is typical: ;; -;; (defvar shell-mode-map '()) -;; (cond ((not shell-mode-map) -;; (setq shell-mode-map (copy-keymap comint-mode-map)) -;; (define-key shell-mode-map "\C-c\C-f" 'shell-forward-command) -;; (define-key shell-mode-map "\C-c\C-b" 'shell-backward-command) -;; (define-key shell-mode-map "\t" 'completion-at-point) -;; (define-key shell-mode-map "\M-?" -;; 'comint-dynamic-list-filename-completions))) +;; (defvar shell-mode-map +;; (let ((map (make-sparse-keymap))) +;; (set-keymap-parent map comint-mode-map) +;; (define-key map "\C-c\C-f" 'shell-forward-command) +;; (define-key map "\C-c\C-b" 'shell-backward-command) +;; (define-key map "\t" 'completion-at-point) +;; (define-key map "\M-?" +;; 'comint-dynamic-list-filename-completions) +;; map)) ;; -;; (defun shell-mode () -;; (interactive) -;; (comint-mode) +;; (define-derived-mode shell-mode comint-mode "Shell" +;; "Doc." ;; (setq comint-prompt-regexp shell-prompt-pattern) -;; (setq major-mode 'shell-mode) -;; (setq mode-name "Shell") -;; (use-local-map shell-mode-map) ;; (setq-local shell-directory-stack nil) -;; (add-hook 'comint-input-filter-functions 'shell-directory-tracker) -;; (run-mode-hooks 'shell-mode-hook)) +;; (add-hook 'comint-input-filter-functions 'shell-directory-tracker)) ;; ;; ;; Completion for comint-mode users diff --git a/lisp/composite.el b/lisp/composite.el index 3c25b8b60af..e0585f80880 100644 --- a/lisp/composite.el +++ b/lisp/composite.el @@ -555,7 +555,11 @@ All non-spacing characters have this function in (rbearing (lglyph-rbearing glyph)) (lbearing (lglyph-lbearing glyph)) (center (/ (+ lbearing rbearing) 2)) + ;; Artificial vertical gap between the glyphs. (gap (round (* (font-get (lgstring-font gstring) :size) 0.1)))) + (if (= gap 0) + ;; Assure at least 1 pixel vertical gap. + (setq gap 1)) (dotimes (i nchars) (setq glyph (lgstring-glyph gstring i)) (when (> i 0) @@ -566,8 +570,10 @@ All non-spacing characters have this function in (as (lglyph-ascent glyph)) (de (lglyph-descent glyph)) (ce (/ (+ lb rb) 2)) + (w (lglyph-width glyph)) xoff yoff) - (when (and class (>= class 200) (<= class 240)) + (cond + ((and class (>= class 200) (<= class 240)) (setq xoff 0 yoff 0) (cond ((= class 200) @@ -621,6 +627,38 @@ All non-spacing characters have this function in rb (+ lb xoff) as (- as yoff) de (+ de yoff))) + ((and (= class 0) + (eq (get-char-code-property (lglyph-char glyph) + 'general-category) 'Me)) + ;; Artificially layouting glyphs in an enclosing + ;; mark is difficult. All we can do is to adjust + ;; the x-offset and width of the base glyph to + ;; align it at the center of the glyph of the + ;; enclosing mark hoping that the enclosing mark + ;; is big enough. We also have to adjust the + ;; x-offset and width of the mark ifself properly + ;; depending on how the glyph is designed + + ;; (non-spacing or not). For instance, when we + ;; have these glyphs: + ;; X position | + ;; base: <-*-> lbearing=0 rbearing=5 width=5 + ;; mark: <----------.> lb=-11 rb=2 w=0 + ;; we get a correct layout by moving them as this: + ;; base: <-*-> XOFF=4 WAD=9 + ;; mark: <----------.> xoff=2 wad=4 + ;; we have moved the base to the left by 4-pixel + ;; and make its width 9-pixel, then move the mark + ;; to the left 2-pixel and make its width 4-pixel. + (let* (;; Adjustment for the base glyph + (XOFF (/ (- rb lb width) 2)) + (WAD (+ width XOFF)) + ;; Adjustment for the enclosing mark glyph + (xoff (- (+ lb WAD))) + (wad (- rb lb WAD))) + (lglyph-set-adjustment glyph xoff 0 wad) + (setq glyph (lgstring-glyph gstring 0)) + (lglyph-set-adjustment glyph XOFF 0 WAD)))) (if (< ascent as) (setq ascent as)) (if (< descent de) diff --git a/lisp/custom.el b/lisp/custom.el index 3db34e4d1fb..d721198da0b 100644 --- a/lisp/custom.el +++ b/lisp/custom.el @@ -1,7 +1,6 @@ ;;; custom.el --- tools for declaring and initializing options ;; -;; Copyright (C) 1996-1997, 1999, 2001-2013 Free Software Foundation, -;; Inc. +;; Copyright (C) 1996-1997, 1999, 2001-2013 Free Software Foundation, Inc. ;; ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> ;; Maintainer: FSF @@ -1416,6 +1415,10 @@ See `custom-enabled-themes' for a list of enabled themes." (setq custom-enabled-themes (delq theme custom-enabled-themes))))) +;; Only used if window-system not null. +(declare-function x-get-resource "frame.c" + (attribute class &optional component subclass)) + (defun custom--frame-color-default (frame attribute resource-attr resource-class tty-default x-default) (let ((col (face-attribute 'default attribute t))) diff --git a/lisp/dframe.el b/lisp/dframe.el index 66967075e34..c75287bbc32 100644 --- a/lisp/dframe.el +++ b/lisp/dframe.el @@ -243,6 +243,9 @@ Local to those buffers, as a function called that created it.") "Return non-nil if FRAME is currently available." (and frame (frame-live-p frame) (frame-visible-p frame))) +(defvar x-sensitive-text-pointer-shape) +(defvar x-pointer-shape) + (defun dframe-frame-mode (arg frame-var cache-var buffer-var frame-name local-mode-fn &optional @@ -758,9 +761,8 @@ who requested the timer. NULL-ON-ERROR is ignored." Evaluates all cached timer functions in sequence." (let ((l dframe-client-functions)) (while (and l (sit-for 0)) - (condition-case er - (funcall (car l)) - (error (message "DFRAME TIMER ERROR: %S" er))) + (with-demoted-errors "DFRAME TIMER ERROR: %S" + (funcall (car l))) (setq l (cdr l))))) ;;; Menu hacking for mouse-3 diff --git a/lisp/dired-x.el b/lisp/dired-x.el index 3527a3fc756..287934f7adc 100644 --- a/lisp/dired-x.el +++ b/lisp/dired-x.el @@ -1,4 +1,4 @@ -;;; dired-x.el --- extra Dired functionality +;;; dired-x.el --- extra Dired functionality -*- lexical-binding:t -*- ;; Copyright (C) 1993-1994, 1997, 2001-2013 Free Software Foundation, ;; Inc. @@ -1047,7 +1047,8 @@ Each element of this list looks like (REGEXP COMMAND...) where each COMMAND can either be a string or a Lisp expression that evaluates -to a string. If several COMMANDs are given, the first one will be the default +to a string. This expression can access the file name as the variable `file'. +If several COMMANDs are given, the first one will be the default and the rest will be added temporarily to the history and can be retrieved with \\[previous-history-element] (M-p) . @@ -1105,8 +1106,8 @@ See `dired-guess-shell-alist-user'." ;; Return commands or nil if flist is still non-nil. ;; Evaluate the commands in order that any logical testing will be done. (if (cdr cmds) - (delete-dups (mapcar #'eval cmds)) - (eval (car cmds))))) ; single command + (delete-dups (mapcar (lambda (cmd) (eval cmd `((file . ,file)))) cmds)) + (eval (car cmds) `((file . ,file)))))) ; single command (defun dired-guess-shell-command (prompt files) "Ask user with PROMPT for a shell command, guessing a default from FILES." @@ -1185,7 +1186,7 @@ results in (setq count (1+ count) start (1+ start))) ;; ... and prepend a "../" for each slash found: - (dotimes (n count) + (dotimes (_ count) (setq name1 (concat "../" name1))))) (make-symbolic-link (directory-file-name name1) ; must not link to foo/ @@ -1397,22 +1398,6 @@ Considers buffers closer to the car of `buffer-list' to be more recent." ;; Does anyone use this? - lrd 6/29/93. ;; Apparently people do use it. - lrd 12/22/97. -(with-no-warnings - ;; Warnings are suppressed to avoid "global/dynamic var `X' lacks a prefix". - ;; This is unbearably ugly, but not more than having global variables - ;; named size, time, name or s, however practical it can be while writing - ;; `dired-mark-sexp' predicates. - (defvar inode) - (defvar s) - (defvar mode) - (defvar nlink) - (defvar uid) - (defvar gid) - (defvar size) - (defvar time) - (defvar name) - (defvar sym)) - (defun dired-mark-sexp (predicate &optional unflag-p) "Mark files for which PREDICATE returns non-nil. With a prefix arg, unmark or unflag those files instead. @@ -1475,6 +1460,9 @@ to mark all zero length files." s nil)) (setq mode (buffer-substring (point) (+ mode-len (point)))) (forward-char mode-len) + ;; Skip any extended attributes marker ("." or "+"). + (or (looking-at " ") + (forward-char 1)) (setq nlink (read (current-buffer))) ;; Karsten Wenger <kw@cis.uni-muenchen.de> fixed uid. (setq uid (buffer-substring (1+ (point)) @@ -1505,7 +1493,17 @@ to mark all zero length files." (line-end-position)) "")) t) - (eval predicate))) + (eval predicate + `((inode . ,inode) + (s . ,s) + (mode . ,mode) + (nlink . ,nlink) + (uid . ,uid) + (gid . ,gid) + (size . ,size) + (time . ,time) + (name . ,name) + (sym . ,sym))))) (format "'%s file" predicate)))) diff --git a/lisp/dired.el b/lisp/dired.el index b9f974234fb..27327352afb 100644 --- a/lisp/dired.el +++ b/lisp/dired.el @@ -4352,7 +4352,7 @@ instead. ;;;*** -;;;### (autoloads nil "dired-x" "dired-x.el" "130484d4c94bb9929c210774f9e475f5") +;;;### (autoloads nil "dired-x" "dired-x.el" "732d08c173295dd14a0736fa222f532a") ;;; Generated autoloads from dired-x.el (autoload 'dired-jump "dired-x" "\ diff --git a/lisp/doc-view.el b/lisp/doc-view.el index 589a57b64c2..cbf4d0bda31 100644 --- a/lisp/doc-view.el +++ b/lisp/doc-view.el @@ -1733,9 +1733,12 @@ toggle between displaying the document or editing it as text. "/" (:eval (number-to-string (doc-view-last-page-number))))) ;; Don't scroll unless the user specifically asked for it. (setq-local auto-hscroll-mode nil) - (setq-local mwheel-scroll-up-function #'doc-view-scroll-up-or-next-page) - (setq-local mwheel-scroll-down-function - #'doc-view-scroll-down-or-previous-page) + (if (boundp 'mwheel-scroll-up-function) ; not --without-x build + (setq-local mwheel-scroll-up-function + #'doc-view-scroll-up-or-next-page)) + (if (boundp 'mwheel-scroll-down-function) + (setq-local mwheel-scroll-down-function + #'doc-view-scroll-down-or-previous-page)) (setq-local cursor-type nil) (use-local-map doc-view-mode-map) (add-hook 'after-revert-hook 'doc-view-reconvert-doc nil t) diff --git a/lisp/echistory.el b/lisp/echistory.el index fc576aa6484..5989c9b8445 100644 --- a/lisp/echistory.el +++ b/lisp/echistory.el @@ -117,7 +117,6 @@ The Command History listing is recomputed each time this mode is invoked." (save-window-excursion (list-command-history) (set-buffer "*Command History*") - (Command-history-setup) (setq major-mode 'electric-command-history) (setq mode-name "Electric History") (use-local-map electric-history-map)) diff --git a/lisp/electric.el b/lisp/electric.el index 351468fd75d..36ec4a00b88 100644 --- a/lisp/electric.el +++ b/lisp/electric.el @@ -78,8 +78,6 @@ (setq last-command-event (aref cmd (1- (length cmd))) this-command (key-binding cmd t) cmd this-command) - ;; This makes universal-argument-other-key work. - (setq universal-argument-num-events 0) (if (or (prog1 quit-flag (setq quit-flag nil)) (eq last-input-event ?\C-g)) (progn (setq unread-command-events nil diff --git a/lisp/emacs-lisp/chart.el b/lisp/emacs-lisp/chart.el index 032eced7592..e05c28f23d5 100644 --- a/lisp/emacs-lisp/chart.el +++ b/lisp/emacs-lisp/chart.el @@ -1,7 +1,7 @@ ;;; chart.el --- Draw charts (bar charts, etc) -*- lexical-binding: t -*- -;; Copyright (C) 1996, 1998-1999, 2001, 2004-2005, 2007-2013 Free -;; Software Foundation, Inc. +;; Copyright (C) 1996, 1998-1999, 2001, 2004-2005, 2007-2013 +;; Free Software Foundation, Inc. ;; Author: Eric M. Ludlam <zappo@gnu.org> ;; Version: 0.2 @@ -86,10 +86,10 @@ Useful if new Emacs is used on B&W display.") :group 'eieio :type 'boolean) +(declare-function x-display-color-cells "xfns.c" (&optional terminal)) + (defvar chart-face-list - (if (if (fboundp 'display-color-p) - (display-color-p) - window-system) + (if (display-color-p) (let ((cl chart-face-color-list) (pl chart-face-pixmap-list) (faces ()) diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el index af7c41d5c4c..031bf5553d0 100644 --- a/lisp/emacs-lisp/cl-macs.el +++ b/lisp/emacs-lisp/cl-macs.el @@ -209,6 +209,8 @@ The name is made by appending a number to PREFIX, default \"G\"." (def-edebug-spec cl-&key-arg (&or ([&or (symbolp arg) arg] &optional def-form arg) arg)) +(def-edebug-spec cl-type-spec sexp) + (defconst cl--lambda-list-keywords '(&optional &rest &key &allow-other-keys &aux &whole &body &environment)) @@ -2701,8 +2703,10 @@ The function's arguments should be treated as immutable. \(fn NAME ARGLIST [DOCSTRING] BODY...)" (declare (debug cl-defun) (indent 2)) - (let* ((argns (cl--arglist-args args)) (p argns) - (pbody (cons 'progn body))) + (let* ((argns (cl--arglist-args args)) + (p argns) + ;; (pbody (cons 'progn body)) + ) (while (and p (eq (cl--expr-contains args (car p)) 1)) (pop p)) `(progn ,(if p nil ; give up if defaults refer to earlier args diff --git a/lisp/emacs-lisp/copyright.el b/lisp/emacs-lisp/copyright.el index b3fc6fb887a..2b2189e70e3 100644 --- a/lisp/emacs-lisp/copyright.el +++ b/lisp/emacs-lisp/copyright.el @@ -1,7 +1,6 @@ ;;; copyright.el --- update the copyright notice in current buffer -;; Copyright (C) 1991-1995, 1998, 2001-2013 Free Software Foundation, -;; Inc. +;; Copyright (C) 1991-1995, 1998, 2001-2013 Free Software Foundation, Inc. ;; Author: Daniel Pfeiffer <occitan@esperanto.org> ;; Keywords: maint, tools @@ -145,18 +144,17 @@ The header must match `copyright-regexp' and `copyright-names-regexp', if set. This function sets the match-data that `copyright-update-year' uses." (widen) (goto-char (copyright-start-point)) - (condition-case err - ;; (1) Need the extra \\( \\) around copyright-regexp because we - ;; goto (match-end 1) below. See note (2) below. - (copyright-re-search (concat "\\(" copyright-regexp - "\\)\\([ \t]*\n\\)?.*\\(?:" - copyright-names-regexp "\\)") - (copyright-limit) - t) - ;; In case the regexp is rejected. This is useful because - ;; copyright-update is typically called from before-save-hook where - ;; such an error is very inconvenient for the user. - (error (message "Can't update copyright: %s" err) nil))) + ;; In case the regexp is rejected. This is useful because + ;; copyright-update is typically called from before-save-hook where + ;; such an error is very inconvenient for the user. + (with-demoted-errors "Can't update copyright: %s" + ;; (1) Need the extra \\( \\) around copyright-regexp because we + ;; goto (match-end 1) below. See note (2) below. + (copyright-re-search (concat "\\(" copyright-regexp + "\\)\\([ \t]*\n\\)?.*\\(?:" + copyright-names-regexp "\\)") + (copyright-limit) + t))) (defun copyright-find-end () "Possibly adjust the search performed by `copyright-find-copyright'. diff --git a/lisp/emacs-lisp/crm.el b/lisp/emacs-lisp/crm.el index b8e327625e7..750e0709591 100644 --- a/lisp/emacs-lisp/crm.el +++ b/lisp/emacs-lisp/crm.el @@ -157,33 +157,32 @@ Functions'." predicate flag))) -(defun crm--select-current-element () +(defun crm--current-element () "Parse the minibuffer to find the current element. -Place an overlay on the element, with a `field' property, and return it." - (let* ((bob (minibuffer-prompt-end)) - (start (save-excursion +Return the element's boundaries as (START . END)." + (let ((bob (minibuffer-prompt-end))) + (cons (save-excursion (if (re-search-backward crm-separator bob t) (match-end 0) - bob))) - (end (save-excursion + bob)) + (save-excursion (if (re-search-forward crm-separator nil t) (match-beginning 0) - (point-max)))) - (ol (make-overlay start end nil nil t))) - (overlay-put ol 'field (make-symbol "crm")) - ol)) - -(defmacro crm--completion-command (command) - "Make COMMAND a completion command for `completing-read-multiple'." - `(let ((ol (crm--select-current-element))) - (unwind-protect - ,command - (delete-overlay ol)))) + (point-max)))))) + +(defmacro crm--completion-command (beg end &rest body) + "Run BODY with BEG and END bound to the current element's boundaries." + (declare (indent 2) (debug (sexp sexp &rest body))) + `(let* ((crm--boundaries (crm--current-element)) + (,beg (car crm--boundaries)) + (,end (cdr crm--boundaries))) + ,@body)) (defun crm-completion-help () "Display a list of possible completions of the current minibuffer element." (interactive) - (crm--completion-command (minibuffer-completion-help)) + (crm--completion-command beg end + (minibuffer-completion-help beg end)) nil) (defun crm-complete () @@ -192,13 +191,18 @@ If no characters can be completed, display a list of possible completions. Return t if the current element is now a valid match; otherwise return nil." (interactive) - (crm--completion-command (minibuffer-complete))) + (crm--completion-command beg end + (completion-in-region beg end + minibuffer-completion-table + minibuffer-completion-predicate))) (defun crm-complete-word () "Complete the current element at most a single word. Like `minibuffer-complete-word' but for `completing-read-multiple'." (interactive) - (crm--completion-command (minibuffer-complete-word))) + (crm--completion-command beg end + (completion-in-region--single-word + beg end minibuffer-completion-table minibuffer-completion-predicate))) (defun crm-complete-and-exit () "If all of the minibuffer elements are valid completions then exit. @@ -211,16 +215,14 @@ This function is modeled after `minibuffer-complete-and-exit'." (goto-char (minibuffer-prompt-end)) (while (and doexit - (let ((ol (crm--select-current-element))) - (goto-char (overlay-end ol)) - (unwind-protect - (catch 'exit - (minibuffer-complete-and-exit) - ;; This did not throw `exit', so there was a problem. - (setq doexit nil)) - (goto-char (overlay-end ol)) - (delete-overlay ol)) - (not (eobp))) + (crm--completion-command beg end + (let ((end (copy-marker end t))) + (goto-char end) + (setq doexit nil) + (completion-complete-and-exit beg end + (lambda () (setq doexit t))) + (goto-char end) + (not (eobp)))) (looking-at crm-separator)) ;; Skip to the next element. (goto-char (match-end 0))) diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index 709a094e73b..6c7a0d2db1d 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -626,7 +626,7 @@ The environment used is the one when entering the activation frame at point." (put 'debugger-mode 'mode-class 'special) -(defun debugger-mode () +(define-derived-mode debugger-mode fundamental-mode "Debugger" "Mode for backtrace buffers, selected in debugger. \\<debugger-mode-map> A line starts with `*' if exiting that frame will call the debugger. @@ -641,13 +641,9 @@ which functions will enter the debugger when called. Complete list of commands: \\{debugger-mode-map}" - (kill-all-local-variables) - (setq major-mode 'debugger-mode) - (setq mode-name "Debugger") (setq truncate-lines t) (set-syntax-table emacs-lisp-mode-syntax-table) - (use-local-map debugger-mode-map) - (run-mode-hooks 'debugger-mode-hook)) + (use-local-map debugger-mode-map)) (defcustom debugger-record-buffer "*Debugger-record*" "Buffer name for expression values, for \\[debugger-record-expression]." diff --git a/lisp/emacs-lisp/eieio.el b/lisp/emacs-lisp/eieio.el index fc5da3198f9..46381ede9d1 100644 --- a/lisp/emacs-lisp/eieio.el +++ b/lisp/emacs-lisp/eieio.el @@ -322,7 +322,7 @@ The CLOS function `class-direct-subclasses' is aliased to this function." (defmacro eieio-class-parent (class) "Return first parent class to CLASS. (overload of variable)." `(car (eieio-class-parents ,class))) -(define-obsolete-function-alias 'class-parent #'eieio-class-parent "24.4") +(define-obsolete-function-alias 'class-parent 'eieio-class-parent "24.4") (defun same-class-p (obj class) "Return t if OBJ is of class-type CLASS." (eieio--check-type class-p class) diff --git a/lisp/emacs-lisp/eldoc.el b/lisp/emacs-lisp/eldoc.el index 9b9fd325941..250f93800ec 100644 --- a/lisp/emacs-lisp/eldoc.el +++ b/lisp/emacs-lisp/eldoc.el @@ -309,27 +309,26 @@ This variable is expected to be made buffer-local by modes (other than Emacs Lisp mode) that support ElDoc.") (defun eldoc-print-current-symbol-info () - (condition-case err - (and (or (eldoc-display-message-p) eldoc-post-insert-mode) - (if eldoc-documentation-function - (eldoc-message (funcall eldoc-documentation-function)) - (let* ((current-symbol (eldoc-current-symbol)) - (current-fnsym (eldoc-fnsym-in-current-sexp)) - (doc (cond - ((null current-fnsym) - nil) - ((eq current-symbol (car current-fnsym)) - (or (apply 'eldoc-get-fnsym-args-string - current-fnsym) - (eldoc-get-var-docstring current-symbol))) - (t - (or (eldoc-get-var-docstring current-symbol) - (apply 'eldoc-get-fnsym-args-string - current-fnsym)))))) - (eldoc-message doc)))) - ;; This is run from post-command-hook or some idle timer thing, - ;; so we need to be careful that errors aren't ignored. - (error (message "eldoc error: %s" err)))) + ;; This is run from post-command-hook or some idle timer thing, + ;; so we need to be careful that errors aren't ignored. + (with-demoted-errors "eldoc error: %s" + (and (or (eldoc-display-message-p) eldoc-post-insert-mode) + (if eldoc-documentation-function + (eldoc-message (funcall eldoc-documentation-function)) + (let* ((current-symbol (eldoc-current-symbol)) + (current-fnsym (eldoc-fnsym-in-current-sexp)) + (doc (cond + ((null current-fnsym) + nil) + ((eq current-symbol (car current-fnsym)) + (or (apply 'eldoc-get-fnsym-args-string + current-fnsym) + (eldoc-get-var-docstring current-symbol))) + (t + (or (eldoc-get-var-docstring current-symbol) + (apply 'eldoc-get-fnsym-args-string + current-fnsym)))))) + (eldoc-message doc)))))) (defun eldoc-get-fnsym-args-string (sym &optional index) "Return a string containing the parameter list of the function SYM. diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el index 98576687f3d..409e4faf4d5 100644 --- a/lisp/emacs-lisp/ert.el +++ b/lisp/emacs-lisp/ert.el @@ -785,7 +785,7 @@ This mainly sets up debugger-related bindings." "Immediately truncate *Messages* buffer according to `message-log-max'. This can be useful after reducing the value of `message-log-max'." - (with-current-buffer (get-buffer-create "*Messages*") + (with-current-buffer (messages-buffer) ;; This is a reimplementation of this part of message_dolog() in xdisp.c: ;; if (NATNUMP (Vmessage_log_max)) ;; { @@ -798,7 +798,8 @@ This can be useful after reducing the value of `message-log-max'." (end (save-excursion (goto-char (point-max)) (forward-line (- message-log-max)) - (point)))) + (point))) + (inhibit-read-only t)) (delete-region begin end))))) (defvar ert--running-tests nil @@ -818,7 +819,7 @@ Returns the result and stores it in ERT-TEST's `most-recent-result' slot." (setf (ert-test-most-recent-result ert-test) nil) (cl-block error (let ((begin-marker - (with-current-buffer (get-buffer-create "*Messages*") + (with-current-buffer (messages-buffer) (point-max-marker)))) (unwind-protect (let ((info (make-ert--test-execution-info @@ -837,7 +838,7 @@ Returns the result and stores it in ERT-TEST's `most-recent-result' slot." (ert--run-test-internal info)) (let ((result (ert--test-execution-info-result info))) (setf (ert-test-result-messages result) - (with-current-buffer (get-buffer-create "*Messages*") + (with-current-buffer (messages-buffer) (buffer-substring begin-marker (point-max)))) (ert--force-message-log-buffer-truncation) (setq should-form-accu (nreverse should-form-accu)) diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 7799ee23d62..77496bad441 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -597,7 +597,6 @@ EXTRA-PROPERTIES is currently unused." (defvar version-control) (defun package-generate-autoloads (name pkg-dir) - (require 'autoload) ;Load before we let-bind generated-autoload-file! (let* ((auto-name (format "%s-autoloads.el" name)) ;;(ignore-name (concat name "-pkg.el")) (generated-autoload-file (expand-file-name auto-name pkg-dir)) @@ -1523,7 +1522,7 @@ This fetches the contents of each archive specified in `package-archives', and then refreshes the package menu." (interactive) (unless (derived-mode-p 'package-menu-mode) - (error "The current buffer is not a Package Menu")) + (user-error "The current buffer is not a Package Menu")) (package-refresh-contents) (package-menu--generate t t)) @@ -1535,7 +1534,7 @@ If optional arg BUTTON is non-nil, describe its associated package." (tabulated-list-get-id)))) (if pkg-desc (describe-package pkg-desc) - (error "No package here")))) + (user-error "No package here")))) ;; fixme numeric argument (defun package-menu-mark-delete (&optional _num) diff --git a/lisp/emulation/tpu-edt.el b/lisp/emulation/tpu-edt.el index 1ec0ecc943c..e2fcf2eae41 100644 --- a/lisp/emulation/tpu-edt.el +++ b/lisp/emulation/tpu-edt.el @@ -2374,9 +2374,8 @@ If FILE is nil, try to load a default file. The default file names are (goto-char (point-min)) (beep) (and (tpu-y-or-n-p "Copy key definitions to the new file now? ") - (condition-case conditions - (copy-file oldname newname) - (error (message "Sorry, couldn't copy - %s." (cdr conditions))))) + (with-demoted-errors "Sorry, couldn't copy - %s." + (copy-file oldname newname))) (kill-buffer "*TPU-Notice*"))) (defvar tpu-edt-old-global-values nil) diff --git a/lisp/emulation/ws-mode.el b/lisp/emulation/ws-mode.el index 03d7076195e..dfb81b3829c 100644 --- a/lisp/emulation/ws-mode.el +++ b/lisp/emulation/ws-mode.el @@ -73,8 +73,7 @@ (define-key map "\C-x" 'save-buffers-kill-emacs) (define-key map "y" 'ws-delete-block) (define-key map "\C-y" 'ws-delete-block) - map) - "") + map)) (defvar wordstar-C-o-map (let ((map (make-keymap))) @@ -140,8 +139,7 @@ (define-key map "y" 'ws-kill-eol) (define-key map "\C-y" 'ws-kill-eol) (define-key map "\177" 'ws-kill-bol) - map) - "") + map)) (defvar wordstar-mode-map (let ((map (make-keymap))) @@ -170,17 +168,16 @@ (define-key map "\C-x" 'next-line) (define-key map "\C-y" 'kill-complete-line) (define-key map "\C-z" 'scroll-up-line) - map) - "") + map)) ;; wordstar-C-j-map not yet implemented -(defvar wordstar-C-j-map nil "") +(defvar wordstar-C-j-map nil) (put 'wordstar-mode 'mode-class 'special) ;;;###autoload -(defun wordstar-mode () +(define-derived-mode wordstar-mode fundamental-mode "WordStar" "Major mode with WordStar-like key bindings. BUGS: @@ -191,106 +188,7 @@ BUGS: - Search and replace (C-q a) is only available in forward direction No key bindings beginning with ESC are installed, they will work -Emacs-like. - -The key bindings are: - - C-a backward-word - C-b fill-paragraph - C-c scroll-up-line - C-d forward-char - C-e previous-line - C-f forward-word - C-g delete-char - C-h backward-char - C-i indent-for-tab-command - C-j help-for-help - C-k ordstar-C-k-map - C-l ws-repeat-search - C-n open-line - C-p quoted-insert - C-r scroll-down-line - C-s backward-char - C-t kill-word - C-u keyboard-quit - C-v overwrite-mode - C-w scroll-down - C-x next-line - C-y kill-complete-line - C-z scroll-up - - C-k 0 ws-set-marker-0 - C-k 1 ws-set-marker-1 - C-k 2 ws-set-marker-2 - C-k 3 ws-set-marker-3 - C-k 4 ws-set-marker-4 - C-k 5 ws-set-marker-5 - C-k 6 ws-set-marker-6 - C-k 7 ws-set-marker-7 - C-k 8 ws-set-marker-8 - C-k 9 ws-set-marker-9 - C-k b ws-begin-block - C-k c ws-copy-block - C-k d save-buffers-kill-emacs - C-k f find-file - C-k h ws-show-markers - C-k i ws-indent-block - C-k k ws-end-block - C-k p ws-print-block - C-k q kill-emacs - C-k r insert-file - C-k s save-some-buffers - C-k t ws-mark-word - C-k u ws-exdent-block - C-k C-u keyboard-quit - C-k v ws-move-block - C-k w ws-write-block - C-k x kill-emacs - C-k y ws-delete-block - - C-o c wordstar-center-line - C-o b switch-to-buffer - C-o j justify-current-line - C-o k kill-buffer - C-o l list-buffers - C-o m auto-fill-mode - C-o r set-fill-column - C-o C-u keyboard-quit - C-o wd delete-other-windows - C-o wh split-window-right - C-o wo other-window - C-o wv split-window-below - - C-q 0 ws-find-marker-0 - C-q 1 ws-find-marker-1 - C-q 2 ws-find-marker-2 - C-q 3 ws-find-marker-3 - C-q 4 ws-find-marker-4 - C-q 5 ws-find-marker-5 - C-q 6 ws-find-marker-6 - C-q 7 ws-find-marker-7 - C-q 8 ws-find-marker-8 - C-q 9 ws-find-marker-9 - C-q a ws-query-replace - C-q b ws-to-block-begin - C-q c end-of-buffer - C-q d end-of-line - C-q f ws-search - C-q k ws-to-block-end - C-q l ws-undo - C-q p ws-last-cursorp - C-q r beginning-of-buffer - C-q C-u keyboard-quit - C-q w ws-last-error - C-q y ws-kill-eol - C-q DEL ws-kill-bol -" - (interactive) - (kill-all-local-variables) - (use-local-map wordstar-mode-map) - (setq mode-name "WordStar") - (setq major-mode 'wordstar-mode) - (run-mode-hooks 'wordstar-mode-hook)) +Emacs-like.") (defun wordstar-center-paragraph () diff --git a/lisp/epa.el b/lisp/epa.el index a99fb9230e1..1b06e6ca3bf 100644 --- a/lisp/epa.el +++ b/lisp/epa.el @@ -268,62 +268,40 @@ You should bind this variable with `let', but do not set it globally.") (epg-sub-key-id (car (epg-key-sub-key-list (widget-get widget :value)))))) -(eval-and-compile - (if (fboundp 'encode-coding-string) - (defalias 'epa--encode-coding-string 'encode-coding-string) - (defalias 'epa--encode-coding-string 'identity))) +(defalias 'epa--encode-coding-string + (if (fboundp 'encode-coding-string) #'encode-coding-string #'identity)) -(eval-and-compile - (if (fboundp 'decode-coding-string) - (defalias 'epa--decode-coding-string 'decode-coding-string) - (defalias 'epa--decode-coding-string 'identity))) +(defalias 'epa--decode-coding-string + (if (fboundp 'decode-coding-string) #'decode-coding-string #'identity)) -(defun epa-key-list-mode () +(define-derived-mode epa-key-list-mode special-mode "Keys" "Major mode for `epa-list-keys'." - (kill-all-local-variables) (buffer-disable-undo) - (setq major-mode 'epa-key-list-mode - mode-name "Keys" - truncate-lines t + (setq truncate-lines t buffer-read-only t) - (use-local-map epa-key-list-mode-map) - (make-local-variable 'font-lock-defaults) - (setq font-lock-defaults '(epa-font-lock-keywords t)) + (setq-local font-lock-defaults '(epa-font-lock-keywords t)) ;; In XEmacs, auto-initialization of font-lock is not effective ;; if buffer-file-name is not set. (font-lock-set-defaults) (make-local-variable 'epa-exit-buffer-function) - (make-local-variable 'revert-buffer-function) - (setq revert-buffer-function 'epa--key-list-revert-buffer) - (run-mode-hooks 'epa-key-list-mode-hook)) + (setq-local revert-buffer-function #'epa--key-list-revert-buffer)) -(defun epa-key-mode () +(define-derived-mode epa-key-mode special-mode "Key" "Major mode for a key description." - (kill-all-local-variables) (buffer-disable-undo) - (setq major-mode 'epa-key-mode - mode-name "Key" - truncate-lines t + (setq truncate-lines t buffer-read-only t) - (use-local-map epa-key-mode-map) - (make-local-variable 'font-lock-defaults) - (setq font-lock-defaults '(epa-font-lock-keywords t)) + (setq-local font-lock-defaults '(epa-font-lock-keywords t)) ;; In XEmacs, auto-initialization of font-lock is not effective ;; if buffer-file-name is not set. (font-lock-set-defaults) - (make-local-variable 'epa-exit-buffer-function) - (run-mode-hooks 'epa-key-mode-hook)) + (make-local-variable 'epa-exit-buffer-function)) -(defun epa-info-mode () +(define-derived-mode epa-info-mode special-mode "Info" "Major mode for `epa-info-buffer'." - (kill-all-local-variables) (buffer-disable-undo) - (setq major-mode 'epa-info-mode - mode-name "Info" - truncate-lines t - buffer-read-only t) - (use-local-map epa-info-mode-map) - (run-mode-hooks 'epa-info-mode-hook)) + (setq truncate-lines t + buffer-read-only t)) (defun epa-mark-key (&optional arg) "Mark a key on the current line. @@ -951,10 +929,10 @@ See the reason described in the `epa-verify-region' documentation." (error "No cleartext tail")) (epa-verify-region cleartext-start cleartext-end)))))) -(eval-and-compile +(defalias 'epa--select-safe-coding-system (if (fboundp 'select-safe-coding-system) - (defalias 'epa--select-safe-coding-system 'select-safe-coding-system) - (defun epa--select-safe-coding-system (_from _to) + #'select-safe-coding-system + (lambda (_from _to) buffer-file-coding-system))) ;;;###autoload @@ -1026,16 +1004,16 @@ If no one is selected, default secret key is used. " 'start-open t 'end-open t))))) -(eval-and-compile +(defalias 'epa--derived-mode-p (if (fboundp 'derived-mode-p) - (defalias 'epa--derived-mode-p 'derived-mode-p) - (defun epa--derived-mode-p (&rest modes) + #'derived-mode-p + (lambda (&rest modes) "Non-nil if the current major mode is derived from one of MODES. Uses the `derived-mode-parent' property of the symbol to trace backwards." (let ((parent major-mode)) - (while (and (not (memq parent modes)) - (setq parent (get parent 'derived-mode-parent)))) - parent)))) + (while (and (not (memq parent modes)) + (setq parent (get parent 'derived-mode-parent)))) + parent)))) ;;;###autoload (defun epa-encrypt-region (start end recipients sign signers) @@ -1138,6 +1116,7 @@ If no one is selected, symmetric encryption will be performed. ") (if (epg-context-result-for context 'import) (epa-display-info (epg-import-result-to-string (epg-context-result-for context 'import)))) + ;; FIXME: Why not use the (otherwise unused) epa--derived-mode-p? (if (eq major-mode 'epa-key-list-mode) (apply #'epa--list-keys epa-list-keys-arguments)))) diff --git a/lisp/epg.el b/lisp/epg.el index bcd91d8abba..c733a273988 100644 --- a/lisp/epg.el +++ b/lisp/epg.el @@ -2415,9 +2415,8 @@ If you are unsure, use synchronous version of this function (list "--" (epg-data-file plain))))) ;; `gpgsm' does not read passphrase from stdin, so waiting is not needed. (unless (eq (epg-context-protocol context) 'CMS) - (if sign - (epg-wait-for-status context '("BEGIN_SIGNING")) - (epg-wait-for-status context '("BEGIN_ENCRYPTION")))) + (epg-wait-for-status context + (if sign '("BEGIN_SIGNING") '("BEGIN_ENCRYPTION")))) (when (epg-data-string plain) (if (eq (process-status (epg-context-process context)) 'run) (process-send-string (epg-context-process context) diff --git a/lisp/erc/ChangeLog b/lisp/erc/ChangeLog index e0628dbb80a..ec154fb7efa 100644 --- a/lisp/erc/ChangeLog +++ b/lisp/erc/ChangeLog @@ -1,3 +1,30 @@ +2013-09-21 Glenn Morris <rgm@gnu.org> + + * erc.el (erc-invite-only-mode, erc-toggle-channel-mode): + Remove unused local variable `erc-force-send'. + +2013-09-19 Glenn Morris <rgm@gnu.org> + + * erc-button.el (erc-button-click-button, erc-button-press-button): + * erc-list.el (erc-list-handle-322): + Mark unused arguments. + + * erc.el (erc-open-server-buffer-p): Actually use the `buffer' arg. + * erc-backend.el (erc-server-process-alive): Take optional `buffer' arg. + +2013-09-18 Glenn Morris <rgm@gnu.org> + + * erc-button.el (erc-button-add-buttons): Remove unused local vars. + +2013-09-14 Vivek Dasmohapatra <vivek@etla.org> + + * erc.el (erc-update-mode-line-buffer): + Handle absent topic. (Bug#15377) + +2013-09-13 Glenn Morris <rgm@gnu.org> + + * erc-desktop-notifications.el (dbus-debug): Declare. + 2013-08-22 Stefan Monnier <monnier@iro.umontreal.ca> * erc.el: Use lexical-binding. diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index 4200d4aff7f..4e11f9548b9 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -497,11 +497,12 @@ The current buffer is given by BUFFER." erc-server-ping-handler) erc-server-ping-timer-alist))))) -(defun erc-server-process-alive () - "Return non-nil when `erc-server-process' is open or running." - (and erc-server-process - (processp erc-server-process) - (memq (process-status erc-server-process) '(run open)))) +(defun erc-server-process-alive (&optional buffer) + "Return non-nil when BUFFER has an `erc-server-process' open or running." + (with-current-buffer (or buffer (current-buffer)) + (and erc-server-process + (processp erc-server-process) + (memq (process-status erc-server-process) '(run open))))) ;;;; Connecting to a server diff --git a/lisp/erc/erc-button.el b/lisp/erc/erc-button.el index ac8600c57fd..751a35dfdff 100644 --- a/lisp/erc/erc-button.el +++ b/lisp/erc/erc-button.el @@ -267,7 +267,7 @@ specified by `erc-button-alist'." (inhibit-point-motion-hooks t) (inhibit-field-text-motion t) (alist erc-button-alist) - entry regexp data) + regexp) (erc-button-remove-old-buttons) (dolist (entry alist) (if (equal (car entry) (quote (quote nicknames))) @@ -407,7 +407,7 @@ REGEXP is the regular expression which matched for this button." ;; Since Emacs runs this directly, rather than with ;; widget-button-click, we need to fake an extra arg in the ;; interactive spec. -(defun erc-button-click-button (ignore event) +(defun erc-button-click-button (_ignore event) "Call `erc-button-press-button'." (interactive "P\ne") (save-excursion @@ -416,7 +416,7 @@ REGEXP is the regular expression which matched for this button." ;; XEmacs calls this via widget-button-press with a bunch of arguments ;; which we don't care about. -(defun erc-button-press-button (&rest ignore) +(defun erc-button-press-button (&rest _ignore) "Check text at point for a callback function. If the text at point has a `erc-callback' property, call it with the value of the `erc-data' text property." diff --git a/lisp/erc/erc-desktop-notifications.el b/lisp/erc/erc-desktop-notifications.el index ac6c202b18a..60c49cc8870 100644 --- a/lisp/erc/erc-desktop-notifications.el +++ b/lisp/erc/erc-desktop-notifications.el @@ -46,6 +46,8 @@ :group 'erc-notifications :type '(choice (const :tag "No icon" nil) file)) +(defvar dbus-debug) ; used in the macroexpansion of dbus-ignore-errors + (defun erc-notifications-notify (nick msg) "Notify that NICK send some MSG. This will replace the last notification sent with this function." diff --git a/lisp/erc/erc-list.el b/lisp/erc/erc-list.el index c243073790e..6349772a59f 100644 --- a/lisp/erc/erc-list.el +++ b/lisp/erc/erc-list.el @@ -164,7 +164,8 @@ ;; Handle a "322" response. This response tells us about a single ;; channel. -(defun erc-list-handle-322 (proc parsed) +;; Called via erc-once-with-server-event with two arguments. +(defun erc-list-handle-322 (_proc parsed) (let* ((args (cdr (erc-response.command-args parsed))) (channel (car args)) (nusers (car (cdr args))) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 0bfd21d6c3a..15ff0e5737e 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -1312,13 +1312,13 @@ If BUFFER is nil, the current buffer is used." (and (eq major-mode 'erc-mode) (null (erc-default-target))))) -(defun erc-open-server-buffer-p (&optional buffer) ;FIXME: `buffer' is ignored! +(defun erc-open-server-buffer-p (&optional buffer) "Return non-nil if argument BUFFER is an ERC server buffer that has an open IRC process. If BUFFER is nil, the current buffer is used." - (and (erc-server-buffer-p) - (erc-server-process-alive))) + (and (erc-server-buffer-p buffer) + (erc-server-process-alive buffer))) (defun erc-query-buffer-p (&optional buffer) "Return non-nil if BUFFER is an ERC query buffer. @@ -5541,8 +5541,7 @@ If ARG is non-nil, turn this mode off (-i). This command is sent even if excess flood is detected." (interactive "P") (erc-set-active-buffer (current-buffer)) - (let ((tgt (erc-default-target)) - (erc-force-send t)) ;FIXME: Not used anywhere! + (let ((tgt (erc-default-target))) (cond ((or (not tgt) (not (erc-channel-p tgt))) (erc-display-message nil 'error (current-buffer) 'no-target)) (arg (erc-load-irc-script-lines (list (concat "/mode " tgt " -i")) @@ -5579,8 +5578,7 @@ If CHANNEL is non-nil, toggle MODE for that channel, otherwise use `erc-default-target'." (interactive "P") (erc-set-active-buffer (current-buffer)) - (let ((tgt (or channel (erc-default-target))) - (erc-force-send t)) ;FIXME: Not used anywhere! + (let ((tgt (or channel (erc-default-target)))) (cond ((or (null tgt) (null (erc-channel-p tgt))) (erc-display-message nil 'error 'active 'no-target)) ((member mode erc-channel-modes) @@ -6189,7 +6187,7 @@ if `erc-away' is non-nil." ?m (erc-format-channel-modes) ?n (or (erc-current-nick) "") ?N (erc-format-network) - ?o (erc-controls-strip erc-channel-topic) + ?o (or (erc-controls-strip erc-channel-topic) "") ?p (erc-port-to-string erc-session-port) ?s (erc-format-target-and/or-server) ?S (erc-format-target-and/or-network) diff --git a/lisp/eshell/em-alias.el b/lisp/eshell/em-alias.el index a46b48c01b3..210d71be9c6 100644 --- a/lisp/eshell/em-alias.el +++ b/lisp/eshell/em-alias.el @@ -1,4 +1,4 @@ -;;; em-alias.el --- creation and management of command aliases +;;; em-alias.el --- creation and management of command aliases -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -221,18 +221,11 @@ file named by `eshell-aliases-file'.") (let ((alias (eshell-lookup-alias command))) (if alias (throw 'eshell-replace-command - (list - 'let - (list - (list 'eshell-command-name - (list 'quote eshell-last-command-name)) - (list 'eshell-command-arguments - (list 'quote eshell-last-arguments)) - (list 'eshell-prevent-alias-expansion - (list 'quote - (cons command - eshell-prevent-alias-expansion)))) - (eshell-parse-command (nth 1 alias)))))))) + `(let ((eshell-command-name ',eshell-last-command-name) + (eshell-command-arguments ',eshell-last-arguments) + (eshell-prevent-alias-expansion + ',(cons command eshell-prevent-alias-expansion))) + ,(eshell-parse-command (nth 1 alias)))))))) (defun eshell-alias-completions (name) "Find all possible completions for NAME. diff --git a/lisp/eshell/em-banner.el b/lisp/eshell/em-banner.el index 8c3eebf3510..3e1970d97da 100644 --- a/lisp/eshell/em-banner.el +++ b/lisp/eshell/em-banner.el @@ -1,4 +1,4 @@ -;;; em-banner.el --- sample module that displays a login banner +;;; em-banner.el --- sample module that displays a login banner -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. diff --git a/lisp/eshell/em-basic.el b/lisp/eshell/em-basic.el index c440bd0a928..fb2eb85c8e9 100644 --- a/lisp/eshell/em-basic.el +++ b/lisp/eshell/em-basic.el @@ -1,4 +1,4 @@ -;;; em-basic.el --- basic shell builtin commands +;;; em-basic.el --- basic shell builtin commands -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. diff --git a/lisp/eshell/em-cmpl.el b/lisp/eshell/em-cmpl.el index 7120f639a70..5cb5d931700 100644 --- a/lisp/eshell/em-cmpl.el +++ b/lisp/eshell/em-cmpl.el @@ -1,4 +1,4 @@ -;;; em-cmpl.el --- completion using the TAB key +;;; em-cmpl.el --- completion using the TAB key -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -370,7 +370,7 @@ to writing a completion function." (cl-assert (= (length args) (length posns))) (let ((a args) (i 0) - l final) + l) (while a (if (and (consp (car a)) (eq (caar a) 'eshell-operator)) diff --git a/lisp/eshell/em-dirs.el b/lisp/eshell/em-dirs.el index e8fbe0518ac..2cfd14b5f60 100644 --- a/lisp/eshell/em-dirs.el +++ b/lisp/eshell/em-dirs.el @@ -1,4 +1,4 @@ -;;; em-dirs.el --- directory navigation commands +;;; em-dirs.el --- directory navigation commands -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. diff --git a/lisp/eshell/em-glob.el b/lisp/eshell/em-glob.el index a58c7730ded..9d3836431c4 100644 --- a/lisp/eshell/em-glob.el +++ b/lisp/eshell/em-glob.el @@ -1,4 +1,4 @@ -;;; em-glob.el --- extended file name globbing +;;; em-glob.el --- extended file name globbing -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -180,6 +180,8 @@ interpretation." (goto-char (1+ end)))))))))) (defvar eshell-glob-chars-regexp nil) +(defvar eshell-glob-matches) +(defvar message-shown) (defun eshell-glob-regexp (pattern) "Convert glob-pattern PATTERN to a regular expression. @@ -230,6 +232,8 @@ resulting regular expression." (regexp-quote (substring pattern matched-in-pattern)) "\\'"))) +(defvar ange-cache) ; XEmacs? See esh-util + (defun eshell-extended-glob (glob) "Return a list of files generated from GLOB, perhaps looking for DIRS-ONLY. This function almost fully supports zsh style filename generation @@ -262,9 +266,6 @@ the form: (error "No matches found: %s" glob) glob)))) -(defvar eshell-glob-matches) -(defvar message-shown) - ;; FIXME does this really need to abuse eshell-glob-matches, message-shown? (defun eshell-glob-entries (path globs &optional recurse-p) "Glob the entries in PATHS, possibly recursing if RECURSE-P is non-nil." diff --git a/lisp/eshell/em-hist.el b/lisp/eshell/em-hist.el index 694fe71a95c..31eb1e1ff10 100644 --- a/lisp/eshell/em-hist.el +++ b/lisp/eshell/em-hist.el @@ -1,4 +1,4 @@ -;;; em-hist.el --- history list management +;;; em-hist.el --- history list management -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -330,7 +330,7 @@ unless a different file is specified on the command line.") (and (or (not (ring-p eshell-history-ring)) (ring-empty-p eshell-history-ring)) (error "No history")) - (let (length command file) + (let (length file) (when (and args (string-match "^[0-9]+$" (car args))) (setq length (min (eshell-convert (car args)) (ring-length eshell-history-ring)) @@ -346,8 +346,7 @@ unless a different file is specified on the command line.") (write-history (eshell-write-history file)) (append-history (eshell-write-history file t)) (t - (let* ((history nil) - (index (1- (or length (ring-length eshell-history-ring)))) + (let* ((index (1- (or length (ring-length eshell-history-ring)))) (ref (- (ring-length eshell-history-ring) index))) ;; We have to build up a list ourselves from the ring vector. (while (>= index 0) @@ -532,7 +531,7 @@ See also `eshell-read-history'." ((string= "%" ref) (error "`%%' history word designator not yet implemented")))) -(defun eshell-hist-parse-arguments (&optional silent b e) +(defun eshell-hist-parse-arguments (&optional b e) "Parse current command arguments in a history-code-friendly way." (let ((end (or e (point))) (begin (or b (save-excursion (eshell-bol) (point)))) @@ -572,7 +571,7 @@ See also `eshell-read-history'." (defun eshell-expand-history-references (beg end) "Parse and expand any history references in current input." - (let ((result (eshell-hist-parse-arguments t beg end))) + (let ((result (eshell-hist-parse-arguments beg end))) (when result (let ((textargs (nreverse (nth 0 result))) (posb (nreverse (nth 1 result))) @@ -700,7 +699,7 @@ matched." (here (point)) textargs) (insert hist) - (setq textargs (car (eshell-hist-parse-arguments nil here (point)))) + (setq textargs (car (eshell-hist-parse-arguments here (point)))) (delete-region here (point)) (if (string= nth "*") (if mth @@ -945,7 +944,7 @@ If N is negative, search backwards for the -Nth previous match." (defun eshell-isearch-backward (&optional invert) "Do incremental regexp search backward through past commands." (interactive) - (let ((inhibit-read-only t) end) + (let ((inhibit-read-only t)) (eshell-prepare-for-search) (goto-char (point-max)) (set-marker eshell-last-output-end (point)) diff --git a/lisp/eshell/em-ls.el b/lisp/eshell/em-ls.el index 41db4cd03d1..16cc6a22008 100644 --- a/lisp/eshell/em-ls.el +++ b/lisp/eshell/em-ls.el @@ -1,4 +1,4 @@ -;;; em-ls.el --- implementation of ls in Lisp +;;; em-ls.el --- implementation of ls in Lisp -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -44,127 +44,102 @@ properties to colorize its output based on the setting of ;;; User Variables: -(defvar eshell-ls-orig-insert-directory - (symbol-function 'insert-directory) - "Preserve the original definition of `insert-directory'.") - -(defcustom eshell-ls-unload-hook - (list - (function - (lambda () - (fset 'insert-directory eshell-ls-orig-insert-directory)))) - "When unloading `eshell-ls', restore the definition of `insert-directory'." - :type 'hook - :group 'eshell-ls) - (defcustom eshell-ls-date-format "%Y-%m-%d" "How to display time information in `eshell-ls-file'. This is passed to `format-time-string' as a format string. To display the date using the current locale, use \"%b \%e\"." :version "24.1" - :type 'string - :group 'eshell-ls) + :type 'string) (defcustom eshell-ls-initial-args nil "If non-nil, this list of args is included before any call to `ls'. This is useful for enabling human-readable format (-h), for example." - :type '(repeat :tag "Arguments" string) - :group 'eshell-ls) + :type '(repeat :tag "Arguments" string)) (defcustom eshell-ls-dired-initial-args nil "If non-nil, args is included before any call to `ls' in Dired. This is useful for enabling human-readable format (-h), for example." - :type '(repeat :tag "Arguments" string) - :group 'eshell-ls) + :type '(repeat :tag "Arguments" string)) (defcustom eshell-ls-use-in-dired nil - "If non-nil, use `eshell-ls' to read directories in Dired." + "If non-nil, use `eshell-ls' to read directories in Dired. +Changing this without using customize has no effect." :set (lambda (symbol value) (if value - (unless (and (boundp 'eshell-ls-use-in-dired) - eshell-ls-use-in-dired) - (fset 'insert-directory 'eshell-ls-insert-directory)) - (when (and (boundp 'eshell-ls-insert-directory) - eshell-ls-use-in-dired) - (fset 'insert-directory eshell-ls-orig-insert-directory))) - (setq eshell-ls-use-in-dired value)) + (advice-add 'insert-directory :around + #'eshell-ls--insert-directory) + (advice-remove 'insert-directory + #'eshell-ls--insert-directory)) + (set symbol value)) :type 'boolean - :require 'em-ls - :group 'eshell-ls) + :require 'em-ls) +(add-hook 'eshell-ls-unload-hook + (lambda () (advice-remove 'insert-directory + #'eshell-ls--insert-directory))) + (defcustom eshell-ls-default-blocksize 1024 "The default blocksize to use when display file sizes with -s." - :type 'integer - :group 'eshell-ls) + :type 'integer) (defcustom eshell-ls-exclude-regexp nil "Unless -a is specified, files matching this regexp will not be shown." - :type '(choice regexp (const nil)) - :group 'eshell-ls) + :type '(choice regexp (const nil))) (defcustom eshell-ls-exclude-hidden t "Unless -a is specified, files beginning with . will not be shown. Using this boolean, instead of `eshell-ls-exclude-regexp', is both faster and conserves more memory." - :type 'boolean - :group 'eshell-ls) + :type 'boolean) (defcustom eshell-ls-use-colors t "If non-nil, use colors in file listings." - :type 'boolean - :group 'eshell-ls) + :type 'boolean) (defface eshell-ls-directory '((((class color) (background light)) (:foreground "Blue" :weight bold)) (((class color) (background dark)) (:foreground "SkyBlue" :weight bold)) (t (:weight bold))) - "The face used for highlight directories." - :group 'eshell-ls) + "The face used for highlight directories.") (define-obsolete-face-alias 'eshell-ls-directory-face 'eshell-ls-directory "22.1") (defface eshell-ls-symlink '((((class color) (background light)) (:foreground "Dark Cyan" :weight bold)) (((class color) (background dark)) (:foreground "Cyan" :weight bold))) - "The face used for highlight symbolic links." - :group 'eshell-ls) + "The face used for highlight symbolic links.") (define-obsolete-face-alias 'eshell-ls-symlink-face 'eshell-ls-symlink "22.1") (defface eshell-ls-executable '((((class color) (background light)) (:foreground "ForestGreen" :weight bold)) (((class color) (background dark)) (:foreground "Green" :weight bold))) - "The face used for highlighting executables (not directories, though)." - :group 'eshell-ls) + "The face used for highlighting executables (not directories, though).") (define-obsolete-face-alias 'eshell-ls-executable-face 'eshell-ls-executable "22.1") (defface eshell-ls-readonly '((((class color) (background light)) (:foreground "Brown")) (((class color) (background dark)) (:foreground "Pink"))) - "The face used for highlighting read-only files." - :group 'eshell-ls) + "The face used for highlighting read-only files.") (define-obsolete-face-alias 'eshell-ls-readonly-face 'eshell-ls-readonly "22.1") (defface eshell-ls-unreadable '((((class color) (background light)) (:foreground "Grey30")) (((class color) (background dark)) (:foreground "DarkGrey"))) - "The face used for highlighting unreadable files." - :group 'eshell-ls) + "The face used for highlighting unreadable files.") (define-obsolete-face-alias 'eshell-ls-unreadable-face 'eshell-ls-unreadable "22.1") (defface eshell-ls-special '((((class color) (background light)) (:foreground "Magenta" :weight bold)) (((class color) (background dark)) (:foreground "Magenta" :weight bold))) - "The face used for highlighting non-regular files." - :group 'eshell-ls) + "The face used for highlighting non-regular files.") (define-obsolete-face-alias 'eshell-ls-special-face 'eshell-ls-special "22.1") (defface eshell-ls-missing '((((class color) (background light)) (:foreground "Red" :weight bold)) (((class color) (background dark)) (:foreground "Red" :weight bold))) - "The face used for highlighting non-existent file names." - :group 'eshell-ls) + "The face used for highlighting non-existent file names.") (define-obsolete-face-alias 'eshell-ls-missing-face 'eshell-ls-missing "22.1") (defcustom eshell-ls-archive-regexp @@ -174,27 +149,23 @@ faster and conserves more memory." This typically includes both traditional archives and compressed files." :version "24.1" ; added xz - :type 'regexp - :group 'eshell-ls) + :type 'regexp) (defface eshell-ls-archive '((((class color) (background light)) (:foreground "Orchid" :weight bold)) (((class color) (background dark)) (:foreground "Orchid" :weight bold))) - "The face used for highlighting archived and compressed file names." - :group 'eshell-ls) + "The face used for highlighting archived and compressed file names.") (define-obsolete-face-alias 'eshell-ls-archive-face 'eshell-ls-archive "22.1") (defcustom eshell-ls-backup-regexp "\\(\\`\\.?#\\|\\(\\.bak\\|~\\)\\'\\)" "A regular expression that matches names of backup files." - :type 'regexp - :group 'eshell-ls) + :type 'regexp) (defface eshell-ls-backup '((((class color) (background light)) (:foreground "OrangeRed")) (((class color) (background dark)) (:foreground "LightSalmon"))) - "The face used for highlighting backup file names." - :group 'eshell-ls) + "The face used for highlighting backup file names.") (define-obsolete-face-alias 'eshell-ls-backup-face 'eshell-ls-backup "22.1") (defcustom eshell-ls-product-regexp @@ -202,14 +173,12 @@ files." "A regular expression that matches names of product files. Products are files that get generated from a source file, and hence ought to be recreatable if they are deleted." - :type 'regexp - :group 'eshell-ls) + :type 'regexp) (defface eshell-ls-product '((((class color) (background light)) (:foreground "OrangeRed")) (((class color) (background dark)) (:foreground "LightSalmon"))) - "The face used for highlighting files that are build products." - :group 'eshell-ls) + "The face used for highlighting files that are build products.") (define-obsolete-face-alias 'eshell-ls-product-face 'eshell-ls-product "22.1") (defcustom eshell-ls-clutter-regexp @@ -217,14 +186,12 @@ ought to be recreatable if they are deleted." "A regular expression that matches names of junk files. These are mainly files that get created for various reasons, but don't really need to stick around for very long." - :type 'regexp - :group 'eshell-ls) + :type 'regexp) (defface eshell-ls-clutter '((((class color) (background light)) (:foreground "OrangeRed" :weight bold)) (((class color) (background dark)) (:foreground "OrangeRed" :weight bold))) - "The face used for highlighting junk file names." - :group 'eshell-ls) + "The face used for highlighting junk file names.") (define-obsolete-face-alias 'eshell-ls-clutter-face 'eshell-ls-clutter "22.1") (defsubst eshell-ls-filetype-p (attrs type) @@ -265,13 +232,31 @@ The format of the members of this alist is If TEST-SEXP evals to non-nil, that face will be used to highlight the name of the file. The first match wins. `file' and `attrs' are in scope during the evaluation of TEST-SEXP." - :type '(repeat (cons function face)) - :group 'eshell-ls) + :type '(repeat (cons function face))) + +(defvar block-size) +(defvar dereference-links) +(defvar dir-literal) +(defvar error-func) +(defvar flush-func) +(defvar human-readable) +(defvar ignore-pattern) +(defvar insert-func) +(defvar listing-style) +(defvar numeric-uid-gid) +(defvar reverse-list) +(defvar show-all) +(defvar show-almost-all) +(defvar show-recursive) +(defvar show-size) +(defvar sort-method) +(defvar ange-cache) +(defvar dired-flag) ;;; Functions: -(defun eshell-ls-insert-directory - (file switches &optional wildcard full-directory-p) +(defun eshell-ls--insert-directory + (orig-fun file switches &optional wildcard full-directory-p) "Insert directory listing for FILE, formatted according to SWITCHES. Leaves point after the inserted text. SWITCHES may be a string of options, or a list of strings. @@ -282,29 +267,31 @@ switches do not contain `d', so that a full listing is expected. This version of the function uses `eshell/ls'. If any of the switches passed are not recognized, the operating system's version will be used instead." - (let ((handler (find-file-name-handler file 'insert-directory))) - (if handler - (funcall handler 'insert-directory file switches - wildcard full-directory-p) - (if (stringp switches) - (setq switches (split-string switches))) - (let (eshell-current-handles - eshell-current-subjob-p - font-lock-mode) - ;; use the fancy highlighting in `eshell-ls' rather than font-lock - (when (and eshell-ls-use-colors - (featurep 'font-lock)) - (font-lock-mode -1) - (setq font-lock-defaults nil) - (if (boundp 'font-lock-buffers) - (set 'font-lock-buffers - (delq (current-buffer) - (symbol-value 'font-lock-buffers))))) - (let ((insert-func 'insert) - (error-func 'insert) - (flush-func 'ignore) - eshell-ls-dired-initial-args) - (eshell-do-ls (append switches (list file)))))))) + (if (not eshell-ls-use-in-dired) + (funcall orig-fun file switches wildcard full-directory-p) + (let ((handler (find-file-name-handler file 'insert-directory))) + (if handler + (funcall handler 'insert-directory file switches + wildcard full-directory-p) + (if (stringp switches) + (setq switches (split-string switches))) + (let (eshell-current-handles + eshell-current-subjob-p + font-lock-mode) + ;; use the fancy highlighting in `eshell-ls' rather than font-lock + (when (and eshell-ls-use-colors + (featurep 'font-lock)) + (font-lock-mode -1) + (setq font-lock-defaults nil) + (if (boundp 'font-lock-buffers) + (set 'font-lock-buffers + (delq (current-buffer) + (symbol-value 'font-lock-buffers))))) + (let ((insert-func 'insert) + (error-func 'insert) + (flush-func 'ignore) + eshell-ls-dired-initial-args) + (eshell-do-ls (append switches (list file))))))))) (defsubst eshell/ls (&rest args) "An alias version of `eshell-do-ls'." @@ -315,25 +302,6 @@ instead." (put 'eshell/ls 'eshell-no-numeric-conversions t) -(defvar block-size) -(defvar dereference-links) -(defvar dir-literal) -(defvar error-func) -(defvar flush-func) -(defvar human-readable) -(defvar ignore-pattern) -(defvar insert-func) -(defvar listing-style) -(defvar numeric-uid-gid) -(defvar reverse-list) -(defvar show-all) -(defvar show-almost-all) -(defvar show-recursive) -(defvar show-size) -(defvar sort-method) -(defvar ange-cache) -(defvar dired-flag) - (declare-function eshell-glob-regexp "em-glob" (pattern)) (defun eshell-do-ls (&rest args) diff --git a/lisp/eshell/em-pred.el b/lisp/eshell/em-pred.el index 3a7f46ebe83..a3aebc23faa 100644 --- a/lisp/eshell/em-pred.el +++ b/lisp/eshell/em-pred.el @@ -1,4 +1,4 @@ -;;; em-pred.el --- argument predicates and modifiers (ala zsh) +;;; em-pred.el --- argument predicates and modifiers (ala zsh) -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -306,8 +306,8 @@ predicate functions. MOD-FUNC-LIST is a list of result modifier functions. PRED-FUNCS take a filename and return t if the test succeeds; MOD-FUNCS take any string and preform a modification, returning the resultant string." - (let (result negate follow preds mods) - (condition-case err + (let (negate follow preds mods) + (condition-case nil (while (not (eobp)) (let ((char (char-after))) (cond @@ -399,7 +399,7 @@ returning the resultant string." (defun eshell-pred-file-time (mod-char mod-type attr-index) "Return a predicate to test whether a file matches a certain time." (let* ((quantum 86400) - qual amount when open close end) + qual when open close end) (when (memq (char-after) '(?M ?w ?h ?m ?s)) (setq quantum (char-after)) (cond diff --git a/lisp/eshell/em-prompt.el b/lisp/eshell/em-prompt.el index 18731121c4e..e79c7d7ba63 100644 --- a/lisp/eshell/em-prompt.el +++ b/lisp/eshell/em-prompt.el @@ -1,4 +1,4 @@ -;;; em-prompt.el --- command prompts +;;; em-prompt.el --- command prompts -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -45,6 +45,8 @@ as is common with most shells." :type 'hook :group 'eshell-prompt) +(autoload 'eshell/pwd "em-dirs") + (defcustom eshell-prompt-function (function (lambda () diff --git a/lisp/eshell/em-rebind.el b/lisp/eshell/em-rebind.el index 341191fc62f..378a57b0687 100644 --- a/lisp/eshell/em-rebind.el +++ b/lisp/eshell/em-rebind.el @@ -1,4 +1,4 @@ -;;; em-rebind.el --- rebind keys when point is at current input +;;; em-rebind.el --- rebind keys when point is at current input -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -218,7 +218,7 @@ lock it at that." (cdar bindings)) (setq bindings (cdr bindings))))) -(defun eshell-delete-backward-char (n &optional killflag) +(defun eshell-delete-backward-char (n) "Delete the last character, unless it's part of the output." (interactive "P") (let ((count (prefix-numeric-value n))) diff --git a/lisp/eshell/em-script.el b/lisp/eshell/em-script.el index b073928738f..1a19698faa8 100644 --- a/lisp/eshell/em-script.el +++ b/lisp/eshell/em-script.el @@ -1,4 +1,4 @@ -;;; em-script.el --- Eshell script files +;;; em-script.el --- Eshell script files -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. diff --git a/lisp/eshell/em-smart.el b/lisp/eshell/em-smart.el index aa9038aafb9..8d60444a889 100644 --- a/lisp/eshell/em-smart.el +++ b/lisp/eshell/em-smart.el @@ -1,4 +1,4 @@ -;;; em-smart.el --- smart display of output +;;; em-smart.el --- smart display of output -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -194,7 +194,8 @@ The options are `begin', `after' or `end'." (add-hook 'eshell-post-command-hook 'eshell-smart-maybe-jump-to-end nil t)))) -(defun eshell-smart-scroll-window (wind start) +;; This is called by window-scroll-functions with two arguments. +(defun eshell-smart-scroll-window (wind _start) "Scroll the given Eshell window accordingly." (unless eshell-currently-handling-window (let ((inhibit-point-motion-hooks t) @@ -237,7 +238,8 @@ The options are `begin', `after' or `end'." (add-hook 'pre-command-hook 'eshell-smart-display-move nil t) (eshell-refresh-windows)) -(defun eshell-disable-after-change (b e l) +;; Called from after-change-functions with 3 arguments. +(defun eshell-disable-after-change (_b _e _l) "Disable smart display mode if the buffer changes in any way." (when eshell-smart-command-done (remove-hook 'pre-command-hook 'eshell-smart-display-move t) diff --git a/lisp/eshell/em-term.el b/lisp/eshell/em-term.el index 2932f443e4f..bfc810f2d2a 100644 --- a/lisp/eshell/em-term.el +++ b/lisp/eshell/em-term.el @@ -1,4 +1,4 @@ -;;; em-term.el --- running visual commands +;;; em-term.el --- running visual commands -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -189,7 +189,8 @@ allowed." (term-set-escape-char ?\C-x)))) nil) -(defun eshell-term-sentinel (proc string) +;; Process sentinels receive two arguments. +(defun eshell-term-sentinel (proc _string) "Destroy the buffer visiting PROC." (let ((proc-buf (process-buffer proc))) (when (and proc-buf (buffer-live-p proc-buf) diff --git a/lisp/eshell/em-tramp.el b/lisp/eshell/em-tramp.el index fb816b76a7d..bb2f440313c 100644 --- a/lisp/eshell/em-tramp.el +++ b/lisp/eshell/em-tramp.el @@ -1,4 +1,4 @@ -;;; em-tramp.el --- Eshell features that require TRAMP +;;; em-tramp.el --- Eshell features that require TRAMP -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. diff --git a/lisp/eshell/em-unix.el b/lisp/eshell/em-unix.el index af54d875cb0..1cf40d58a49 100644 --- a/lisp/eshell/em-unix.el +++ b/lisp/eshell/em-unix.el @@ -1,4 +1,4 @@ -;;; em-unix.el --- UNIX command aliases +;;; em-unix.el --- UNIX command aliases -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -195,12 +195,12 @@ Otherwise, Emacs will attempt to use rsh to invoke du on the remote machine." (Info-menu (car args)) (setq args (cdr args))))) -(defun eshell-remove-entries (path files &optional top-level) - "From PATH, remove all of the given FILES, perhaps interactively." +(defun eshell-remove-entries (files &optional toplevel) + "Remove all of the given FILES, perhaps interactively." (while files (if (string-match "\\`\\.\\.?\\'" (file-name-nondirectory (car files))) - (if top-level + (if toplevel (eshell-error "rm: cannot remove `.' or `..'\n")) (if (and (file-directory-p (car files)) (not (file-symlink-p (car files)))) @@ -284,18 +284,21 @@ Remove (unlink) the FILE(s).") entry))))) (eshell-funcalln 'unintern entry))) ((stringp entry) - (if (and (file-directory-p entry) - (not (file-symlink-p entry))) - (if (or em-recursive - eshell-rm-removes-directories) - (if (or em-preview - (not em-interactive) - (y-or-n-p - (format "rm: descend into directory `%s'? " - entry))) - (eshell-remove-entries nil (list entry) t)) - (eshell-error (format "rm: %s: is a directory\n" entry))) - (eshell-remove-entries nil (list entry) t))))) + ;; -f should silently ignore missing files (bug#15373). + (unless (and force-removal + (not (file-exists-p entry))) + (if (and (file-directory-p entry) + (not (file-symlink-p entry))) + (if (or em-recursive + eshell-rm-removes-directories) + (if (or em-preview + (not em-interactive) + (y-or-n-p + (format "rm: descend into directory `%s'? " + entry))) + (eshell-remove-entries (list entry) t)) + (eshell-error (format "rm: %s: is a directory\n" entry))) + (eshell-remove-entries (list entry) t)))))) (setq args (cdr args))) nil)) @@ -458,6 +461,8 @@ Remove the DIRECTORY(ies), if they are empty.") (eshell-parse-command (format "tar %s %s" tar-args archive) args)))) +(defvar ange-cache) ; XEmacs? See esh-util + ;; this is to avoid duplicating code... (defmacro eshell-mvcpln-template (command action func query-var force-var &optional preserve) @@ -714,6 +719,8 @@ available..." (goto-char (point-min)) (resize-temp-buffer-window)))))) +(defvar compilation-scroll-output) + (defun eshell-grep (command args &optional maybe-use-occur) "Generic service function for the various grep aliases. It calls Emacs's grep utility if the command is not redirecting output, @@ -989,7 +996,7 @@ Show wall-clock time elapsed during execution of COMMAND.") (setq args nil) (setcdr (last args 3) nil)) (with-current-buffer - (condition-case err + (condition-case nil (diff-no-select old new (nil-blank-string (eshell-flatten-and-stringify args))) @@ -1014,6 +1021,8 @@ Show wall-clock time elapsed during execution of COMMAND.") (put 'eshell/diff 'eshell-no-numeric-conversions t) +(defvar locate-history-list) + (defun eshell/locate (&rest args) "Alias \"locate\" to call Emacs `locate' function." (if (or eshell-plain-locate-behavior diff --git a/lisp/eshell/em-xtra.el b/lisp/eshell/em-xtra.el index c4cab522cf2..c9d9d5bfe2f 100644 --- a/lisp/eshell/em-xtra.el +++ b/lisp/eshell/em-xtra.el @@ -1,4 +1,4 @@ -;;; em-xtra.el --- extra alias functions +;;; em-xtra.el --- extra alias functions -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. diff --git a/lisp/eshell/esh-arg.el b/lisp/eshell/esh-arg.el index d7dfd27d8d3..f791ad66520 100644 --- a/lisp/eshell/esh-arg.el +++ b/lisp/eshell/esh-arg.el @@ -1,4 +1,4 @@ -;;; esh-arg.el --- argument processing +;;; esh-arg.el --- argument processing -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -278,7 +278,7 @@ Point is left at the end of the arguments." (eshell-resolve-current-argument) eshell-current-argument)) -(defsubst eshell-operator (&rest args) +(defsubst eshell-operator (&rest _args) "A stub function that generates an error if a floating operator is found." (error "Unhandled operator in input text")) diff --git a/lisp/eshell/esh-cmd.el b/lisp/eshell/esh-cmd.el index ef8a53f3c0b..baa8e7bafcf 100644 --- a/lisp/eshell/esh-cmd.el +++ b/lisp/eshell/esh-cmd.el @@ -1,4 +1,4 @@ -;;; esh-cmd.el --- command invocation +;;; esh-cmd.el --- command invocation -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -205,12 +205,16 @@ forms or strings)." :type 'hook :group 'eshell-cmd) -(defcustom eshell-post-rewrite-command-hook nil +(defvar eshell-post-rewrite-command-function #'identity + "Function run after command rewriting is finished. +Takes the (rewritten) command, modifies it as it sees fit and returns +the new result to use instead.") +(defvar eshell-post-rewrite-command-hook nil "A hook run after command rewriting is finished. Each function is passed the symbol containing the rewritten command, -which may be modified directly. Any return value is ignored." - :type 'hook - :group 'eshell-cmd) +which may be modified directly. Any return value is ignored.") +(make-obsolete-variable 'eshell-post-rewrite-command-hook + 'eshell-post-rewrite-command-function "24.4") (defcustom eshell-complex-commands '("ls") "A list of commands names or functions, that determine complexity. @@ -335,13 +339,15 @@ otherwise t.") ;; Command parsing -(defun eshell-parse-command (command &optional args top-level) +(defvar eshell--sep-terms) + +(defun eshell-parse-command (command &optional args toplevel) "Parse the COMMAND, adding ARGS if given. COMMAND can either be a string, or a cons cell demarcating a buffer -region. TOP-LEVEL, if non-nil, means that the outermost command (the +region. TOPLEVEL, if non-nil, means that the outermost command (the user's input command) is being parsed, and that pre and post command hooks should be run before and after the command." - (let* (sep-terms + (let* (eshell--sep-terms (terms (append (if (consp command) @@ -361,32 +367,27 @@ hooks should be run before and after the command." (function (lambda (cmd) (setq cmd - (if (or (not (car sep-terms)) - (string= (car sep-terms) ";")) - (eshell-parse-pipeline cmd (not (car sep-terms))) + (if (or (not (car eshell--sep-terms)) + (string= (car eshell--sep-terms) ";")) + (eshell-parse-pipeline cmd) `(eshell-do-subjob (list ,(eshell-parse-pipeline cmd))))) - (setq sep-terms (cdr sep-terms)) + (setq eshell--sep-terms (cdr eshell--sep-terms)) (if eshell-in-pipeline-p cmd `(eshell-trap-errors ,cmd)))) - (eshell-separate-commands terms "[&;]" nil 'sep-terms)))) + (eshell-separate-commands terms "[&;]" nil 'eshell--sep-terms)))) (let ((cmd commands)) (while cmd (if (cdr cmd) (setcar cmd `(eshell-commands ,(car cmd)))) (setq cmd (cdr cmd)))) - (setq commands - `(progn - ,@(if top-level - '((run-hooks 'eshell-pre-command-hook))) - ,@(if (not top-level) - commands - `((catch 'top-level (progn ,@commands)) - (run-hooks 'eshell-post-command-hook))))) - (if top-level - `(eshell-commands ,commands) - commands))) + (if toplevel + `(eshell-commands (progn + (run-hooks 'eshell-pre-command-hook) + (catch 'top-level (progn ,@commands)) + (run-hooks 'eshell-post-command-hook))) + (macroexp-progn commands)))) (defun eshell-debug-command (tag subform) "Output a debugging message to '*eshell last cmd*'." @@ -473,6 +474,8 @@ the second is ignored." arg)) (defvar eshell-last-command-status) ;Define in esh-io.el. +(defvar eshell--local-vars nil + "List of locally bound vars that should take precedence over env-vars.") (defun eshell-rewrite-for-command (terms) "Rewrite a `for' command into its equivalent Eshell command form. @@ -495,7 +498,9 @@ implemented via rewriting, rather than as a function." (eshell-command-body '(nil)) (eshell-test-body '(nil))) (while (car for-items) - (let ((,(intern (cadr terms)) (car for-items))) + (let ((,(intern (cadr terms)) (car for-items)) + (eshell--local-vars (cons ',(intern (cadr terms)) + eshell--local-vars))) (eshell-protect ,(eshell-invokify-arg body t))) (setcar for-items (cadr for-items)) @@ -505,14 +510,11 @@ implemented via rewriting, rather than as a function." (list 'quote eshell-last-command-result)))))) (defun eshell-structure-basic-command (func names keyword test body - &optional else vocal-test) + &optional else) "With TERMS, KEYWORD, and two NAMES, structure a basic command. The first of NAMES should be the positive form, and the second the negative. It's not likely that users should ever need to call this -function. - -If VOCAL-TEST is non-nil, it means output from the test should be -shown, as well as output from the body." +function." ;; If the test form begins with `eshell-convert', it means ;; something data-wise will be returned, and we should let ;; that determine the truth of the statement. @@ -582,11 +584,13 @@ For an external command, it means an exit code of 0." eshell-last-command-result (= eshell-last-command-status 0))) -(defun eshell-parse-pipeline (terms &optional final-p) +(defvar eshell--cmd) + +(defun eshell-parse-pipeline (terms) "Parse a pipeline from TERMS, return the appropriate Lisp forms." - (let* (sep-terms + (let* (eshell--sep-terms (bigpieces (eshell-separate-commands terms "\\(&&\\|||\\)" - nil 'sep-terms)) + nil 'eshell--sep-terms)) (bp bigpieces) (results (list t)) final) @@ -599,8 +603,11 @@ For an external command, it means an exit code of 0." (run-hook-with-args 'eshell-pre-rewrite-command-hook cmd) (setq cmd (run-hook-with-args-until-success 'eshell-rewrite-command-hook cmd)) - (run-hook-with-args 'eshell-post-rewrite-command-hook 'cmd) - (setcar p cmd)) + (let ((eshell--cmd cmd)) + (run-hook-with-args 'eshell-post-rewrite-command-hook + 'eshell--cmd) + (setq cmd eshell--cmd)) + (setcar p (funcall eshell-post-rewrite-command-function cmd))) (setq p (cdr p))) (nconc results (list @@ -615,16 +622,15 @@ For an external command, it means an exit code of 0." results (nreverse results) final (car results) results (cdr results) - sep-terms (nreverse sep-terms)) + eshell--sep-terms (nreverse eshell--sep-terms)) (while results - (cl-assert (car sep-terms)) + (cl-assert (car eshell--sep-terms)) (setq final (eshell-structure-basic-command - 'if (string= (car sep-terms) "&&") "if" + 'if (string= (car eshell--sep-terms) "&&") "if" `(eshell-protect ,(car results)) - `(eshell-protect ,final) - nil t) + `(eshell-protect ,final)) results (cdr results) - sep-terms (cdr sep-terms))) + eshell--sep-terms (cdr eshell--sep-terms))) final)) (defun eshell-parse-subcommand-argument () @@ -650,7 +656,7 @@ For an external command, it means an exit code of 0." (looking-at eshell-lisp-regexp)) (let* ((here (point)) (obj - (condition-case err + (condition-case nil (read (current-buffer)) (end-of-file (throw 'eshell-incomplete ?\())))) @@ -912,7 +918,7 @@ at the moment are: "Completion for the `debug' command." (while (pcomplete-here '("errors" "commands")))) -(defun eshell-invoke-directly (command input) +(defun eshell-invoke-directly (command) (let ((base (cadr (nth 2 (nth 2 (cadr command))))) name) (if (and (eq (car base) 'eshell-trap-errors) (eq (car (cadr base)) 'eshell-named-command)) diff --git a/lisp/eshell/esh-ext.el b/lisp/eshell/esh-ext.el index 474e536de2e..e2cca35a267 100644 --- a/lisp/eshell/esh-ext.el +++ b/lisp/eshell/esh-ext.el @@ -1,4 +1,4 @@ -;;; esh-ext.el --- commands external to Eshell +;;; esh-ext.el --- commands external to Eshell -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -92,6 +92,10 @@ since nothing else but Eshell will be able to understand (setq list (cdr list))) file))) +;; This file provides itself then eval-when-compile loads files that require it. +;; This causes spurious "might not be defined at runtime" warnings. +(declare-function eshell-search-path "esh-ext" (name)) + (defcustom eshell-windows-shell-file (if (eshell-under-windows-p) (if (string-match "\\(cmdproxy\\|sh\\)\\.\\(com\\|exe\\)" diff --git a/lisp/eshell/esh-io.el b/lisp/eshell/esh-io.el index 4edb47e4758..90b1f8ec972 100644 --- a/lisp/eshell/esh-io.el +++ b/lisp/eshell/esh-io.el @@ -1,4 +1,4 @@ -;;; esh-io.el --- I/O management +;;; esh-io.el --- I/O management -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -118,6 +118,8 @@ from executing while Emacs is redisplaying." :type 'integer :group 'eshell-io) +(defvar x-select-enable-clipboard) ; term/common-win + (defcustom eshell-virtual-targets '(("/dev/eshell" eshell-interactive-print nil) ("/dev/kill" (lambda (mode) @@ -179,8 +181,8 @@ not be added to this variable." (make-local-variable 'eshell-current-redirections) (add-hook 'eshell-pre-rewrite-command-hook 'eshell-strip-redirections nil t) - (add-hook 'eshell-post-rewrite-command-hook - 'eshell-apply-redirections nil t)) + (add-function :filter-return (local 'eshell-post-rewrite-command-function) + #'eshell--apply-redirections)) (defun eshell-parse-redirection () "Parse an output redirection, such as '2>'." @@ -223,28 +225,27 @@ not be added to this variable." (setq eshell-current-redirections (cdr eshell-current-redirections)))) -(defun eshell-apply-redirections (cmdsym) +(defun eshell--apply-redirections (cmd) "Apply any redirection which were specified for COMMAND." (if eshell-current-redirections - (set cmdsym - (append (list 'progn) - eshell-current-redirections - (list (symbol-value cmdsym)))))) + `(progn + ,@eshell-current-redirections + ,cmd) + cmd)) (defun eshell-create-handles - (standard-output output-mode &optional standard-error error-mode) + (stdout output-mode &optional stderr error-mode) "Create a new set of file handles for a command. The default location for standard output and standard error will go to -STANDARD-OUTPUT and STANDARD-ERROR, respectively. +STDOUT and STDERR, respectively. OUTPUT-MODE and ERROR-MODE are either `overwrite', `append' or `insert'; a nil value of mode defaults to `insert'." (let ((handles (make-vector eshell-number-of-handles nil)) - (output-target (eshell-get-target standard-output output-mode)) - (error-target (eshell-get-target standard-error error-mode))) + (output-target (eshell-get-target stdout output-mode)) + (error-target (eshell-get-target stderr error-mode))) (aset handles eshell-output-handle (cons output-target 1)) - (if standard-error - (aset handles eshell-error-handle (cons error-target 1)) - (aset handles eshell-error-handle (cons output-target 1))) + (aset handles eshell-error-handle + (cons (if stderr error-target output-target) 1)) handles)) (defun eshell-protect-handles (handles) diff --git a/lisp/eshell/esh-mode.el b/lisp/eshell/esh-mode.el index ed5fecf09ff..e770c773920 100644 --- a/lisp/eshell/esh-mode.el +++ b/lisp/eshell/esh-mode.el @@ -1,4 +1,4 @@ -;;; esh-mode.el --- user interface +;;; esh-mode.el --- user interface -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -220,74 +220,67 @@ This is used by `eshell-watch-for-password-prompt'." (defvar eshell-last-output-end nil) (defvar eshell-currently-handling-window nil) -(defvar eshell-mode-syntax-table nil) -(defvar eshell-mode-abbrev-table nil) (define-abbrev-table 'eshell-mode-abbrev-table ()) -(if (not eshell-mode-syntax-table) - (let ((i 0)) - (setq eshell-mode-syntax-table (make-syntax-table)) - (while (< i ?0) - (modify-syntax-entry i "_ " eshell-mode-syntax-table) - (setq i (1+ i))) - (setq i (1+ ?9)) - (while (< i ?A) - (modify-syntax-entry i "_ " eshell-mode-syntax-table) - (setq i (1+ i))) - (setq i (1+ ?Z)) - (while (< i ?a) - (modify-syntax-entry i "_ " eshell-mode-syntax-table) - (setq i (1+ i))) - (setq i (1+ ?z)) - (while (< i 128) - (modify-syntax-entry i "_ " eshell-mode-syntax-table) - (setq i (1+ i))) - (modify-syntax-entry ? " " eshell-mode-syntax-table) - (modify-syntax-entry ?\t " " eshell-mode-syntax-table) - (modify-syntax-entry ?\f " " eshell-mode-syntax-table) - (modify-syntax-entry ?\n "> " eshell-mode-syntax-table) - ;; Give CR the same syntax as newline, for selective-display. - (modify-syntax-entry ?\^m "> " eshell-mode-syntax-table) -;;; (modify-syntax-entry ?\; "< " eshell-mode-syntax-table) - (modify-syntax-entry ?` "' " eshell-mode-syntax-table) - (modify-syntax-entry ?' "' " eshell-mode-syntax-table) - (modify-syntax-entry ?, "' " eshell-mode-syntax-table) - ;; Used to be singlequote; changed for flonums. - (modify-syntax-entry ?. "_ " eshell-mode-syntax-table) - (modify-syntax-entry ?- "_ " eshell-mode-syntax-table) - (modify-syntax-entry ?| ". " eshell-mode-syntax-table) - (modify-syntax-entry ?# "' " eshell-mode-syntax-table) - (modify-syntax-entry ?\" "\" " eshell-mode-syntax-table) - (modify-syntax-entry ?\\ "/ " eshell-mode-syntax-table) - (modify-syntax-entry ?\( "() " eshell-mode-syntax-table) - (modify-syntax-entry ?\) ")( " eshell-mode-syntax-table) - (modify-syntax-entry ?\{ "(} " eshell-mode-syntax-table) - (modify-syntax-entry ?\} "){ " eshell-mode-syntax-table) - (modify-syntax-entry ?\[ "(] " eshell-mode-syntax-table) - (modify-syntax-entry ?\] ")[ " eshell-mode-syntax-table) - ;; All non-word multibyte characters should be `symbol'. - (if (featurep 'xemacs) - (map-char-table - (function - (lambda (key val) - (and (characterp key) - (>= (char-int key) 256) - (/= (char-syntax key) ?w) - (modify-syntax-entry key "_ " - eshell-mode-syntax-table)))) - (standard-syntax-table)) - (map-char-table - (function - (lambda (key val) - (and (if (consp key) - (and (>= (car key) 128) - (/= (char-syntax (car key)) ?w)) - (and (>= key 256) - (/= (char-syntax key) ?w))) - (modify-syntax-entry key "_ " - eshell-mode-syntax-table)))) - (standard-syntax-table))))) +(defvar eshell-mode-syntax-table + (let ((st (make-syntax-table)) + (i 0)) + (while (< i ?0) + (modify-syntax-entry i "_ " st) + (setq i (1+ i))) + (setq i (1+ ?9)) + (while (< i ?A) + (modify-syntax-entry i "_ " st) + (setq i (1+ i))) + (setq i (1+ ?Z)) + (while (< i ?a) + (modify-syntax-entry i "_ " st) + (setq i (1+ i))) + (setq i (1+ ?z)) + (while (< i 128) + (modify-syntax-entry i "_ " st) + (setq i (1+ i))) + (modify-syntax-entry ? " " st) + (modify-syntax-entry ?\t " " st) + (modify-syntax-entry ?\f " " st) + (modify-syntax-entry ?\n "> " st) + ;; Give CR the same syntax as newline, for selective-display. + (modify-syntax-entry ?\^m "> " st) + ;; (modify-syntax-entry ?\; "< " st) + (modify-syntax-entry ?` "' " st) + (modify-syntax-entry ?' "' " st) + (modify-syntax-entry ?, "' " st) + ;; Used to be singlequote; changed for flonums. + (modify-syntax-entry ?. "_ " st) + (modify-syntax-entry ?- "_ " st) + (modify-syntax-entry ?| ". " st) + (modify-syntax-entry ?# "' " st) + (modify-syntax-entry ?\" "\" " st) + (modify-syntax-entry ?\\ "/ " st) + (modify-syntax-entry ?\( "() " st) + (modify-syntax-entry ?\) ")( " st) + (modify-syntax-entry ?\{ "(} " st) + (modify-syntax-entry ?\} "){ " st) + (modify-syntax-entry ?\[ "(] " st) + (modify-syntax-entry ?\] ")[ " st) + ;; All non-word multibyte characters should be `symbol'. + (map-char-table + (if (featurep 'xemacs) + (lambda (key _val) + (and (characterp key) + (>= (char-int key) 256) + (/= (char-syntax key) ?w) + (modify-syntax-entry key "_ " st))) + (lambda (key _val) + (and (if (consp key) + (and (>= (car key) 128) + (/= (char-syntax (car key)) ?w)) + (and (>= key 256) + (/= (char-syntax key) ?w))) + (modify-syntax-entry key "_ " st)))) + (standard-syntax-table)) + st)) ;;; User Functions: @@ -303,25 +296,18 @@ and the hook `eshell-exit-hook'." (run-hooks 'eshell-exit-hook)) ;;;###autoload -(defun eshell-mode () - "Emacs shell interactive mode. - -\\{eshell-mode-map}" - (kill-all-local-variables) - - (setq major-mode 'eshell-mode) - (setq mode-name "EShell") - (set (make-local-variable 'eshell-mode) t) +(define-derived-mode eshell-mode fundamental-mode "EShell" + "Emacs shell interactive mode." + (setq-local eshell-mode t) - (make-local-variable 'eshell-mode-map) - (setq eshell-mode-map (make-sparse-keymap)) + ;; FIXME: What the hell!? + (setq-local eshell-mode-map (make-sparse-keymap)) (use-local-map eshell-mode-map) (when eshell-status-in-mode-line (make-local-variable 'eshell-command-running-string) (let ((fmt (copy-sequence mode-line-format))) - (make-local-variable 'mode-line-format) - (setq mode-line-format fmt)) + (setq-local mode-line-format fmt)) (let ((mode-line-elt (memq 'mode-line-modified mode-line-format))) (if mode-line-elt (setcar mode-line-elt 'eshell-command-running-string)))) @@ -331,11 +317,9 @@ and the hook `eshell-exit-hook'." (define-key eshell-mode-map [(meta control ?l)] 'eshell-show-output) (define-key eshell-mode-map [(control ?a)] 'eshell-bol) - (set (make-local-variable 'eshell-command-prefix) - (make-symbol "eshell-command-prefix")) + (setq-local eshell-command-prefix (make-symbol "eshell-command-prefix")) (fset eshell-command-prefix (make-sparse-keymap)) - (set (make-local-variable 'eshell-command-map) - (symbol-function eshell-command-prefix)) + (setq-local eshell-command-map (symbol-function eshell-command-prefix)) (define-key eshell-mode-map [(control ?c)] eshell-command-prefix) ;; without this, find-tag complains about read-only text being @@ -359,7 +343,6 @@ and the hook `eshell-exit-hook'." (define-key eshell-command-map [(control ?y)] 'eshell-repeat-argument) (setq local-abbrev-table eshell-mode-abbrev-table) - (set-syntax-table eshell-mode-syntax-table) (set (make-local-variable 'dired-directory) default-directory) (set (make-local-variable 'list-buffers-directory) @@ -442,7 +425,6 @@ and the hook `eshell-exit-hook'." (if eshell-first-time-p (run-hooks 'eshell-first-time-mode-hook)) - (run-mode-hooks 'eshell-mode-hook) (run-hooks 'eshell-post-command-hook)) (put 'eshell-mode 'mode-class 'special) @@ -470,8 +452,8 @@ and the hook `eshell-exit-hook'." (add-hook 'pre-command-hook 'eshell-intercept-commands t t) (message "Sending subprocess input directly"))) -(defun eshell-self-insert-command (N) - (interactive "i") +(defun eshell-self-insert-command () + (interactive) (process-send-string (eshell-interactive-process) (char-to-string (if (symbolp last-command-event) @@ -689,7 +671,7 @@ newline." (run-hooks 'eshell-input-filter-functions) (and (catch 'eshell-terminal (ignore - (if (eshell-invoke-directly cmd input) + (if (eshell-invoke-directly cmd) (eval cmd) (eshell-eval-command cmd input)))) (eshell-life-is-too-much))))) @@ -944,10 +926,10 @@ a key." (custom-add-option 'eshell-output-filter-functions 'eshell-truncate-buffer) -(defun eshell-send-invisible (str) +(defun eshell-send-invisible () "Read a string without echoing. Then send it to the process running in the current buffer." - (interactive "P") ; Defeat snooping via C-x ESC ESC + (interactive) ; Don't pass str as argument, to avoid snooping via C-x ESC ESC (let ((str (read-passwd (format "%s Password: " (process-name (eshell-interactive-process)))))) @@ -969,7 +951,7 @@ This function could be in the list `eshell-output-filter-functions'." (beginning-of-line) (if (re-search-forward eshell-password-prompt-regexp eshell-last-output-end t) - (eshell-send-invisible nil))))) + (eshell-send-invisible))))) (custom-add-option 'eshell-output-filter-functions 'eshell-watch-for-password-prompt) @@ -977,32 +959,30 @@ This function could be in the list `eshell-output-filter-functions'." (defun eshell-handle-control-codes () "Act properly when certain control codes are seen." (save-excursion - (let ((orig (point))) - (goto-char eshell-last-output-block-begin) - (unless (eolp) - (beginning-of-line)) - (while (< (point) eshell-last-output-end) - (let ((char (char-after))) - (cond - ((eq char ?\r) - (if (< (1+ (point)) eshell-last-output-end) - (if (memq (char-after (1+ (point))) - '(?\n ?\r)) - (delete-char 1) - (let ((end (1+ (point)))) - (beginning-of-line) - (delete-region (point) end))) - (add-text-properties (point) (1+ (point)) - '(invisible t)) - (forward-char))) - ((eq char ?\a) - (delete-char 1) - (beep)) - ((eq char ?\C-h) - (delete-backward-char 1) - (delete-char 1)) - (t - (forward-char)))))))) + (goto-char eshell-last-output-block-begin) + (unless (eolp) + (beginning-of-line)) + (while (< (point) eshell-last-output-end) + (let ((char (char-after))) + (cond + ((eq char ?\r) + (if (< (1+ (point)) eshell-last-output-end) + (if (memq (char-after (1+ (point))) + '(?\n ?\r)) + (delete-char 1) + (let ((end (1+ (point)))) + (beginning-of-line) + (delete-region (point) end))) + (add-text-properties (point) (1+ (point)) + '(invisible t)) + (forward-char))) + ((eq char ?\a) + (delete-char 1) + (beep)) + ((eq char ?\C-h) + (delete-region (1- (point)) (1+ (point)))) + (t + (forward-char))))))) (custom-add-option 'eshell-output-filter-functions 'eshell-handle-control-codes) diff --git a/lisp/eshell/esh-module.el b/lisp/eshell/esh-module.el index 5008ef705db..181d08f8a1d 100644 --- a/lisp/eshell/esh-module.el +++ b/lisp/eshell/esh-module.el @@ -1,4 +1,4 @@ -;;; esh-module.el --- Eshell modules +;;; esh-module.el --- Eshell modules -*- lexical-binding:t -*- ;; Copyright (C) 1999-2000, 2002-2013 Free Software Foundation, Inc. diff --git a/lisp/eshell/esh-opt.el b/lisp/eshell/esh-opt.el index 33625433022..3f5bcb641ac 100644 --- a/lisp/eshell/esh-opt.el +++ b/lisp/eshell/esh-opt.el @@ -1,4 +1,4 @@ -;;; esh-opt.el --- command options processing +;;; esh-opt.el --- command options processing -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -28,11 +28,11 @@ (require 'esh-ext) ;; Unused. -;;; (defgroup eshell-opt nil -;;; "The options processing code handles command argument parsing for -;;; Eshell commands implemented in Lisp." -;;; :tag "Command options processing" -;;; :group 'eshell) +;; (defgroup eshell-opt nil +;; "The options processing code handles command argument parsing for +;; Eshell commands implemented in Lisp." +;; :tag "Command options processing" +;; :group 'eshell) ;;; User Functions: @@ -98,50 +98,44 @@ the new process for its value. Lastly, any remaining arguments will be available in a locally interned variable `args' (created using a `let' form)." (declare (debug (form form sexp body))) - `(let ((temp-args - ,(if (memq ':preserve-args (cadr options)) - macro-args - (list 'eshell-stringify-list - (list 'eshell-flatten-list macro-args))))) - (let ,(append (delq nil (mapcar (lambda (opt) - (and (listp opt) (nth 3 opt))) - (cadr options))) - '(usage-msg last-value ext-command args)) - ;; FIXME: `options' ends up hiding some variable names under `quote', - ;; which is incompatible with lexical scoping!! - (eshell-do-opt ,name ,options (lambda () ,@body-forms))))) + `(let* ((temp-args + ,(if (memq ':preserve-args (cadr options)) + macro-args + (list 'eshell-stringify-list + (list 'eshell-flatten-list macro-args)))) + (processed-args (eshell--do-opts ,name ,options temp-args)) + ,@(delete-dups + (delq nil (mapcar (lambda (opt) + (and (listp opt) (nth 3 opt) + `(,(nth 3 opt) (pop processed-args)))) + ;; `options' is of the form (quote OPTS). + (cadr options)))) + (args processed-args)) + ,@body-forms)) ;;; Internal Functions: -(defvar temp-args) -(defvar last-value) -(defvar usage-msg) -(defvar ext-command) ;; Documented part of the interface; see eshell-eval-using-options. -(defvar args) +(defvar eshell--args) -(defun eshell-do-opt (name options body-fun) +(defun eshell--do-opts (name options args) "Helper function for `eshell-eval-using-options'. This code doesn't really need to be macro expanded everywhere." - (setq args temp-args) - (if (setq - ext-command - (catch 'eshell-ext-command - (when (setq - usage-msg - (catch 'eshell-usage - (setq last-value nil) - (if (and (= (length args) 0) - (memq ':show-usage options)) - (throw 'eshell-usage - (eshell-show-usage name options))) - (setq args (eshell-process-args name args options) - last-value (funcall body-fun)) - nil)) - (error "%s" usage-msg)))) - (throw 'eshell-external - (eshell-external-command ext-command args)) - last-value)) + (let ((ext-command + (catch 'eshell-ext-command + (let ((usage-msg + (catch 'eshell-usage + (if (and (= (length args) 0) + (memq ':show-usage options)) + (eshell-show-usage name options) + (setq args (eshell--process-args name args options)) + nil)))) + (when usage-msg + (error "%s" usage-msg)))))) + (if ext-command + (throw 'eshell-external + (eshell-external-command ext-command args)) + args))) (defun eshell-show-usage (name options) "Display the usage message for NAME, using OPTIONS." @@ -190,22 +184,24 @@ passed to this command, the external version '%s' will be called instead." extcmd))))) (throw 'eshell-usage usage))) -(defun eshell-set-option (name ai opt options) +(defun eshell--set-option (name ai opt options opt-vals) "Using NAME's remaining args (index AI), set the OPT within OPTIONS. If the option consumes an argument for its value, the argument list will be modified." (if (not (nth 3 opt)) (eshell-show-usage name options) - (if (eq (nth 2 opt) t) - (if (> ai (length args)) - (error "%s: missing option argument" name) - (set (nth 3 opt) (nth ai args)) - (if (> ai 0) - (setcdr (nthcdr (1- ai) args) (nthcdr (1+ ai) args)) - (setq args (cdr args)))) - (set (nth 3 opt) (or (nth 2 opt) t))))) - -(defun eshell-process-option (name switch kind ai options) + (setcdr (assq (nth 3 opt) opt-vals) + (if (eq (nth 2 opt) t) + (if (> ai (length eshell--args)) + (error "%s: missing option argument" name) + (prog1 (nth ai eshell--args) + (if (> ai 0) + (setcdr (nthcdr (1- ai) eshell--args) + (nthcdr (1+ ai) eshell--args)) + (setq eshell--args (cdr eshell--args))))) + (or (nth 2 opt) t))))) + +(defun eshell--process-option (name switch kind ai options opt-vals) "For NAME, process SWITCH (of type KIND), from args at index AI. The SWITCH will be looked up in the set of OPTIONS. @@ -223,7 +219,7 @@ switch is unrecognized." (nth kind (car opts)) (equal switch (nth kind (car opts)))) (progn - (eshell-set-option name ai (car opts) options) + (eshell--set-option name ai (car opts) options opt-vals) (setq found t opts nil)) (setq opts (cdr opts)))) (unless found @@ -232,14 +228,22 @@ switch is unrecognized." (setq extcmd (eshell-search-path (cadr extcmd))) (if extcmd (throw 'eshell-ext-command extcmd) - (if (characterp switch) - (error "%s: unrecognized option -%c" name switch) - (error "%s: unrecognized option --%s" name switch)))))))) - -(defun eshell-process-args (name args options) - "Process the given ARGS using OPTIONS. -This assumes that symbols have been intern'd by `eshell-eval-using-options'." - (let ((ai 0) arg) + (error (if (characterp switch) "%s: unrecognized option -%c" + "%s: unrecognized option --%s") + name switch))))))) + +(defun eshell--process-args (name args options) + "Process the given ARGS using OPTIONS." + (let* ((seen ()) + (opt-vals (delq nil (mapcar (lambda (opt) + (when (listp opt) + (let ((sym (nth 3 opt))) + (when (and sym (not (memq sym seen))) + (push sym seen) + (list sym))))) + options))) + (ai 0) arg + (eshell--args args)) (while (< ai (length args)) (setq arg (nth ai args)) (if (not (and (stringp arg) @@ -252,13 +256,14 @@ This assumes that symbols have been intern'd by `eshell-eval-using-options'." (setcdr (nthcdr (1- ai) args) (nthcdr (1+ ai) args))) (if dash (if (> (length switch) 0) - (eshell-process-option name switch 1 ai options) + (eshell--process-option name switch 1 ai options opt-vals) (setq ai (length args))) (let ((len (length switch)) (index 0)) (while (< index len) - (eshell-process-option name (aref switch index) 0 ai options) - (setq index (1+ index))))))))) - args) + (eshell--process-option name (aref switch index) + 0 ai options opt-vals) + (setq index (1+ index)))))))) + (nconc (mapcar #'cdr opt-vals) args))) ;;; esh-opt.el ends here diff --git a/lisp/eshell/esh-proc.el b/lisp/eshell/esh-proc.el index 171d70c0772..ab7fd349893 100644 --- a/lisp/eshell/esh-proc.el +++ b/lisp/eshell/esh-proc.el @@ -1,4 +1,4 @@ -;;; esh-proc.el --- process management +;;; esh-proc.el --- process management -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -116,9 +116,11 @@ information, for example." (defun eshell-kill-process-function (proc status) "Function run when killing a process. Runs `eshell-reset-after-proc' and `eshell-kill-hook', passing arguments -PROC and STATUS to both." - (or (memq 'eshell-reset-after-proc eshell-kill-hook) - (eshell-reset-after-proc proc status)) +PROC and STATUS to functions on the latter." + ;; Was there till 24.1, but it is not optional. + (if (memq 'eshell-reset-after-proc eshell-kill-hook) + (setq eshell-kill-hook (delq 'eshell-reset-after-proc eshell-kill-hook))) + (eshell-reset-after-proc status) (run-hook-with-args 'eshell-kill-hook proc status)) (defun eshell-proc-initialize () @@ -133,7 +135,7 @@ PROC and STATUS to both." ; (define-key eshell-command-map [(control ?z)] 'eshell-stop-process) (define-key eshell-command-map [(control ?\\)] 'eshell-quit-process)) -(defun eshell-reset-after-proc (proc status) +(defun eshell-reset-after-proc (status) "Reset the command input location after a process terminates. The signals which will cause this to happen are matched by `eshell-reset-signals'." diff --git a/lisp/eshell/esh-util.el b/lisp/eshell/esh-util.el index dd344eb50a2..4d53b3fb86d 100644 --- a/lisp/eshell/esh-util.el +++ b/lisp/eshell/esh-util.el @@ -1,4 +1,4 @@ -;;; esh-util.el --- general utilities +;;; esh-util.el --- general utilities -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -23,6 +23,8 @@ ;;; Code: +(eval-when-compile (require 'cl-lib)) + (defgroup eshell-util nil "This is general utility code, meant for use by Eshell itself." :tag "General utilities" @@ -142,7 +144,7 @@ function `string-to-number'." Otherwise, evaluates FORM with no error handling." (declare (indent 2)) (if eshell-handle-errors - `(condition-case ,tag + `(condition-case-unless-debug ,tag ,form ,@handlers) form)) @@ -215,8 +217,7 @@ then quoting is done by a backslash, rather than a doubled delimiter." (defun eshell-sublist (l &optional n m) "Return from LIST the N to M elements. If N or M is nil, it means the end of the list." - (let* ((a (copy-sequence l)) - result) + (let ((a (copy-sequence l))) (if (and m (consp (nthcdr m a))) (setcdr (nthcdr m a) nil)) (if n @@ -476,20 +477,20 @@ list." (defalias 'eshell-user-name 'user-login-name) (defun eshell-read-hosts-file (filename) - "Read in the hosts from the /etc/hosts file." + "Read in the hosts from FILENAME, default `eshell-hosts-file'." (let (hosts) (with-temp-buffer - (insert-file-contents eshell-hosts-file) + (insert-file-contents (or filename eshell-hosts-file)) (goto-char (point-min)) (while (re-search-forward "^\\([^#[:space:]]+\\)\\s-+\\(\\S-+\\)\\(\\s-*\\(\\S-+\\)\\)?" nil t) (if (match-string 1) - (add-to-list 'hosts (match-string 1))) + (cl-pushnew (match-string 1) hosts :test #'equal)) (if (match-string 2) - (add-to-list 'hosts (match-string 2))) + (cl-pushnew (match-string 2) hosts :test #'equal)) (if (match-string 4) - (add-to-list 'hosts (match-string 4))))) - (sort hosts 'string-lessp))) + (cl-pushnew (match-string 4) hosts :test #'equal)))) + (sort hosts #'string-lessp))) (defun eshell-read-hosts (file result-var timestamp-var) "Read the contents of /etc/passwd for user names." @@ -560,9 +561,13 @@ Unless optional argument INPLACE is non-nil, return a new string." (substring string 0 sublen) string))) +(defvar ange-cache) + +;; Partial reimplementation of Emacs's builtin directory-files-and-attributes. +;; id-format not implemented. (and (featurep 'xemacs) (not (fboundp 'directory-files-and-attributes)) - (defun directory-files-and-attributes (directory &optional full match nosort id-format) + (defun directory-files-and-attributes (directory &optional full match nosort _id-format) "Return a list of names of files and their attributes in DIRECTORY. There are three optional arguments: If FULL is non-nil, return absolute file names. Otherwise return names @@ -577,8 +582,6 @@ If NOSORT is non-nil, the list is not sorted--its order is unpredictable. (cons file (eshell-file-attributes (expand-file-name file directory))))) (directory-files directory full match nosort))))) -(defvar ange-cache) - (defun eshell-directory-files-and-attributes (dir &optional full match nosort id-format) "Make sure to use the handler for `directory-file-and-attributes'." (let* ((dir (expand-file-name dir))) diff --git a/lisp/eshell/esh-var.el b/lisp/eshell/esh-var.el index 188b8165248..3121dadace2 100644 --- a/lisp/eshell/esh-var.el +++ b/lisp/eshell/esh-var.el @@ -1,4 +1,4 @@ -;;; esh-var.el --- handling of variables +;;; esh-var.el --- handling of variables -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -184,9 +184,9 @@ if they are quoted with a backslash." indices))))) "This list provides aliasing for variable references. It is very similar in concept to what `eshell-user-aliases-list' does -for commands. Each member of this defines defines the name of a -command, and the Lisp value to return for that variable if it is -accessed via the syntax '$NAME'. +for commands. Each member of this defines the name of a command, +and the Lisp value to return for that variable if it is accessed +via the syntax '$NAME'. If the value is a function, that function will be called with two arguments: the list of the indices that was used in the reference, and @@ -395,12 +395,9 @@ process any indices that come after the variable reference." indices (and (not (eobp)) (eq (char-after) ?\[) (eshell-parse-indices)) - value (list 'let - (list (list 'indices - (list 'quote indices))) - value)) + value `(let ((indices ',indices)) ,value)) (if get-len - (list 'length value) + `(length ,value) value))) (defun eshell-parse-variable-ref () @@ -414,67 +411,68 @@ Possible options are: <LONG-NAME> disambiguates the length of the name {COMMAND} result of command is variable's value (LISP-FORM) result of Lisp form is variable's value" - (let (end) - (cond - ((eq (char-after) ?{) - (let ((end (eshell-find-delimiter ?\{ ?\}))) - (if (not end) - (throw 'eshell-incomplete ?\{) - (prog1 - (list 'eshell-convert - (list 'eshell-command-to-value - (list 'eshell-as-subcommand - (eshell-parse-command - (cons (1+ (point)) end))))) - (goto-char (1+ end)))))) - ((memq (char-after) '(?\' ?\")) - (let ((name (if (eq (char-after) ?\') - (eshell-parse-literal-quote) - (eshell-parse-double-quote)))) - (if name + (cond + ((eq (char-after) ?{) + (let ((end (eshell-find-delimiter ?\{ ?\}))) + (if (not end) + (throw 'eshell-incomplete ?\{) + (prog1 + (list 'eshell-convert + (list 'eshell-command-to-value + (list 'eshell-as-subcommand + (eshell-parse-command + (cons (1+ (point)) end))))) + (goto-char (1+ end)))))) + ((memq (char-after) '(?\' ?\")) + (let ((name (if (eq (char-after) ?\') + (eshell-parse-literal-quote) + (eshell-parse-double-quote)))) + (if name (list 'eshell-get-variable (eval name) 'indices)))) - ((eq (char-after) ?\<) - (let ((end (eshell-find-delimiter ?\< ?\>))) - (if (not end) - (throw 'eshell-incomplete ?\<) - (let* ((temp (make-temp-file temporary-file-directory)) - (cmd (concat (buffer-substring (1+ (point)) end) - " > " temp))) - (prog1 - (list - 'let (list (list 'eshell-current-handles - (list 'eshell-create-handles temp - (list 'quote 'overwrite)))) - (list - 'progn - (list 'eshell-as-subcommand - (eshell-parse-command cmd)) - (list 'ignore - (list 'nconc 'eshell-this-command-hook - (list 'list - (list 'function - (list 'lambda nil - (list 'delete-file temp)))))) - (list 'quote temp))) - (goto-char (1+ end))))))) - ((eq (char-after) ?\() - (condition-case err - (list 'eshell-command-to-value - (list 'eshell-lisp-command - (list 'quote (read (current-buffer))))) - (end-of-file - (throw 'eshell-incomplete ?\()))) - ((assoc (char-to-string (char-after)) - eshell-variable-aliases-list) - (forward-char) - (list 'eshell-get-variable - (char-to-string (char-before)) 'indices)) - ((looking-at eshell-variable-name-regexp) - (prog1 - (list 'eshell-get-variable (match-string 0) 'indices) - (goto-char (match-end 0)))) - (t - (error "Invalid variable reference"))))) + ((eq (char-after) ?\<) + (let ((end (eshell-find-delimiter ?\< ?\>))) + (if (not end) + (throw 'eshell-incomplete ?\<) + (let* ((temp (make-temp-file temporary-file-directory)) + (cmd (concat (buffer-substring (1+ (point)) end) + " > " temp))) + (prog1 + (list + 'let (list (list 'eshell-current-handles + (list 'eshell-create-handles temp + (list 'quote 'overwrite)))) + (list + 'progn + (list 'eshell-as-subcommand + (eshell-parse-command cmd)) + (list 'ignore + (list 'nconc 'eshell-this-command-hook + (list 'list + (list 'function + (list 'lambda nil + (list 'delete-file temp)))))) + (list 'quote temp))) + (goto-char (1+ end))))))) + ((eq (char-after) ?\() + (condition-case nil + (list 'eshell-command-to-value + (list 'eshell-lisp-command + (list 'quote (read (current-buffer))))) + (end-of-file + (throw 'eshell-incomplete ?\()))) + ((assoc (char-to-string (char-after)) + eshell-variable-aliases-list) + (forward-char) + (list 'eshell-get-variable + (char-to-string (char-before)) 'indices)) + ((looking-at eshell-variable-name-regexp) + (prog1 + (list 'eshell-get-variable (match-string 0) 'indices) + (goto-char (match-end 0)))) + (t + (error "Invalid variable reference")))) + +(defvar eshell-glob-function) (defun eshell-parse-indices () "Parse and return a list of list of indices." @@ -504,6 +502,7 @@ Possible options are: (let ((sym (intern-soft var))) (if (and sym (boundp sym) (or eshell-prefer-lisp-variables + (memq sym eshell--local-vars) ; bug#15372 (not (getenv var)))) (symbol-value sym) (getenv var)))) diff --git a/lisp/eshell/eshell.el b/lisp/eshell/eshell.el index 9bdf8b3eb68..47078d142d5 100644 --- a/lisp/eshell/eshell.el +++ b/lisp/eshell/eshell.el @@ -1,4 +1,4 @@ -;;; eshell.el --- the Emacs command shell +;;; eshell.el --- the Emacs command shell -*- lexical-binding:t -*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -300,7 +300,7 @@ buffer selected (or created)." (get-buffer-create eshell-buffer-name))))) (cl-assert (and buf (buffer-live-p buf))) (pop-to-buffer-same-window buf) - (unless (eq major-mode 'eshell-mode) + (unless (derived-mode-p 'eshell-mode) (eshell-mode)) buf)) diff --git a/lisp/faces.el b/lisp/faces.el index f5957d9dbad..b6e85e96276 100644 --- a/lisp/faces.el +++ b/lisp/faces.el @@ -1921,6 +1921,11 @@ Return nil if there is no face." ;;; Frame creation. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(declare-function x-display-list "xfns.c" ()) +(declare-function x-open-connection "xfns.c" + (display &optional xrm-string must-succeed)) +(declare-function x-get-resource "frame.c" + (attribute class &optional component subclass)) (declare-function x-parse-geometry "frame.c" (string)) (defvar x-display-name) diff --git a/lisp/files.el b/lisp/files.el index f9ff3c936bd..ab62be295f0 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -2269,6 +2269,10 @@ since only a single case-insensitive search through the alist is made." ;; .PROCESSORNAME-gdbinit so that the host and target gdbinit files ;; don't interfere with each other. ("/\\.[a-z0-9-]*gdbinit" . gdb-script-mode) + ;; GDB 7.5 introduced OBJFILE-gdb.gdb script files; e.g. a file + ;; named 'emacs-gdb.gdb', if it exists, will be automatically + ;; loaded when GDB reads an objfile called 'emacs'. + ("-gdb\\.gdb" . gdb-script-mode) ("[cC]hange\\.?[lL]og?\\'" . change-log-mode) ("[cC]hange[lL]og[-.][0-9]+\\'" . change-log-mode) ("\\$CHANGE_LOG\\$\\.TXT" . change-log-mode) @@ -2447,35 +2451,21 @@ and `magic-mode-alist', which determines modes based on file contents.") (mapcar (lambda (l) (cons (purecopy (car l)) (cdr l))) - '(("perl" . perl-mode) - ("perl5" . perl-mode) - ("miniperl" . perl-mode) - ("wish" . tcl-mode) - ("wishx" . tcl-mode) - ("tcl" . tcl-mode) - ("tclsh" . tcl-mode) + '(("\\(mini\\)?perl5?" . perl-mode) + ("wishx?" . tcl-mode) + ("tcl\\(sh\\)?" . tcl-mode) ("expect" . tcl-mode) + ("octave" . octave-mode) ("scm" . scheme-mode) - ("ash" . sh-mode) - ("bash" . sh-mode) - ("bash2" . sh-mode) - ("csh" . sh-mode) - ("dtksh" . sh-mode) + ("[acjkwz]sh" . sh-mode) + ("r?bash2?" . sh-mode) + ("\\(dt\\|pd\\|w\\)ksh" . sh-mode) ("es" . sh-mode) - ("itcsh" . sh-mode) - ("jsh" . sh-mode) - ("ksh" . sh-mode) + ("i?tcsh" . sh-mode) ("oash" . sh-mode) - ("pdksh" . sh-mode) - ("rbash" . sh-mode) ("rc" . sh-mode) ("rpm" . sh-mode) - ("sh" . sh-mode) - ("sh5" . sh-mode) - ("tcsh" . sh-mode) - ("wksh" . sh-mode) - ("wsh" . sh-mode) - ("zsh" . sh-mode) + ("sh5?" . sh-mode) ("tail" . text-mode) ("more" . text-mode) ("less" . text-mode) @@ -2486,9 +2476,10 @@ and `magic-mode-alist', which determines modes based on file contents.") ("emacs" . emacs-lisp-mode))) "Alist mapping interpreter names to major modes. This is used for files whose first lines match `auto-mode-interpreter-regexp'. -Each element looks like (INTERPRETER . MODE). -If INTERPRETER matches the name of the interpreter specified in the first line -of a script, mode MODE is enabled. +Each element looks like (REGEXP . MODE). +If \\\\`REGEXP\\\\' matches the name (minus any directory part) of +the interpreter specified in the first line of a script, enable +major mode MODE. See also `auto-mode-alist'.") @@ -2683,19 +2674,23 @@ we don't actually set it to the same mode the buffer already has." ;; If we didn't, look for an interpreter specified in the first line. ;; As a special case, allow for things like "#!/bin/env perl", which ;; finds the interpreter anywhere in $PATH. - (unless done - (setq mode (save-excursion - (goto-char (point-min)) - (if (looking-at auto-mode-interpreter-regexp) - (match-string 2) - "")) - ;; Map interpreter name to a mode, signaling we're done at the - ;; same time. - done (assoc (file-name-nondirectory mode) - interpreter-mode-alist)) - ;; If we found an interpreter mode to use, invoke it now. - (if done - (set-auto-mode-0 (cdr done) keep-mode-if-same))) + (and (not done) + (setq mode (save-excursion + (goto-char (point-min)) + (if (looking-at auto-mode-interpreter-regexp) + (match-string 2)))) + ;; Map interpreter name to a mode, signaling we're done at the + ;; same time. + (setq done (assoc-default + (file-name-nondirectory mode) + (mapcar (lambda (e) + (cons + (format "\\`%s\\'" (car e)) + (cdr e))) + interpreter-mode-alist) + #'string-match-p)) + ;; If we found an interpreter mode to use, invoke it now. + (set-auto-mode-0 done keep-mode-if-same)) ;; Next try matching the buffer beginning against magic-mode-alist. (unless done (if (setq done (save-excursion @@ -3647,21 +3642,17 @@ FILE is the name of the file holding the variables to apply. The new class name is the same as the directory in which FILE is found. Returns the new class name." (with-temp-buffer - ;; This is with-demoted-errors, but we want to mention dir-locals - ;; in any error message. - (condition-case err - (progn - (insert-file-contents file) - (unless (zerop (buffer-size)) - (let* ((dir-name (file-name-directory file)) - (class-name (intern dir-name)) - (variables (let ((read-circle nil)) - (read (current-buffer))))) - (dir-locals-set-class-variables class-name variables) - (dir-locals-set-directory-class dir-name class-name - (nth 5 (file-attributes file))) - class-name))) - (error (message "Error reading dir-locals: %S" err) nil)))) + (with-demoted-errors "Error reading dir-locals: %S" + (insert-file-contents file) + (unless (zerop (buffer-size)) + (let* ((dir-name (file-name-directory file)) + (class-name (intern dir-name)) + (variables (let ((read-circle nil)) + (read (current-buffer))))) + (dir-locals-set-class-variables class-name variables) + (dir-locals-set-directory-class dir-name class-name + (nth 5 (file-attributes file))) + class-name))))) (defcustom enable-remote-dir-locals nil "Non-nil means dir-local variables will be applied to remote files." diff --git a/lisp/follow.el b/lisp/follow.el index 2c9365b2ba6..32411914a19 100644 --- a/lisp/follow.el +++ b/lisp/follow.el @@ -1,6 +1,6 @@ ;;; follow.el --- synchronize windows showing the same buffer -;; Copyright (C) 1995-1997, 1999, 2001-2013 Free Software Foundation, -;; Inc. + +;; Copyright (C) 1995-1997, 1999, 2001-2013 Free Software Foundation, Inc. ;; Author: Anders Lindgren <andersl@andersl.com> ;; Maintainer: FSF (Anders' email bounces, Sep 2005) @@ -1299,6 +1299,12 @@ non-first windows in Follow mode." ;; This handles the case where the user drags the scroll bar of a ;; non-selected window whose buffer is in Follow mode. +(declare-function scroll-bar-toolkit-scroll "scroll-bar" (event)) +(declare-function scroll-bar-drag "scroll-bar" (event)) +(declare-function scroll-bar-scroll-up "scroll-bar" (event)) +(declare-function scroll-bar-scroll-down "scroll-bar" (event)) +(declare-function mwheel-scroll "mwheel" (event)) + (defun follow-scroll-bar-toolkit-scroll (event) (interactive "e") (scroll-bar-toolkit-scroll event) diff --git a/lisp/frame.el b/lisp/frame.el index 3668f24ba01..8e336629123 100644 --- a/lisp/frame.el +++ b/lisp/frame.el @@ -590,6 +590,8 @@ The functions are run with one arg, the newly created frame.") ;; FIXME: Shouldn't we add `font' here as well? "Parameters `make-frame' copies from the `selected-frame' to the new frame.") +(defvar x-display-name) + (defun make-frame (&optional parameters) "Return a newly created frame displaying the current buffer. Optional argument PARAMETERS is an alist of frame parameters for @@ -759,7 +761,7 @@ the user during startup." (nreverse frame-initial-geometry-arguments)) (cdr param-list)) -(declare-function x-focus-frame "xfns.c" (frame)) +(declare-function x-focus-frame "frame.c" (frame)) (defun select-frame-set-input-focus (frame &optional norecord) "Select FRAME, raise it, and set input focus, if possible. @@ -889,6 +891,9 @@ e.g. (mapc 'frame-set-background-mode (frame-list))." (declare-function x-get-resource "frame.c" (attribute class &optional component subclass)) +;; Only used if window-system is not null. +(declare-function x-display-grayscale-p "xfns.c" (&optional terminal)) + (defvar inhibit-frame-set-background-mode nil) (defun frame-set-background-mode (frame &optional keep-face-specs) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index c75588536a4..6d718e7c8f9 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,3 +1,129 @@ +2013-09-18 Glenn Morris <rgm@gnu.org> + + * gnus-util.el (image-size): Declare. + +2013-09-17 Katsumi Yamaoka <yamaoka@jpl.org> + + * gnus-icalendar.el (gnus-icalendar-event--find-attendee) + (gnus-icalendar-event-from-ical) + (gnus-icalendar-event--build-reply-event-body) + (gnus-icalendar-event-reply-from-buffer) + (gnus-icalendar-find-org-event-file) + (gnus-icalendar-event->gnus-calendar, gnus-icalendar-reply) + (gnus-icalendar-mm-inline): Use gmm-labels instead of labels or flet. + + * mm-util.el (mm-special-display-p): Isolate XEmacs stuff. + +2013-09-17 Stefan Monnier <monnier@iro.umontreal.ca> + + * gnus-salt.el (gnus-tree-mode): Use define-derived-mode. + Use save-current-buffer. + (gnus-tree-mode-map): Initialize in the declaration. + (gnus-pick-mouse-pick-region): Remove unused var `fun'. + (scroll-in-place): Defvar it. + (gnus-tmp-*): Defvar them. + (gnus-get-tree-buffer): Use derived-mode-p. + (gnus--let-eval): New macro. + (gnus-tree-highlight-node): Use it to avoid dynamic binding of + non-prefixed variables. + (gnus-tree-open, gnus-tree-close): Remove unused arg `group'. + + * gnus-sum.el (gnus-summary-highlight): Remove `below' from the list of + vars since it doesn't seem to be available. + (gnus-set-global-variables, gnus-summary-read-group-1) + (gnus-select-newsgroup, gnus-handle-ephemeral-exit) + (gnus-summary-display-article, gnus-summary-select-article) + (gnus-summary-next-article, gnus-offer-save-summaries) + (gnus-summary-generic-mark): Use derived-mode-p. + (gnus-summary-read-group-1, gnus-summary-exit) + (gnus-summary-exit-no-update, gnus-kill-or-deaden-summary): + Adjust calls to gnus-tree-close and gnus-tree-open. + + * gnus-eform.el (gnus-edit-form-mode): Use define-derived-mode. + + * gnus-agent.el (gnus-category-mode): Use define-derived-mode. + (gnus-agent-mode): Use derived-mode-p. + (gnus-agent-rename-group, gnus-agent-delete-group): Don't bind + gnus-command-method and *-command-method to nil, but bind + gnus-command-method to *-command-method instead! + (gnus-agent-fetch-articles): Remove unused var `id'. + (gnus-agent-fetch-headers): Remove unused arg `force'. + (gnus-agent-braid-nov): Remove unused arg `group'. Adjust callers. + (gnus-agent-save-alist, gnus-agent-save-local): Remove unused `item'. + (gnus-agent-short-article, gnus-agent-long-article) + (gnus-agent-low-score, gnus-agent-high-score): Move declaration before + first use. + (gnus-agent-fetch-group-1): Remove unused vars `arts', `category', + `score-param'. + (gnus-tmp-name, gnus-tmp-groups): Defvar them. + (gnus-get-predicate): Push in front of the cache, rather than end. + (gnus-agent-expire-current-dirs, gnus-agent-expire-stats): Defvar them. + (gnus-agent-expire-group-1): Use push. Don't abuse dyn-binding. + (gnus-agent-expire-unagentized-dirs): Don't rebind + gnus-agent-expire-current-dirs since the defvar silences the warning. + (gnus-agent-retrieve-headers): Remove unused var `cached-articles'. + (gnus-agent-regenerate-group): Remove unused vars `point' and `dl'. + (gnus-agent-regenerate): Simplify interactive spec and doc. + +2013-09-17 Katsumi Yamaoka <yamaoka@jpl.org> + + * gnus-int.el (gnus-open-server): Silence compiler. + + * mm-decode.el (mm-add-meta-html-tag): Fix regexp matching meta tag. + + * message.el (message-display-completion-list): Abolish. + (message-completion-in-region): Use display-completion-list. + +2013-09-17 Glenn Morris <rgm@gnu.org> + + * gnus-util.el (gnus-message-with-timestamp-1): + Use `messages-buffer' function if available. Ignore read-only. + +2013-09-16 Katsumi Yamaoka <yamaoka@jpl.org> + + * message.el (message-expand-group, message-completion-in-region): + Correct the order of start and end of a region. + +2013-09-13 Glenn Morris <rgm@gnu.org> + + * mml2015.el (gnus-create-image): Autoload it. + + * gnus-spec.el (gnus-xmas-format): Fix weird error call. + + * gnus-html.el (declare-function): Add compat stub for ancient Emacs. + (image-size): Declare. + +2013-09-12 Glenn Morris <rgm@gnu.org> + + * gnus-icalendar.el (gnus-icalendar-event--build-reply-event-body): + Avoid using `find', which i) might not be defined at runtime; + ii) does not work, since its default test is eql, not equal. + (gnus-mime-action-alist): Declare. + +2013-09-11 Stefan Monnier <monnier@iro.umontreal.ca> + + * score-mode.el (gnus-score-mode-map): Move initialization + into declaration. + (gnus-score-mode): Use define-derived-mode. + * gnus-srvr.el (gnus-browse-mode): Use define-derived-mode. + * gnus-kill.el (gnus-kill-file-mode-map): Move initialization + into declaration. + (gnus-kill-file-mode): Use define-derived-mode. + (gnus-kill-file-edit-file, gnus-kill-file-enter-kill, gnus-kill): + Use derived-mode-p. + * gnus-group.el (gnus-group-mode): Use define-derived-mode. + (gnus-group-setup-buffer, gnus-group-name-at-point) + (gnus-group-make-web-group, gnus-group-enter-directory) + (gnus-group-suspend): Use derived-mode-p. + * gnus-cus.el (gnus-custom-mode): Use define-derived-mode. + * gnus-bookmark.el (gnus-bookmark-bmenu-mode): Use define-derived-mode. + * gnus-art.el (gnus-article-mode): Use define-derived-mode. + (gnus-article-setup-buffer, gnus-article-prepare) + (gnus-article-prepare-display, gnus-sticky-article) + (gnus-kill-sticky-article-buffer, gnus-kill-sticky-article-buffers) + (gnus-bind-safe-url-regexp, gnus-article-check-buffer) + (gnus-article-read-summary-keys): Use derived-mode-p. + 2013-08-28 Katsumi Yamaoka <yamaoka@jpl.org> * mm-decode.el (mm-temp-files-delete): Fix file deletion logic. @@ -177,15 +303,15 @@ 2013-07-10 David Engster <deng@randomsample.de> * gnus-start.el (gnus-clean-old-newsrc): Always remove 'unexist' marks - if `gnus-newsrc-file-version' does not match `gnus-version'. This - fixes a bug in Emacs trunk where the 'unexist' marks were always + if `gnus-newsrc-file-version' does not match `gnus-version'. + This fixes a bug in Emacs trunk where the 'unexist' marks were always removed at startup because "Gnus v5.13" was considered smaller than "Ma Gnus v0.03". 2013-07-10 Tassilo Horn <tsdh@gnu.org> - * gnus.el (gnus-summary-line-format): Reference - `gnus-user-date-format-alist' for the &user-date; format, not + * gnus.el (gnus-summary-line-format): + Reference `gnus-user-date-format-alist' for the &user-date; format, not `gnus-summary-user-date-format-alist'. 2013-07-08 Lars Magne Ingebrigtsen <larsi@gnus.org> @@ -467,7 +593,7 @@ * shr.el (shr-render-td): Support horizontal alignment. - * eww.el (eww-put-color): Removed. + * eww.el (eww-put-color): Remove. (eww-colorize-region): Use `add-face-text-property'. * shr.el (shr-add-font): Append face data, so that we get the correct @@ -522,7 +648,7 @@ 2013-06-16 Rüdiger Sonderfeld <ruediger@c-plusplus.de> - * shr.el (shr-dom-to-xml): Fixed function call. + * shr.el (shr-dom-to-xml): Fix function call. * eww.el (eww): New group. (eww-header-line-format): New custom variable. @@ -558,8 +684,8 @@ (auth-source-netrc-parse): Refactor and improve netrc parser to support single-quoted strings and multiline entries. (auth-source-netrc-parse-next-interesting) - (auth-source-netrc-parse-one, auth-source-netrc-parse-entries): New - functions to support parser. + (auth-source-netrc-parse-one, auth-source-netrc-parse-entries): + New functions to support parser. 2013-06-14 Lars Magne Ingebrigtsen <larsi@gnus.org> @@ -707,8 +833,8 @@ * registry.el (initialize-instance, registry-lookup) (registry-lookup-breaks-before-lexbind, registry-lookup-secondary) (registry-lookup-secondary-value, registry-search, registry-delete) - (registry-insert, registry-reindex, registry-size, registry-prune): Do - not wrap methods in `eval-and-compile'. This breaks due to latest + (registry-insert, registry-reindex, registry-size, registry-prune): + Do not wrap methods in `eval-and-compile'. This breaks due to latest changes in EIEIO (introduction of eieio-core.el). 2013-05-30 Glenn Morris <rgm@gnu.org> @@ -988,8 +1114,8 @@ 2013-03-26 Andrew Cohen <cohen@bu.edu> * nnir.el: Major rewrite. Cleaner separation between searches and group - management. Marks are now shown in nnir summary buffers. Rudimentary - support for real (i.e. not ephemeral) nnir groups. + management. Marks are now shown in nnir summary buffers. + Rudimentary support for real (i.e. not ephemeral) nnir groups. (gnus-summary-make-nnir-group): New function for initiating searches from a summary buffer. @@ -1018,8 +1144,8 @@ 2013-02-22 David Engster <deng@randomsample.de> * gnus-registry.el (gnus-registry-save): Provide class name when - calling `eieio-persistent-read' to avoid "unsafe call" warning. Use - `condition-case' to stay compatible with older EIEIO versions which + calling `eieio-persistent-read' to avoid "unsafe call" warning. + Use `condition-case' to stay compatible with older EIEIO versions which only accept one argument. 2013-02-17 Daiki Ueno <ueno@gnu.org> @@ -5295,7 +5421,7 @@ a creation default, pass the whole port list down. It will be completed. - * auth-source.el (auth-source-search): Updated docs to talk about + * auth-source.el (auth-source-search): Update docs to talk about multiple creation choices. (auth-source-netrc-create): Accept a list as a value (from the search parameters) and do completion on that list. Keep a separate netrc line @@ -5362,7 +5488,7 @@ (gnus-summary-exit): Kill the correct article buffer on exit from a `C-d' group. - * gnus-start.el (gnus-use-backend-marks): Removed, since it duplicates + * gnus-start.el (gnus-use-backend-marks): Remove, since it duplicates gnus-propagate-marks. * gnus-sum.el (gnus-summary-exit-no-update): Restore the group conf @@ -18399,7 +18525,7 @@ 2005-11-19 Kevin Greiner <kevin.greiner@compsol.cc> - * gnus-sum.el (gnus-fetch-old-headers): Updated docs to warn that + * gnus-sum.el (gnus-fetch-old-headers): Update docs to warn that it can seriously impact performance as it bypasses the agent's local caches. diff --git a/lisp/gnus/gnus-agent.el b/lisp/gnus/gnus-agent.el index 1d0f346e10f..10ee230a814 100644 --- a/lisp/gnus/gnus-agent.el +++ b/lisp/gnus/gnus-agent.el @@ -492,7 +492,7 @@ manipulated as follows: (push (cons mode (symbol-value (intern (format "gnus-agent-%s-mode-map" buffer)))) minor-mode-map-alist)) - (when (eq major-mode 'gnus-group-mode) + (when (derived-mode-p 'gnus-group-mode) (let ((init-plugged gnus-plugged) (gnus-agent-go-online nil)) ;; g-a-t-p does nothing when gnus-plugged isn't changed. @@ -881,11 +881,11 @@ Depends upon the caller to determine whether group renaming is supported." (let* ((old-command-method (gnus-find-method-for-group old-group)) (old-path (directory-file-name - (let (gnus-command-method old-command-method) + (let ((gnus-command-method old-command-method)) (gnus-agent-group-pathname old-group)))) (new-command-method (gnus-find-method-for-group new-group)) (new-path (directory-file-name - (let (gnus-command-method new-command-method) + (let ((gnus-command-method new-command-method)) (gnus-agent-group-pathname new-group)))) (file-name-coding-system nnmail-pathname-coding-system)) (gnus-rename-file old-path new-path t) @@ -914,19 +914,18 @@ Depends upon the caller to determine whether group deletion is supported." (let* ((command-method (gnus-find-method-for-group group)) (path (directory-file-name - (let (gnus-command-method command-method) + (let ((gnus-command-method command-method)) (gnus-agent-group-pathname group)))) (file-name-coding-system nnmail-pathname-coding-system)) (gnus-delete-directory path) (let* ((real-group (gnus-group-real-name group))) (gnus-agent-save-group-info command-method real-group nil) - - (let ((local (gnus-agent-get-local group - real-group command-method))) - (gnus-agent-set-local group - nil nil - real-group command-method))))) + ;; FIXME: Does gnus-agent-get-local have any useful side-effect? + (gnus-agent-get-local group real-group command-method) + (gnus-agent-set-local group + nil nil + real-group command-method)))) ;;; ;;; Server mode commands @@ -1549,7 +1548,7 @@ downloaded into the agent." (dir (gnus-agent-group-pathname group)) (date (time-to-days (current-time))) (case-fold-search t) - pos crosses id + pos crosses (file-name-coding-system nnmail-pathname-coding-system)) (setcar selected-sets (nreverse (car selected-sets))) @@ -1603,11 +1602,6 @@ downloaded into the agent." (goto-char (match-end 0))) (gnus-agent-crosspost crosses (caar pos) date))) (goto-char (point-min)) - (if (not (re-search-forward - "^Message-ID: *<\\([^>\n]+\\)>" nil t)) - (setq id "No-Message-ID-in-article") - (setq id (buffer-substring - (match-beginning 1) (match-end 1)))) (let ((coding-system-for-write gnus-agent-file-coding-system)) (write-region (point-min) (point-max) @@ -1832,7 +1826,7 @@ variables. Returns the first non-nil value found." . gnus-agent-enable-expiration) (agent-predicate . gnus-agent-predicate))))))) -(defun gnus-agent-fetch-headers (group &optional force) +(defun gnus-agent-fetch-headers (group) "Fetch interesting headers into the agent. The group's overview file will be updated to include the headers while a list of available article numbers will be returned." @@ -1931,7 +1925,7 @@ article numbers will be returned." ;; NOTE: Call g-a-brand-nov even when the file does not ;; exist. As a minimum, it will validate the article ;; numbers already in the buffer. - (gnus-agent-braid-nov group articles file) + (gnus-agent-braid-nov articles file) (let ((coding-system-for-write gnus-agent-file-coding-system)) (gnus-agent-check-overview-buffer) @@ -1980,7 +1974,7 @@ article numbers will be returned." (set-buffer nntp-server-buffer) (insert-buffer-substring gnus-agent-overview-buffer b e)))) -(defun gnus-agent-braid-nov (group articles file) +(defun gnus-agent-braid-nov (articles file) "Merge agent overview data with given file. Takes unvalidated headers for ARTICLES from `gnus-agent-overview-buffer' and validated headers from the given @@ -2154,7 +2148,7 @@ doesn't exist, to valid the overview buffer." (let* ((file-name-coding-system nnmail-pathname-coding-system) (prev (cons nil gnus-agent-article-alist)) (all prev) - print-level print-length item article) + print-level print-length article) (while (setq article (pop articles)) (while (and (cdr prev) (< (caadr prev) article)) @@ -2288,7 +2282,7 @@ modified) original contents, they are first saved to their own file." (file-name-coding-system nnmail-pathname-coding-system)) (with-temp-file dest (let ((gnus-command-method (symbol-value (intern "+method" my-obarray))) - print-level print-length item article + print-level print-length (standard-output (current-buffer))) (mapatoms (lambda (symbol) (cond ((not (boundp symbol)) @@ -2411,6 +2405,18 @@ modified) original contents, they are first saved to their own file." (gnus-run-hooks 'gnus-agent-fetched-hook) (gnus-message 6 "Finished fetching articles into the Gnus agent")))) +(defvar gnus-agent-short-article 500 + "Articles that have fewer lines than this are short.") + +(defvar gnus-agent-long-article 1000 + "Articles that have more lines than this are long.") + +(defvar gnus-agent-low-score 0 + "Articles that have a score lower than this have a low score.") + +(defvar gnus-agent-high-score 0 + "Articles that have a score higher than this have a high score.") + (defun gnus-agent-fetch-group-1 (group method) "Fetch GROUP." (let ((gnus-command-method method) @@ -2427,8 +2433,8 @@ modified) original contents, they are first saved to their own file." gnus-headers gnus-score - articles arts - category predicate info marks score-param + articles + predicate info marks ) (unless (gnus-check-group group) (error "Can't open server for %s" group)) @@ -2471,9 +2477,6 @@ modified) original contents, they are first saved to their own file." ;; timeout reason. If so, recreate it. (gnus-agent-create-buffer) - ;; Figure out how to select articles in this group - (setq category (gnus-group-category group)) - (setq predicate (gnus-get-predicate (gnus-agent-find-parameter group 'agent-predicate))) @@ -2624,23 +2627,14 @@ General format specifiers can also be used. See Info node (defvar gnus-agent-predicate 'false "The selection predicate used when no other source is available.") -(defvar gnus-agent-short-article 500 - "Articles that have fewer lines than this are short.") - -(defvar gnus-agent-long-article 1000 - "Articles that have more lines than this are long.") - -(defvar gnus-agent-low-score 0 - "Articles that have a score lower than this have a low score.") - -(defvar gnus-agent-high-score 0 - "Articles that have a score higher than this have a high score.") - ;;; Internal variables. (defvar gnus-category-buffer "*Agent Category*") +(defvar gnus-tmp-name) +(defvar gnus-tmp-groups) + (defvar gnus-category-line-format-alist `((?c gnus-tmp-name ?s) (?g gnus-tmp-groups ?d))) @@ -2692,7 +2686,7 @@ General format specifiers can also be used. See Info node (gnus-run-hooks 'gnus-category-menu-hook))) -(defun gnus-category-mode () +(define-derived-mode gnus-category-mode fundamental-mode "Category" "Major mode for listing and editing agent categories. All normal editing commands are switched off. @@ -2703,20 +2697,14 @@ For more in-depth information on this mode, read the manual The following commands are available: \\{gnus-category-mode-map}" - (interactive) (when (gnus-visual-p 'category-menu 'menu) (gnus-category-make-menu-bar)) - (kill-all-local-variables) (gnus-simplify-mode-line) - (setq major-mode 'gnus-category-mode) - (setq mode-name "Category") (gnus-set-default-directory) (setq mode-line-process nil) - (use-local-map gnus-category-mode-map) (buffer-disable-undo) (setq truncate-lines t) - (setq buffer-read-only t) - (gnus-run-mode-hooks 'gnus-category-mode-hook)) + (setq buffer-read-only t)) (defalias 'gnus-category-position-point 'gnus-goto-colon) @@ -2992,9 +2980,7 @@ The following commands are available: "Return the function implementing PREDICATE." (or (cdr (assoc predicate gnus-category-predicate-cache)) (let ((func (gnus-category-make-function predicate))) - (setq gnus-category-predicate-cache - (nconc gnus-category-predicate-cache - (list (cons predicate func)))) + (push (cons predicate func) gnus-category-predicate-cache) func))) (defun gnus-predicate-implies-unread (predicate) @@ -3066,6 +3052,9 @@ articles." (or (gnus-gethash group gnus-category-group-cache) (assq 'default gnus-category-alist))) +(defvar gnus-agent-expire-current-dirs) +(defvar gnus-agent-expire-stats) + (defun gnus-agent-expire-group (group &optional articles force) "Expire all old articles in GROUP. If you want to force expiring of certain articles, this function can @@ -3080,7 +3069,7 @@ FORCE is equivalent to setting the expiration predicates to true." (if (not group) (gnus-agent-expire articles group force) - (let ( ;; Bind gnus-agent-expire-stats to enable tracking of + (let (;; Bind gnus-agent-expire-stats to enable tracking of ;; expiration statistics of this single group (gnus-agent-expire-stats (list 0 0 0.0))) (if (or (not (eq articles t)) @@ -3117,9 +3106,7 @@ FORCE is equivalent to setting the expiration predicates to true." (gnus-agent-with-refreshed-group group (when (boundp 'gnus-agent-expire-current-dirs) - (set 'gnus-agent-expire-current-dirs - (cons dir - (symbol-value 'gnus-agent-expire-current-dirs)))) + (push dir gnus-agent-expire-current-dirs)) (if (and (not force) (eq 'DISABLE (gnus-agent-find-parameter group @@ -3263,24 +3250,24 @@ line." (point) nov-file))) ;; only problem is that much of it is spread across multiple ;; entries. Sort then MERGE!! (gnus-message 7 "gnus-agent-expire: Sorting entries... ") - ;; If two entries have the same article-number then sort by - ;; ascending keep_flag. - (let ((special 0) - (marked 1) - (unread 2)) - (setq dlist - (sort dlist - (lambda (a b) - (cond ((< (nth 0 a) (nth 0 b)) - t) - ((> (nth 0 a) (nth 0 b)) - nil) - (t - (let ((a (or (symbol-value (nth 2 a)) - 3)) - (b (or (symbol-value (nth 2 b)) - 3))) - (<= a b)))))))) + (setq dlist + (sort dlist + (lambda (a b) + (cond ((< (nth 0 a) (nth 0 b)) + t) + ((> (nth 0 a) (nth 0 b)) + nil) + (t + ;; If two entries have the same article-number + ;; then sort by ascending keep_flag. + (let* ((kf-score '((special . 0) + (marked . 1) + (unread . 2))) + (a (or (cdr (assq (nth 2 a) kf-score)) + 3)) + (b (or (cdr (assq (nth 2 b) kf-score)) + 3))) + (<= a b))))))) (gnus-message 7 "gnus-agent-expire: Sorting entries... Done") (gnus-message 7 "gnus-agent-expire: Merging entries... ") (let ((dlist dlist)) @@ -3474,7 +3461,7 @@ expiration tests failed." decoded article-number) (gnus-summary-update-info)))) (when (boundp 'gnus-agent-expire-stats) - (let ((stats (symbol-value 'gnus-agent-expire-stats))) + (let ((stats gnus-agent-expire-stats)) (incf (nth 2 stats) bytes-freed) (incf (nth 1 stats) files-deleted) (incf (nth 0 stats) nov-entries-deleted))) @@ -3534,7 +3521,7 @@ articles in every agentized group? ")) (defun gnus-agent-expire-done-message () (if (and (> gnus-verbose 4) (boundp 'gnus-agent-expire-stats)) - (let* ((stats (symbol-value 'gnus-agent-expire-stats)) + (let* ((stats gnus-agent-expire-stats) (size (nth 2 stats)) (units '(B KB MB GB))) (while (and (> size 1024.0) @@ -3553,16 +3540,10 @@ articles in every agentized group? ")) (when (and gnus-agent-expire-unagentized-dirs (boundp 'gnus-agent-expire-current-dirs)) (let* ((keep (gnus-make-hashtable)) - ;; Formally bind gnus-agent-expire-current-dirs so that the - ;; compiler will not complain about free references. - (gnus-agent-expire-current-dirs - (symbol-value 'gnus-agent-expire-current-dirs)) - dir (file-name-coding-system nnmail-pathname-coding-system)) (gnus-sethash gnus-agent-directory t keep) - (while gnus-agent-expire-current-dirs - (setq dir (pop gnus-agent-expire-current-dirs)) + (dolist (dir gnus-agent-expire-current-dirs) (when (and (stringp dir) (file-directory-p dir)) (while (not (gnus-gethash dir keep)) @@ -3715,7 +3696,7 @@ has been fetched." (let ((gnus-decode-encoded-word-function 'identity) (gnus-decode-encoded-address-function 'identity) (file (gnus-agent-article-name ".overview" group)) - cached-articles uncached-articles + uncached-articles (file-name-coding-system nnmail-pathname-coding-system)) (gnus-make-directory (nnheader-translate-file-chars (file-name-directory file) t)) @@ -3812,7 +3793,7 @@ has been fetched." ;; Merge the temp buffer with the known headers (found on ;; disk in FILE) into the nntp-server-buffer (when uncached-articles - (gnus-agent-braid-nov group uncached-articles file)) + (gnus-agent-braid-nov uncached-articles file)) ;; Save the new set of known headers to FILE (set-buffer nntp-server-buffer) @@ -3907,7 +3888,6 @@ If REREAD is not nil, downloaded articles are marked as unread." (gnus-find-method-for-group group))) (file (gnus-agent-article-name ".overview" group)) (dir (file-name-directory file)) - point (file-name-coding-system nnmail-pathname-coding-system) (downloaded (if (file-exists-p dir) (sort (delq nil (mapcar (lambda (name) @@ -3916,7 +3896,7 @@ If REREAD is not nil, downloaded articles are marked as unread." (directory-files dir nil "^[0-9]+$" t))) '>) (progn (gnus-make-directory dir) nil))) - dl nov-arts + nov-arts alist header regenerated) @@ -4099,16 +4079,16 @@ If REREAD is not nil, downloaded articles are marked as unread." regenerated))) ;;;###autoload -(defun gnus-agent-regenerate (&optional clean reread) +(defun gnus-agent-regenerate (&optional _clean reread) "Regenerate all agent covered files. -If CLEAN, obsolete (ignore)." - (interactive "P") +CLEAN is obsolete and ignored." + (interactive) (let (regenerated) (gnus-message 4 "Regenerating Gnus agent files...") (dolist (gnus-command-method (gnus-agent-covered-methods)) - (dolist (group (gnus-groups-from-server gnus-command-method)) - (setq regenerated (or (gnus-agent-regenerate-group group reread) - regenerated)))) + (dolist (group (gnus-groups-from-server gnus-command-method)) + (setq regenerated (or (gnus-agent-regenerate-group group reread) + regenerated)))) (gnus-message 4 "Regenerating Gnus agent files...done") regenerated)) diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el index e65b9fb99e4..b80aa3a24e9 100644 --- a/lisp/gnus/gnus-art.el +++ b/lisp/gnus/gnus-art.el @@ -3683,7 +3683,7 @@ function and want to see what the date was before converting." (walk-windows (lambda (w) (set-buffer (window-buffer w)) - (when (eq major-mode 'gnus-article-mode) + (when (derived-mode-p 'gnus-article-mode) (let ((old-line (count-lines (point-min) (point))) (old-column (- (point) (line-beginning-position))) (window-start (window-start w)) @@ -4455,7 +4455,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is (defvar bookmark-make-record-function) (defvar shr-put-image-function) -(defun gnus-article-mode () +(define-derived-mode gnus-article-mode fundamental-mode "Article" "Major mode for displaying an article. All normal editing commands are switched off. @@ -4470,13 +4470,8 @@ commands: \\[gnus-article-mail]\t Send a reply to the address near point \\[gnus-article-describe-briefly]\t Describe the current mode briefly \\[gnus-info-find-node]\t Go to the Gnus info node" - (interactive) - (kill-all-local-variables) (gnus-simplify-mode-line) - (setq mode-name "Article") - (setq major-mode 'gnus-article-mode) (make-local-variable 'minor-mode-alist) - (use-local-map gnus-article-mode-map) (when (gnus-visual-p 'article-menu 'menu) (gnus-article-make-menu-bar) (when gnus-summary-tool-bar-map @@ -4504,9 +4499,7 @@ commands: (buffer-disable-undo) (setq buffer-read-only t show-trailing-whitespace nil) - (set-syntax-table gnus-article-mode-syntax-table) - (mm-enable-multibyte) - (gnus-run-mode-hooks 'gnus-article-mode-hook)) + (mm-enable-multibyte)) (defun gnus-article-setup-buffer () "Initialize the article buffer." @@ -4554,7 +4547,7 @@ commands: (setq gnus-article-mime-handle-alist nil) (buffer-disable-undo) (setq buffer-read-only t) - (unless (eq major-mode 'gnus-article-mode) + (unless (derived-mode-p 'gnus-article-mode) (gnus-article-mode)) (setq truncate-lines gnus-article-truncate-lines) (current-buffer)) @@ -4603,7 +4596,7 @@ If ARTICLE is an id, HEADER should be the article headers. If ALL-HEADERS is non-nil, no headers are hidden." (save-excursion ;; Make sure we start in a summary buffer. - (unless (eq major-mode 'gnus-summary-mode) + (unless (derived-mode-p 'gnus-summary-mode) (set-buffer gnus-summary-buffer)) (setq gnus-summary-buffer (current-buffer)) (let* ((gnus-article (if header (mail-header-number header) article)) @@ -4714,7 +4707,7 @@ If ALL-HEADERS is non-nil, no headers are hidden." (let ((gnus-article-buffer (current-buffer)) buffer-read-only (inhibit-read-only t)) - (unless (eq major-mode 'gnus-article-mode) + (unless (derived-mode-p 'gnus-article-mode) (gnus-article-mode)) (setq buffer-read-only nil gnus-article-wash-types nil @@ -4776,7 +4769,7 @@ If a prefix ARG is given, ask for a name for this sticky article buffer." "*")) (if (and (gnus-buffer-live-p new-art-buf-name) (with-current-buffer new-art-buf-name - (eq major-mode 'gnus-sticky-article-mode))) + (derived-mode-p 'gnus-sticky-article-mode))) (switch-to-buffer new-art-buf-name) (setq new-art-buf-name (rename-buffer new-art-buf-name t))) (gnus-sticky-article-mode)) @@ -4792,7 +4785,7 @@ If none is given, assume the current buffer and kill it if it has (unless buffer (setq buffer (current-buffer))) (with-current-buffer buffer - (when (eq major-mode 'gnus-sticky-article-mode) + (when (derived-mode-p 'gnus-sticky-article-mode) (gnus-kill-buffer buffer)))) (defun gnus-kill-sticky-article-buffers (arg) @@ -4801,11 +4794,11 @@ If a prefix ARG is given, ask for confirmation." (interactive "P") (dolist (buf (gnus-buffers)) (with-current-buffer buf - (when (eq major-mode 'gnus-sticky-article-mode) - (if (not arg) - (gnus-kill-buffer buf) - (when (yes-or-no-p (concat "Kill buffer " (buffer-name buf) "? ")) - (gnus-kill-buffer buf))))))) + (when (derived-mode-p 'gnus-sticky-article-mode) + (if (not arg) + (gnus-kill-buffer buf) + (when (yes-or-no-p (concat "Kill buffer " (buffer-name buf) "? ")) + (gnus-kill-buffer buf))))))) ;;; ;;; Gnus MIME viewing functions @@ -4893,7 +4886,7 @@ General format specifiers can also be used. See Info node (defmacro gnus-bind-safe-url-regexp (&rest body) "Bind `mm-w3m-safe-url-regexp' according to `gnus-safe-html-newsgroups'." `(let ((mm-w3m-safe-url-regexp - (let ((group (if (and (eq major-mode 'gnus-article-mode) + (let ((group (if (and (derived-mode-p 'gnus-article-mode) (gnus-buffer-live-p gnus-article-current-summary)) (with-current-buffer gnus-article-current-summary @@ -6477,7 +6470,7 @@ not have a face in `gnus-article-boring-faces'." (defun gnus-article-check-buffer () "Beep if not in an article buffer." - (unless (equal major-mode 'gnus-article-mode) + (unless (derived-mode-p 'gnus-article-mode) (error "Command invoked outside of a Gnus article buffer"))) (defun gnus-article-read-summary-keys (&optional arg key not-restore-window) @@ -6592,7 +6585,7 @@ not have a face in `gnus-article-boring-faces'." new-sum-point (window-live-p win) (with-current-buffer (window-buffer win) - (eq major-mode 'gnus-summary-mode))) + (derived-mode-p 'gnus-summary-mode))) (set-window-point win new-sum-point) (set-window-start win new-sum-start) (set-window-hscroll win new-sum-hscroll)))) diff --git a/lisp/gnus/gnus-bookmark.el b/lisp/gnus/gnus-bookmark.el index 7a3d273622a..c31cb1aef36 100644 --- a/lisp/gnus/gnus-bookmark.el +++ b/lisp/gnus/gnus-bookmark.el @@ -190,7 +190,7 @@ So the cdr of each bookmark is an alist too.") "Set a bookmark for this article." (interactive) (gnus-bookmark-maybe-load-default-file) - (if (or (not (eq major-mode 'gnus-summary-mode)) + (if (or (not (derived-mode-p 'gnus-summary-mode)) (not gnus-article-current)) (error "Please select an article in the Gnus summary buffer") (let* ((group (car gnus-article-current)) @@ -473,7 +473,7 @@ That is, all information but the name." ;; Been to lazy to use gnus-bookmark-save... (defalias 'gnus-bookmark-bmenu-save 'gnus-bookmark-write-file) -(defun gnus-bookmark-bmenu-mode () +(define-derived-mode gnus-bookmark-bmenu-mode fundamental-mode "Bookmark Menu" "Major mode for editing a list of Gnus bookmarks. Each line describes one of the bookmarks in Gnus. Letters do not insert themselves; instead, they are commands. @@ -497,13 +497,8 @@ Gnus bookmarks names preceded by a \"*\" have annotations. in another buffer. \\[gnus-bookmark-bmenu-show-all-annotations] -- show the annotations of all bookmarks in another buffer. \\[gnus-bookmark-bmenu-edit-annotation] -- edit the annotation for the current bookmark." - (kill-all-local-variables) - (use-local-map gnus-bookmark-bmenu-mode-map) (setq truncate-lines t) - (setq buffer-read-only t) - (setq major-mode 'gnus-bookmark-bmenu-mode) - (setq mode-name "Bookmark Menu") - (gnus-run-mode-hooks 'gnus-bookmark-bmenu-mode-hook)) + (setq buffer-read-only t)) ;; avoid compilation warnings (defvar gnus-bookmark-bmenu-toggle-infos nil) diff --git a/lisp/gnus/gnus-cus.el b/lisp/gnus/gnus-cus.el index c8fb5b5dc73..247c081a20f 100644 --- a/lisp/gnus/gnus-cus.el +++ b/lisp/gnus/gnus-cus.el @@ -33,7 +33,7 @@ ;;; Widgets: -(defun gnus-custom-mode () +(define-derived-mode gnus-custom-mode fundamental-mode "Gnus Customize" "Major mode for editing Gnus customization buffers. The following commands are available: @@ -45,9 +45,6 @@ The following commands are available: Entry to this mode calls the value of `gnus-custom-mode-hook' if that value is non-nil." - (kill-all-local-variables) - (setq major-mode 'gnus-custom-mode - mode-name "Gnus Customize") (use-local-map widget-keymap) ;; Emacs stuff: (when (and (facep 'custom-button-face) @@ -63,8 +60,7 @@ if that value is non-nil." (set (make-local-variable 'widget-push-button-prefix) "") (set (make-local-variable 'widget-push-button-suffix) "") (set (make-local-variable 'widget-link-prefix) "") - (set (make-local-variable 'widget-link-suffix) "")) - (gnus-run-mode-hooks 'gnus-custom-mode-hook)) + (set (make-local-variable 'widget-link-suffix) ""))) ;;; Group Customization: diff --git a/lisp/gnus/gnus-eform.el b/lisp/gnus/gnus-eform.el index 6790803305a..00e27876088 100644 --- a/lisp/gnus/gnus-eform.el +++ b/lisp/gnus/gnus-eform.el @@ -67,21 +67,15 @@ ["Exit" gnus-edit-form-exit t])) (gnus-run-hooks 'gnus-edit-form-menu-hook))) -(defun gnus-edit-form-mode () +(define-derived-mode gnus-edit-form-mode fundamental-mode "Edit Form" "Major mode for editing forms. It is a slightly enhanced emacs-lisp-mode. \\{gnus-edit-form-mode-map}" - (interactive) (when (gnus-visual-p 'group-menu 'menu) (gnus-edit-form-make-menu-bar)) - (kill-all-local-variables) - (setq major-mode 'gnus-edit-form-mode) - (setq mode-name "Edit Form") - (use-local-map gnus-edit-form-mode-map) (make-local-variable 'gnus-edit-form-done-function) - (make-local-variable 'gnus-prev-winconf) - (gnus-run-mode-hooks 'gnus-edit-form-mode-hook)) + (make-local-variable 'gnus-prev-winconf)) (defun gnus-edit-form (form documentation exit-func &optional layout) "Edit FORM in a new buffer. diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el index 9533f5819a4..c8945e57531 100644 --- a/lisp/gnus/gnus-group.el +++ b/lisp/gnus/gnus-group.el @@ -1105,7 +1105,7 @@ When FORCE, rebuild the tool bar." (set (make-local-variable 'tool-bar-map) map)))) gnus-group-tool-bar-map) -(defun gnus-group-mode () +(define-derived-mode gnus-group-mode fundamental-mode "Group" "Major mode for reading news. All normal editing commands are switched off. @@ -1122,17 +1122,12 @@ For more in-depth information on this mode, read the manual (`\\[gnus-info-find- The following commands are available: \\{gnus-group-mode-map}" - (interactive) - (kill-all-local-variables) (when (gnus-visual-p 'group-menu 'menu) (gnus-group-make-menu-bar) (gnus-group-make-tool-bar)) (gnus-simplify-mode-line) - (setq major-mode 'gnus-group-mode) - (setq mode-name "Group") (gnus-group-set-mode-line) (setq mode-line-process nil) - (use-local-map gnus-group-mode-map) (buffer-disable-undo) (setq truncate-lines t) (setq buffer-read-only t @@ -1143,8 +1138,7 @@ The following commands are available: (when gnus-use-undo (gnus-undo-mode 1)) (when gnus-slave - (gnus-slave-mode)) - (gnus-run-mode-hooks 'gnus-group-mode-hook)) + (gnus-slave-mode))) (defun gnus-update-group-mark-positions () (save-excursion @@ -1193,7 +1187,7 @@ The following commands are available: (defun gnus-group-setup-buffer () (set-buffer (gnus-get-buffer-create gnus-group-buffer)) - (unless (eq major-mode 'gnus-group-mode) + (unless (derived-mode-p 'gnus-group-mode) (gnus-group-mode))) (defun gnus-group-name-charset (method group) @@ -2147,7 +2141,7 @@ be permanent." (defun gnus-group-name-at-point () "Return a group name from around point if it exists, or nil." - (if (eq major-mode 'gnus-group-mode) + (if (derived-mode-p 'gnus-group-mode) (let ((group (gnus-group-group-name))) (when group (gnus-group-decoded-name group))) @@ -3114,7 +3108,7 @@ If SOLID (the prefix), create a solid group." (gnus-group-read-ephemeral-group group method t (cons (current-buffer) - (if (eq major-mode 'gnus-summary-mode) 'summary 'group)))))) + (if (derived-mode-p 'gnus-summary-mode) 'summary 'group)))))) (defvar nnrss-group-alist) (eval-when-compile @@ -3229,7 +3223,7 @@ mail messages or news articles in files that have numeric names." (unless (gnus-group-read-ephemeral-group name method t (cons (current-buffer) - (if (eq major-mode 'gnus-summary-mode) + (if (derived-mode-p 'gnus-summary-mode) 'summary 'group))) (error "Couldn't enter %s" dir)))) @@ -4319,7 +4313,7 @@ The hook `gnus-suspend-gnus-hook' is called before actually suspending." (unless (or (eq buf group-buf) (eq buf gnus-dribble-buffer) (with-current-buffer buf - (eq major-mode 'message-mode))) + (derived-mode-p 'message-mode))) (gnus-kill-buffer buf))) (setq gnus-backlog-articles nil) (gnus-kill-gnus-frames) diff --git a/lisp/gnus/gnus-html.el b/lisp/gnus/gnus-html.el index a5625dfed80..2700af3d009 100644 --- a/lisp/gnus/gnus-html.el +++ b/lisp/gnus/gnus-html.el @@ -28,6 +28,10 @@ ;;; Code: +;; For Emacs <22.2 and XEmacs. +(eval-and-compile + (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))) + (eval-when-compile (require 'cl)) (require 'gnus-art) @@ -438,6 +442,9 @@ Return a string with image data." (truncate (* gnus-max-image-proportion (- (nth 3 edges) (nth 1 edges))))))) +;; Behind display-graphic-p test. +(declare-function image-size "image.c" (spec &optional pixels frame)) + (defun gnus-html-put-image (data url &optional alt-text) "Put an image with DATA from URL and optional ALT-TEXT." (when (gnus-graphic-display-p) diff --git a/lisp/gnus/gnus-icalendar.el b/lisp/gnus/gnus-icalendar.el index a946a586033..969c868b564 100644 --- a/lisp/gnus/gnus-icalendar.el +++ b/lisp/gnus/gnus-icalendar.el @@ -35,6 +35,7 @@ (require 'icalendar) (require 'eieio) +(require 'gmm-utils) (require 'mm-decode) (require 'gnus-sum) @@ -149,7 +150,7 @@ (defun gnus-icalendar-event--find-attendee (ical name-or-email) (let* ((event (car (icalendar--all-events ical))) (event-props (caddr event))) - (labels ((attendee-name (att) (plist-get (cadr att) 'CN)) + (gmm-labels ((attendee-name (att) (plist-get (cadr att) 'CN)) (attendee-email (att) (replace-regexp-in-string "^.*MAILTO:" "" (caddr att))) (attendee-prop-matches-p (prop) @@ -189,7 +190,7 @@ ((string= method "REPLY") 'gnus-icalendar-event-reply) (t 'gnus-icalendar-event)))) - (labels ((map-property (prop) + (gmm-labels ((map-property (prop) (let ((value (icalendar--get-event-property event prop))) (when value ;; ugly, but cannot get @@ -233,7 +234,7 @@ status will be retrieved from the first matching attendee record." (let ((summary-status (capitalize (symbol-name status))) (attendee-status (upcase (symbol-name status))) reply-event-lines) - (labels ((update-summary (line) + (gmm-labels ((update-summary (line) (if (string-match "^[^:]+:" line) (replace-match (format "\\&%s: " summary-status) t nil line) line)) @@ -257,9 +258,9 @@ status will be retrieved from the first matching attendee record." ((string= key "ATTENDEE") (update-attendee-status line)) ((string= key "SUMMARY") (update-summary line)) ((string= key "DTSTAMP") (update-dtstamp)) - ((find key '("ORGANIZER" "DTSTART" "DTEND" - "LOCATION" "DURATION" "SEQUENCE" - "RECURRENCE-ID" "UID")) line) + ((member key '("ORGANIZER" "DTSTART" "DTEND" + "LOCATION" "DURATION" "SEQUENCE" + "RECURRENCE-ID" "UID")) line) (t nil)))) (when new-line (push new-line reply-event-lines)))))) @@ -280,7 +281,7 @@ status will be retrieved from the first matching attendee record." The reply will have STATUS (`accepted', `tentative' or `declined'). The reply will be composed for attendees matching any entry on the IDENTITIES list." - (flet ((extract-block (blockname) + (gmm-labels ((extract-block (blockname) (save-excursion (let ((block-start-re (format "^BEGIN:%s" blockname)) (block-end-re (format "^END:%s" blockname)) @@ -419,7 +420,7 @@ the optional ORG-FILE argument is specified, only that one file is searched." (let ((uid (gnus-icalendar-event:uid event)) (files (or org-file (org-agenda-files t 'ifmode)))) - (flet + (gmm-labels ((find-event-in (file) (org-check-agenda-file file) (with-current-buffer (find-file-noselect file) @@ -596,7 +597,7 @@ is searched." ;; TODO: make the template customizable (defmethod gnus-icalendar-event->gnus-calendar ((event gnus-icalendar-event) &optional reply-status) "Format an overview of EVENT details." - (flet ((format-header (x) + (gmm-labels ((format-header (x) (format "%-12s%s" (propertize (concat (car x) ":") 'face 'bold) (cadr x)))) @@ -673,7 +674,7 @@ is searched." (current-buffer) status gnus-icalendar-identities)))) (when reply - (flet ((fold-icalendar-buffer () + (gmm-labels ((fold-icalendar-buffer () (goto-char (point-min)) (while (re-search-forward "^\\(.\\{72\\}\\)\\(.+\\)$" nil t) (replace-match "\\1\n \\2") @@ -735,7 +736,7 @@ is searched." (setq gnus-icalendar-reply-status nil) (when event - (flet ((insert-button-group (buttons) + (gmm-labels ((insert-button-group (buttons) (when buttons (mapc (lambda (x) (apply 'gnus-icalendar-insert-button x) @@ -816,6 +817,8 @@ is searched." (gnus-icalendar-show-org-agenda (with-current-buffer gnus-article-buffer gnus-icalendar-event))) +(defvar gnus-mime-action-alist) ; gnus-art + (defun gnus-icalendar-setup () (add-to-list 'mm-inlined-types "text/calendar") (add-to-list 'mm-automatic-display "text/calendar") diff --git a/lisp/gnus/gnus-int.el b/lisp/gnus/gnus-int.el index f0cf0daed01..2de6ce0fce1 100644 --- a/lisp/gnus/gnus-int.el +++ b/lisp/gnus/gnus-int.el @@ -302,7 +302,7 @@ If it is down, start it up (again)." (setcar (cdr elem) (cond (result - (if (eq open-server-function #'nnagent-open-server) + (if (eq open-server-function 'nnagent-open-server) ;; The agent's backend has a "special" status 'offline 'ok)) diff --git a/lisp/gnus/gnus-kill.el b/lisp/gnus/gnus-kill.el index b3f06de0868..011288e280b 100644 --- a/lisp/gnus/gnus-kill.el +++ b/lisp/gnus/gnus-kill.el @@ -75,20 +75,20 @@ of time." ;;; Gnus Kill File Mode ;;; -(defvar gnus-kill-file-mode-map nil) - -(unless gnus-kill-file-mode-map - (gnus-define-keymap (setq gnus-kill-file-mode-map - (copy-keymap emacs-lisp-mode-map)) - "\C-c\C-k\C-s" gnus-kill-file-kill-by-subject - "\C-c\C-k\C-a" gnus-kill-file-kill-by-author - "\C-c\C-k\C-t" gnus-kill-file-kill-by-thread - "\C-c\C-k\C-x" gnus-kill-file-kill-by-xref - "\C-c\C-a" gnus-kill-file-apply-buffer - "\C-c\C-e" gnus-kill-file-apply-last-sexp - "\C-c\C-c" gnus-kill-file-exit)) - -(defun gnus-kill-file-mode () +(defvar gnus-kill-file-mode-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map emacs-lisp-mode-map) + (gnus-define-keymap map + "\C-c\C-k\C-s" gnus-kill-file-kill-by-subject + "\C-c\C-k\C-a" gnus-kill-file-kill-by-author + "\C-c\C-k\C-t" gnus-kill-file-kill-by-thread + "\C-c\C-k\C-x" gnus-kill-file-kill-by-xref + "\C-c\C-a" gnus-kill-file-apply-buffer + "\C-c\C-e" gnus-kill-file-apply-last-sexp + "\C-c\C-c" gnus-kill-file-exit) + map)) + +(define-derived-mode gnus-kill-file-mode emacs-lisp-mode "Kill" "Major mode for editing kill files. If you are using this mode - you probably shouldn't. Kill files @@ -151,15 +151,7 @@ which are marked as read in the previous Gnus sessions. Marks other than `D' should be used for articles which should really be deleted. Entry to this mode calls emacs-lisp-mode-hook and -gnus-kill-file-mode-hook with no arguments, if that value is non-nil." - (interactive) - (kill-all-local-variables) - (use-local-map gnus-kill-file-mode-map) - (set-syntax-table emacs-lisp-mode-syntax-table) - (setq major-mode 'gnus-kill-file-mode) - (setq mode-name "Kill") - (lisp-mode-variables nil) - (gnus-run-mode-hooks 'emacs-lisp-mode-hook 'gnus-kill-file-mode-hook)) +gnus-kill-file-mode-hook with no arguments, if that value is non-nil.") (defun gnus-kill-file-edit-file (newsgroup) "Begin editing a kill file for NEWSGROUP. @@ -175,10 +167,10 @@ If NEWSGROUP is nil, the global kill file is selected." (let ((buffer (find-file-noselect file))) (cond ((get-buffer-window buffer) (pop-to-buffer buffer)) - ((eq major-mode 'gnus-group-mode) + ((derived-mode-p 'gnus-group-mode) (gnus-configure-windows 'group) ;Take all windows. (pop-to-buffer buffer)) - ((eq major-mode 'gnus-summary-mode) + ((derived-mode-p 'gnus-summary-mode) (gnus-configure-windows 'article) (pop-to-buffer gnus-article-buffer) (bury-buffer gnus-article-buffer) @@ -201,7 +193,7 @@ If NEWSGROUP is nil, the global kill file is selected." ;; REGEXP: The string to kill. (save-excursion (let (string) - (unless (eq major-mode 'gnus-kill-file-mode) + (unless (derived-mode-p 'gnus-kill-file-mode) (gnus-kill-set-kill-buffer)) (unless dont-move (goto-char (point-max))) @@ -520,7 +512,7 @@ COMMAND must be a Lisp expression or a string representing a key sequence." (setq kill-list (cdr kill-list)))) (gnus-execute field kill-list command nil (not all)))))) (switch-to-buffer old-buffer) - (when (and (eq major-mode 'gnus-kill-file-mode) regexp (not silent)) + (when (and (derived-mode-p 'gnus-kill-file-mode) regexp (not silent)) (gnus-pp-gnus-kill (nconc (list 'gnus-kill field (if (consp regexp) (list 'quote regexp) regexp)) diff --git a/lisp/gnus/gnus-salt.el b/lisp/gnus/gnus-salt.el index 6b8e105e6b8..77fe0d3bb14 100644 --- a/lisp/gnus/gnus-salt.el +++ b/lisp/gnus/gnus-salt.el @@ -292,22 +292,25 @@ This must be bound to a button-down mouse event." (mouse-scroll-subr start-window (1+ (- mouse-row bottom))))))))))) (when (consp event) - (let ((fun (key-binding (vector (car event))))) + (let (;; (fun (key-binding (vector (car event)))) + ) ;; Run the binding of the terminating up-event, if possible. - ;; In the case of a multiple click, it gives the wrong results, + ;; In the case of a multiple click, it gives the wrong results, ;; because it would fail to set up a region. (when nil - ;; (and (= (mod mouse-selection-click-count 3) 0) (fboundp fun)) - ;; In this case, we can just let the up-event execute normally. + ;; (and (= (mod mouse-selection-click-count 3) 0) (fboundp fun)) + ;; In this case, we can just let the up-event execute normally. (let ((end (event-end event))) ;; Set the position in the event before we replay it, ;; because otherwise it may have a position in the wrong ;; buffer. (setcar (cdr end) end-of-range) ;; Delete the overlay before calling the function, - ;; because delete-overlay increases buffer-modified-tick. + ;; because delete-overlay increases buffer-modified-tick. (push event unread-command-events)))))))) +(defvar scroll-in-place) + (defun gnus-pick-next-page () "Go to the next page. If at the end of the buffer, start reading articles." (interactive) @@ -356,7 +359,7 @@ This must be bound to a button-down mouse event." (when (gnus-visual-p 'binary-menu 'menu) (gnus-binary-make-menu-bar))))) -(defun gnus-binary-display-article (article &optional all-header) +(defun gnus-binary-display-article (article &optional _all-header) "Run ARTICLE through the binary decode functions." (when (gnus-summary-goto-subject article) (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) @@ -423,6 +426,13 @@ Two predefined functions are available: ;;; Internal variables. +(defvar gnus-tmp-name) +(defvar gnus-tmp-from) +(defvar gnus-tmp-number) +(defvar gnus-tmp-open-bracket) +(defvar gnus-tmp-close-bracket) +(defvar gnus-tmp-subject) + (defvar gnus-tree-line-format-alist `((?n gnus-tmp-name ?s) (?f gnus-tmp-from ?s) @@ -442,23 +452,23 @@ Two predefined functions are available: (defvar gnus-tree-displayed-thread nil) (defvar gnus-tree-inhibit nil) -(defvar gnus-tree-mode-map nil) -(put 'gnus-tree-mode 'mode-class 'special) +(defvar gnus-tree-mode-map + (let ((map (make-keymap))) + (suppress-keymap map) + (gnus-define-keys + map + "\r" gnus-tree-select-article + gnus-mouse-2 gnus-tree-pick-article + "\C-?" gnus-tree-read-summary-keys + "h" gnus-tree-show-summary -(unless gnus-tree-mode-map - (setq gnus-tree-mode-map (make-keymap)) - (suppress-keymap gnus-tree-mode-map) - (gnus-define-keys - gnus-tree-mode-map - "\r" gnus-tree-select-article - gnus-mouse-2 gnus-tree-pick-article - "\C-?" gnus-tree-read-summary-keys - "h" gnus-tree-show-summary + "\C-c\C-i" gnus-info-find-node) - "\C-c\C-i" gnus-info-find-node) + (substitute-key-definition + 'undefined 'gnus-tree-read-summary-keys map) + map)) - (substitute-key-definition - 'undefined 'gnus-tree-read-summary-keys gnus-tree-mode-map)) +(put 'gnus-tree-mode 'mode-class 'special) (defun gnus-tree-make-menu-bar () (unless (boundp 'gnus-tree-menu) @@ -467,26 +477,20 @@ Two predefined functions are available: '("Tree" ["Select article" gnus-tree-select-article t])))) -(defun gnus-tree-mode () +(define-derived-mode gnus-tree-mode fundamental-mode "Tree" "Major mode for displaying thread trees." - (interactive) (gnus-set-format 'tree-mode) (gnus-set-format 'tree t) (when (gnus-visual-p 'tree-menu 'menu) (gnus-tree-make-menu-bar)) - (kill-all-local-variables) (gnus-simplify-mode-line) - (setq mode-name "Tree") - (setq major-mode 'gnus-tree-mode) - (use-local-map gnus-tree-mode-map) (buffer-disable-undo) (setq buffer-read-only t) (setq truncate-lines t) - (save-excursion + (save-current-buffer (gnus-set-work-buffer) (gnus-tree-node-insert (make-mail-header "") nil) - (setq gnus-tree-node-length (1- (point)))) - (gnus-run-mode-hooks 'gnus-tree-mode-hook)) + (setq gnus-tree-node-length (1- (point))))) (defun gnus-tree-read-summary-keys (&optional arg) "Read a summary buffer key sequence and execute it." @@ -562,7 +566,7 @@ Two predefined functions are available: (defun gnus-get-tree-buffer () "Return the tree buffer properly initialized." (with-current-buffer (gnus-get-buffer-create gnus-tree-buffer) - (unless (eq major-mode 'gnus-tree-mode) + (unless (derived-mode-p 'gnus-tree-mode) (gnus-tree-mode)) (current-buffer))) @@ -571,7 +575,7 @@ Two predefined functions are available: (not (one-window-p))) (let ((windows 0) tot-win-height) - (walk-windows (lambda (window) (incf windows))) + (walk-windows (lambda (_window) (incf windows))) (setq tot-win-height (- (frame-height) (* window-min-height (1- windows)) @@ -642,23 +646,41 @@ Two predefined functions are available: (when (or t (gnus-visual-p 'tree-highlight 'highlight)) (gnus-tree-highlight-node gnus-tmp-number beg end)))) +(defmacro gnus--let-eval (bindings evalsym &rest body) + "Build an environment in which to evaluate expressions. +BINDINGS is a `let'-style list of bindings to use for the environment. +EVALSYM is then bound in BODY to a function that takes a sexp and evaluates +it in the environment specified by BINDINGS." + (declare (indent 2) (debug ((&rest (sym form)) sym body))) + (if (ignore-errors (let ((x 3)) (eq (eval '(- x 1) '((x . 4))) x))) + ;; Use lexical vars if possible. + `(let* ((env (list ,@(mapcar (lambda (binding) + `(cons ',(car binding) ,(cadr binding))) + bindings))) + (,evalsym (lambda (exp) (eval exp env)))) + ,@body) + `(let (,@bindings (,evalsym #'eval)) ,@body))) + (defun gnus-tree-highlight-node (article beg end) "Highlight current line according to `gnus-summary-highlight'." (let ((list gnus-summary-highlight) face) (with-current-buffer gnus-summary-buffer - (let* ((score (or (cdr (assq article gnus-newsgroup-scored)) + (let ((uncached (memq article gnus-newsgroup-undownloaded))) + (gnus--let-eval + ((score (or (cdr (assq article gnus-newsgroup-scored)) gnus-summary-default-score 0)) (default gnus-summary-default-score) (default-high gnus-summary-default-high-score) (default-low gnus-summary-default-low-score) - (uncached (memq article gnus-newsgroup-undownloaded)) + (uncached uncached) (downloaded (not uncached)) (mark (or (gnus-summary-article-mark article) gnus-unread-mark))) - ;; Eval the cars of the lists until we find a match. - (while (and list - (not (eval (caar list)))) - (setq list (cdr list))))) + evalfun + ;; Eval the cars of the lists until we find a match. + (while (and list + (not (funcall evalfun (caar list)))) + (setq list (cdr list)))))) (unless (eq (setq face (cdar list)) (gnus-get-text-property-excluding-characters-with-faces beg 'face)) (gnus-put-text-property-excluding-characters-with-faces beg end 'face @@ -814,10 +836,10 @@ Two predefined functions are available: (gnus-generate-tree top) (setq gnus-tree-displayed-thread top)))))) -(defun gnus-tree-open (group) +(defun gnus-tree-open () (gnus-get-tree-buffer)) -(defun gnus-tree-close (group) +(defun gnus-tree-close () (gnus-kill-buffer gnus-tree-buffer)) (defun gnus-tree-perhaps-minimize () diff --git a/lisp/gnus/gnus-spec.el b/lisp/gnus/gnus-spec.el index 0ff8ec89ac1..a39f185b56d 100644 --- a/lisp/gnus/gnus-spec.el +++ b/lisp/gnus/gnus-spec.el @@ -512,7 +512,8 @@ are supported for %s." (delete-char -1)) (t (if (null args) - (error 'wrong-number-of-arguments #'my-format n fstring)) + (signal 'wrong-number-of-arguments + (list #'gnus-xmas-format n fstring))) (let* ((minlen (string-to-number (or (match-string 2) ""))) (arg (car args)) (str (if (stringp arg) arg (format "%s" arg))) diff --git a/lisp/gnus/gnus-srvr.el b/lisp/gnus/gnus-srvr.el index 69774587d80..2f151e570d7 100644 --- a/lisp/gnus/gnus-srvr.el +++ b/lisp/gnus/gnus-srvr.el @@ -244,6 +244,7 @@ For more in-depth information on this mode, read the manual The following commands are available: \\{gnus-server-mode-map}" + ;; FIXME: Use define-derived-mode. (interactive) (when (gnus-visual-p 'server-menu 'menu) (gnus-server-make-menu-bar)) @@ -869,7 +870,7 @@ claim them." (gnus-message 5 "Connecting to %s...done" (nth 1 method)) t)))) -(defun gnus-browse-mode () +(define-derived-mode gnus-browse-mode fundamental-mode "Browse Server" "Major mode for browsing a foreign server. All normal editing commands are switched off. @@ -884,20 +885,14 @@ buffer. 2) `\\[gnus-browse-read-group]' to read a group ephemerally. 3) `\\[gnus-browse-exit]' to return to the group buffer." - (interactive) - (kill-all-local-variables) (when (gnus-visual-p 'browse-menu 'menu) (gnus-browse-make-menu-bar)) (gnus-simplify-mode-line) - (setq major-mode 'gnus-browse-mode) - (setq mode-name "Browse Server") (setq mode-line-process nil) - (use-local-map gnus-browse-mode-map) (buffer-disable-undo) (setq truncate-lines t) (gnus-set-default-directory) - (setq buffer-read-only t) - (gnus-run-mode-hooks 'gnus-browse-mode-hook)) + (setq buffer-read-only t)) (defun gnus-browse-read-group (&optional no-article number) "Enter the group at the current line. @@ -1022,7 +1017,7 @@ doing the deletion." (defun gnus-browse-exit () "Quit browsing and return to the group buffer." (interactive) - (when (eq major-mode 'gnus-browse-mode) + (when (derived-mode-p 'gnus-browse-mode) (gnus-kill-buffer (current-buffer))) ;; Insert the newly subscribed groups in the group buffer. (with-current-buffer gnus-group-buffer diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index 94f4e703180..61cf7ec5b61 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -1140,7 +1140,6 @@ score: The article's score. default: The default article score. default-high: The default score for high scored articles. default-low: The default score for low scored articles. -below: The score below which articles are automatically marked as read. mark: The article's mark. uncached: Non-nil if the article is uncached." :group 'gnus-summary-visual @@ -3104,6 +3103,7 @@ buffer; read the info pages for more information (`\\[gnus-info-find-node]'). The following commands are available: \\{gnus-summary-mode-map}" + ;; FIXME: Use define-derived-mode. (interactive) (kill-all-local-variables) (let ((gnus-summary-local-variables gnus-newsgroup-variables)) @@ -3542,7 +3542,7 @@ If the setup was successful, non-nil is returned." "Set the global equivalents of the buffer-local variables. They are set to the latest values they had. These reflect the summary buffer that was in action when the last article was fetched." - (when (eq major-mode 'gnus-summary-mode) + (when (derived-mode-p 'gnus-summary-mode) (setq gnus-summary-buffer (current-buffer)) (let ((name gnus-newsgroup-name) (marked gnus-newsgroup-marked) @@ -3990,7 +3990,7 @@ If SELECT-ARTICLES, only select those articles from GROUP." t) ;; We couldn't select this group. ((null did-select) - (when (and (eq major-mode 'gnus-summary-mode) + (when (and (derived-mode-p 'gnus-summary-mode) (not (equal (current-buffer) kill-buffer))) (kill-buffer (current-buffer)) (if (not quit-config) @@ -4009,7 +4009,7 @@ If SELECT-ARTICLES, only select those articles from GROUP." ;; The user did a `C-g' while prompting for number of articles, ;; so we exit this group. ((eq did-select 'quit) - (and (eq major-mode 'gnus-summary-mode) + (and (derived-mode-p 'gnus-summary-mode) (not (equal (current-buffer) kill-buffer)) (kill-buffer (current-buffer))) (when kill-buffer @@ -4052,7 +4052,7 @@ If SELECT-ARTICLES, only select those articles from GROUP." (unless no-display (gnus-summary-prepare)) (when gnus-use-trees - (gnus-tree-open group) + (gnus-tree-open) (setq gnus-summary-highlight-line-function 'gnus-tree-highlight-article)) ;; If the summary buffer is empty, but there are some low-scored @@ -5612,7 +5612,7 @@ If SELECT-ARTICLES, only select those articles from GROUP." (or (and entry (not (eq (car entry) t))) ; Either it's active... (gnus-activate-group group) ; Or we can activate it... (progn ; Or we bug out. - (when (equal major-mode 'gnus-summary-mode) + (when (derived-mode-p 'gnus-summary-mode) (gnus-kill-buffer (current-buffer))) (error "Couldn't activate group %s: %s" @@ -5620,7 +5620,7 @@ If SELECT-ARTICLES, only select those articles from GROUP." (mm-decode-coding-string (gnus-status-message group) charset)))) (unless (gnus-request-group group t) - (when (equal major-mode 'gnus-summary-mode) + (when (derived-mode-p 'gnus-summary-mode) (gnus-kill-buffer (current-buffer))) (error "Couldn't request group %s: %s" (mm-decode-coding-string group charset) @@ -7257,7 +7257,7 @@ If FORCE (the prefix), also save the .newsrc file(s)." (when gnus-suppress-duplicates (gnus-dup-enter-articles)) (when gnus-use-trees - (gnus-tree-close group)) + (gnus-tree-close)) (when gnus-use-cache (gnus-cache-write-active)) ;; Remove entries for this group. @@ -7360,7 +7360,7 @@ If FORCE (the prefix), also save the .newsrc file(s)." (unless gnus-single-article-buffer (setq gnus-article-current nil)) (when gnus-use-trees - (gnus-tree-close group)) + (gnus-tree-close)) (gnus-async-prefetch-remove-group group) (when (get-buffer gnus-article-buffer) (bury-buffer gnus-article-buffer)) @@ -7383,9 +7383,9 @@ The state which existed when entering the ephemeral is reset." (unless (eq (cdr quit-config) 'group) (setq gnus-current-select-method (gnus-find-method-for-group gnus-newsgroup-name))) - (cond ((eq major-mode 'gnus-summary-mode) + (cond ((derived-mode-p 'gnus-summary-mode) (gnus-set-global-variables)) - ((eq major-mode 'gnus-article-mode) + ((derived-mode-p 'gnus-article-mode) (save-current-buffer ;; The `gnus-summary-buffer' variable may point ;; to the old summary buffer when using a single @@ -7400,7 +7400,7 @@ The state which existed when entering the ephemeral is reset." (gnus-configure-windows 'pick 'force) (gnus-configure-windows (cdr quit-config) 'force)) (gnus-configure-windows (cdr quit-config) 'force)) - (when (eq major-mode 'gnus-summary-mode) + (when (derived-mode-p 'gnus-summary-mode) (if (memq gnus-auto-select-on-ephemeral-exit '(next-noselect next-unread-noselect)) (when (zerop (cond ((eq gnus-auto-select-on-ephemeral-exit @@ -7470,7 +7470,7 @@ The state which existed when entering the ephemeral is reset." (when (and gnus-use-trees (gnus-buffer-exists-p buffer)) (with-current-buffer buffer - (gnus-tree-close gnus-newsgroup-name))) + (gnus-tree-close))) (gnus-kill-buffer buffer)) ;; Deaden the buffer. ((gnus-buffer-exists-p buffer) @@ -7699,7 +7699,7 @@ Given a prefix, will force an `article' buffer configuration." "Display ARTICLE in article buffer." (unless (and (gnus-buffer-live-p gnus-article-buffer) (with-current-buffer gnus-article-buffer - (eq major-mode 'gnus-article-mode))) + (derived-mode-p 'gnus-article-mode))) (gnus-article-setup-buffer)) (gnus-set-global-variables) (with-current-buffer gnus-article-buffer @@ -7731,7 +7731,7 @@ non-nil, the article will be re-fetched even if it already present in the article buffer. If PSEUDO is non-nil, pseudo-articles will also be displayed." ;; Make sure we are in the summary buffer to work around bbdb bug. - (unless (eq major-mode 'gnus-summary-mode) + (unless (derived-mode-p 'gnus-summary-mode) (set-buffer gnus-summary-buffer)) (let ((article (or article (gnus-summary-article-number))) (all-headers (not (not all-headers))) ;Must be t or nil. @@ -7783,7 +7783,7 @@ If SUBJECT, only articles with SUBJECT are selected. If BACKWARD, the previous article is selected instead of the next." (interactive "P") ;; Make sure we are in the summary buffer. - (unless (eq major-mode 'gnus-summary-mode) + (unless (derived-mode-p 'gnus-summary-mode) (set-buffer gnus-summary-buffer)) (cond ;; Is there such an article? @@ -12680,7 +12680,7 @@ UNREAD is a sorted list." (string-match "Summary" buffer) (with-current-buffer buffer ;; We check that this is, indeed, a summary buffer. - (and (eq major-mode 'gnus-summary-mode) + (and (derived-mode-p 'gnus-summary-mode) ;; Also make sure this isn't bogus. gnus-newsgroup-prepared ;; Also make sure that this isn't a @@ -12815,7 +12815,7 @@ returned." (defun gnus-summary-generic-mark (n mark move unread) "Mark N articles with MARK." - (unless (eq major-mode 'gnus-summary-mode) + (unless (derived-mode-p 'gnus-summary-mode) (error "This command can only be used in the summary buffer")) (gnus-summary-show-thread) (let ((nummove diff --git a/lisp/gnus/gnus-util.el b/lisp/gnus/gnus-util.el index 1d2ab2da248..b682e64716f 100644 --- a/lisp/gnus/gnus-util.el +++ b/lisp/gnus/gnus-util.el @@ -514,11 +514,14 @@ but also to the ones displayed in the echo area." (> message-log-max 0) (/= (length str) 0)) (setq time (current-time)) - (with-current-buffer (get-buffer-create "*Messages*") + (with-current-buffer (if (fboundp 'messages-buffer) + (messages-buffer) + (get-buffer-create "*Messages*")) (goto-char (point-max)) - (insert ,timestamp str "\n") - (forward-line (- message-log-max)) - (delete-region (point-min) (point)) + (let ((inhibit-read-only t)) + (insert ,timestamp str "\n") + (forward-line (- message-log-max)) + (delete-region (point-min) (point))) (goto-char (point-max)))) str) (gnus-add-timestamp-to-message @@ -1888,6 +1891,8 @@ empty directories from OLD-PATH." (get-char-table ,character ,display-table))) `(aref ,display-table ,character))) +(declare-function image-size "image.c" (spec &optional pixels frame)) + (defun gnus-rescale-image (image size) "Rescale IMAGE to SIZE if possible. SIZE is in format (WIDTH . HEIGHT). Return a new image. diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el index d6d6b3f8bed..a458b3fc25b 100644 --- a/lisp/gnus/message.el +++ b/lisp/gnus/message.el @@ -7947,17 +7947,6 @@ those headers." ;; falling back to message-tab-body-function. (lambda () (funcall fun) 'completion-attempted))))) -(eval-and-compile - (condition-case nil - (with-temp-buffer - (let ((standard-output (current-buffer))) - (eval '(display-completion-list nil ""))) - (defalias 'message-display-completion-list 'display-completion-list)) - (error ;; Don't use `wrong-number-of-arguments' here because of XEmacs. - (defun message-display-completion-list (completions &optional ignore) - "Display the list of completions, COMPLETIONS, using `standard-output'." - (display-completion-list completions))))) - (defun message-expand-group () "Expand the group name under point." (let ((b (save-excursion @@ -7982,12 +7971,12 @@ those headers." group) collection)) gnus-active-hashtb)) - (message-completion-in-region e b collection))) + (message-completion-in-region b e collection))) (defalias 'message-completion-in-region (if (fboundp 'completion-in-region) 'completion-in-region - (lambda (e b hashtb) + (lambda (b e hashtb) (let* ((string (buffer-substring b e)) (completions (all-completions string hashtb)) comp) @@ -8012,8 +8001,7 @@ those headers." (let ((buffer-read-only nil)) (erase-buffer) (let ((standard-output (current-buffer))) - (message-display-completion-list (sort completions 'string<) - string)) + (display-completion-list (sort completions 'string<))) (setq buffer-read-only nil) (goto-char (point-min)) (delete-region (point) diff --git a/lisp/gnus/mm-decode.el b/lisp/gnus/mm-decode.el index 28d930b55f7..941849da183 100644 --- a/lisp/gnus/mm-decode.el +++ b/lisp/gnus/mm-decode.el @@ -1415,7 +1415,7 @@ Return t if meta tag is added or replaced." (goto-char (point-min)) (if (re-search-forward "\ <meta\\s-+http-equiv=[\"']?content-type[\"']?\\s-+content=[\"']\ -text/\\(\\sw+\\)\\(?:\;\\s-*charset=\\(.+\\)\\)?[\"'][^>]*>" nil t) +text/\\(\\sw+\\)\\(?:\;\\s-*charset=\\([^\"'>]+\\)\\)?[^>]*>" nil t) (if (and (not force-charset) (match-beginning 2) (string-match "\\`html\\'" (match-string 1))) diff --git a/lisp/gnus/mm-util.el b/lisp/gnus/mm-util.el index 9c2f0df5f59..5b0fd6860a0 100644 --- a/lisp/gnus/mm-util.el +++ b/lisp/gnus/mm-util.el @@ -129,22 +129,6 @@ (multibyte-char-to-unibyte . identity) ;; `set-buffer-multibyte' is an Emacs function, not available in XEmacs. (set-buffer-multibyte . ignore) - ;; `special-display-p' is an Emacs function, not available in XEmacs. - (special-display-p - . ,(lambda (buffer-name) - "Returns non-nil if a buffer named BUFFER-NAME gets a special frame." - (and special-display-function - (or (and (member buffer-name special-display-buffer-names) t) - (cdr (assoc buffer-name special-display-buffer-names)) - (catch 'return - (dolist (elem special-display-regexps) - (and (stringp elem) - (string-match elem buffer-name) - (throw 'return t)) - (and (consp elem) - (stringp (car elem)) - (string-match (car elem) buffer-name) - (throw 'return (cdr elem))))))))) ;; `substring-no-properties' is available only in Emacs 22.1 or greater. (substring-no-properties . ,(lambda (string &optional from to) @@ -174,6 +158,25 @@ to the contents of the accessible portion of the buffer." (forward-line 0) (1+ (count-lines start (point)))))))))) +;; `special-display-p' is an Emacs function, not available in XEmacs. +(defalias 'mm-special-display-p + (if (featurep 'emacs) + 'special-display-p + (lambda (buffer-name) + "Returns non-nil if a buffer named BUFFER-NAME gets a special frame." + (and special-display-function + (or (and (member buffer-name special-display-buffer-names) t) + (cdr (assoc buffer-name special-display-buffer-names)) + (catch 'return + (dolist (elem special-display-regexps) + (and (stringp elem) + (string-match elem buffer-name) + (throw 'return t)) + (and (consp elem) + (stringp (car elem)) + (string-match (car elem) buffer-name) + (throw 'return (cdr elem)))))))))) + ;; `decode-coding-string', `encode-coding-string', `decode-coding-region' ;; and `encode-coding-region' are available in Emacs and XEmacs built with ;; the `file-coding' feature, but the XEmacs versions treat nil, that is diff --git a/lisp/gnus/mml2015.el b/lisp/gnus/mml2015.el index 3efa5c23bb3..a2fa1a1c532 100644 --- a/lisp/gnus/mml2015.el +++ b/lisp/gnus/mml2015.el @@ -866,6 +866,8 @@ If set, it overrides the setting of `mml2015-sign-with-sender'." (setq secret-keys (cdr secret-keys)))) secret-key)) +(autoload 'gnus-create-image "gnus-ems") + (defun mml2015-epg-key-image (key-id) "Return the image of a key, if any" (with-temp-buffer diff --git a/lisp/gnus/score-mode.el b/lisp/gnus/score-mode.el index ec24f1f9670..58767cfcc7a 100644 --- a/lisp/gnus/score-mode.el +++ b/lisp/gnus/score-mode.el @@ -40,13 +40,13 @@ (defvar gnus-score-edit-exit-function nil "Function run on exit from the score buffer.") -(defvar gnus-score-mode-map nil) -(unless gnus-score-mode-map - (setq gnus-score-mode-map (make-sparse-keymap)) - (set-keymap-parent gnus-score-mode-map emacs-lisp-mode-map) - (define-key gnus-score-mode-map "\C-c\C-c" 'gnus-score-edit-exit) - (define-key gnus-score-mode-map "\C-c\C-d" 'gnus-score-edit-insert-date) - (define-key gnus-score-mode-map "\C-c\C-p" 'gnus-score-pretty-print)) +(defvar gnus-score-mode-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map emacs-lisp-mode-map) + (define-key map "\C-c\C-c" 'gnus-score-edit-exit) + (define-key map "\C-c\C-d" 'gnus-score-edit-insert-date) + (define-key map "\C-c\C-p" 'gnus-score-pretty-print) + map)) (defvar score-mode-syntax-table (let ((table (copy-syntax-table lisp-mode-syntax-table))) @@ -58,21 +58,13 @@ (defvar score-mode-coding-system mm-universal-coding-system) ;;;###autoload -(defun gnus-score-mode () +(define-derived-mode gnus-score-mode emacs-lisp-mode "Score" "Mode for editing Gnus score files. This mode is an extended emacs-lisp mode. \\{gnus-score-mode-map}" - (interactive) - (kill-all-local-variables) - (use-local-map gnus-score-mode-map) (gnus-score-make-menu-bar) - (set-syntax-table score-mode-syntax-table) - (setq major-mode 'gnus-score-mode) - (setq mode-name "Score") - (lisp-mode-variables nil) - (make-local-variable 'gnus-score-edit-exit-function) - (gnus-run-mode-hooks 'emacs-lisp-mode-hook 'gnus-score-mode-hook)) + (make-local-variable 'gnus-score-edit-exit-function)) (defun gnus-score-make-menu-bar () (unless (boundp 'gnus-score-menu) diff --git a/lisp/help-mode.el b/lisp/help-mode.el index 5553556e03c..ec60d05f1da 100644 --- a/lisp/help-mode.el +++ b/lisp/help-mode.el @@ -295,16 +295,8 @@ Commands: ;;;###autoload (defun help-mode-finish () - (when (eq major-mode 'help-mode) + (when (derived-mode-p 'help-mode) (setq buffer-read-only t) - (save-excursion - (goto-char (point-min)) - (let ((inhibit-read-only t)) - (when (re-search-forward "^This [^[:space:]]+ is advised.$" nil t) - (put-text-property (match-beginning 0) - (match-end 0) - 'face 'font-lock-warning-face)))) - (help-make-xrefs (current-buffer)))) ;; Grokking cross-reference information in doc strings and diff --git a/lisp/help.el b/lisp/help.el index 4ec0b99a593..c21d5b8c1d1 100644 --- a/lisp/help.el +++ b/lisp/help.el @@ -1,7 +1,6 @@ ;;; help.el --- help commands for Emacs -;; Copyright (C) 1985-1986, 1993-1994, 1998-2013 Free Software -;; Foundation, Inc. +;; Copyright (C) 1985-1986, 1993-1994, 1998-2013 Free Software Foundation, Inc. ;; Maintainer: FSF ;; Keywords: help, internal @@ -412,7 +411,7 @@ With argument, display info only for the selected version." The number of messages retained in that buffer is specified by the variable `message-log-max'." (interactive) - (with-current-buffer (get-buffer-create "*Messages*") + (with-current-buffer (messages-buffer) (goto-char (point-max)) (display-buffer (current-buffer)))) diff --git a/lisp/ibuffer.el b/lisp/ibuffer.el index ce29505d6f2..cde6e2e3d43 100644 --- a/lisp/ibuffer.el +++ b/lisp/ibuffer.el @@ -156,7 +156,7 @@ elisp byte-compiler." (null buffer-file-name)) italic) (30 (memq major-mode ibuffer-help-buffer-modes) font-lock-comment-face) - (35 (eq major-mode 'dired-mode) font-lock-function-name-face)) + (35 (derived-mode-p 'dired-mode) font-lock-function-name-face)) "An alist describing how to fontify buffers. Each element should be of the form (PRIORITY FORM FACE), where PRIORITY is an integer, FORM is an arbitrary form to evaluate in the @@ -2358,7 +2358,7 @@ FORMATS is the value to use for `ibuffer-formats'. ;; We switch to the buffer's window in order to be able ;; to modify the value of point (select-window (get-buffer-window buf 0)) - (or (eq major-mode 'ibuffer-mode) + (or (derived-mode-p 'ibuffer-mode) (ibuffer-mode)) (setq ibuffer-restore-window-config-on-quit other-window-p) (when shrink @@ -2383,7 +2383,7 @@ FORMATS is the value to use for `ibuffer-formats'. (message "Commands: m, u, t, RET, g, k, S, D, Q; q to quit; h for help")))))) (put 'ibuffer-mode 'mode-class 'special) -(defun ibuffer-mode () +(define-derived-mode ibuffer-mode special-mode "IBuffer" "A major mode for viewing a list of buffers. In Ibuffer, you can conveniently perform many operations on the currently open buffers, in addition to filtering your view to a @@ -2564,10 +2564,6 @@ filter groups are displayed in this order of precedence. You may rearrange filter groups by using the regular '\\[ibuffer-kill-line]' and '\\[ibuffer-yank]' pair. Yanked groups will be inserted before the group at point." - (kill-all-local-variables) - (use-local-map ibuffer-mode-map) - (setq major-mode 'ibuffer-mode) - (setq mode-name "Ibuffer") ;; Include state info next to the mode name. (set (make-local-variable 'mode-line-process) '(" by " @@ -2627,8 +2623,7 @@ will be inserted before the group at point." (ibuffer-update-format) (when ibuffer-default-directory (setq default-directory ibuffer-default-directory)) - (add-hook 'change-major-mode-hook 'font-lock-defontify nil t) - (run-mode-hooks 'ibuffer-mode-hook)) + (add-hook 'change-major-mode-hook 'font-lock-defontify nil t)) ;;; Start of automatically extracted autoloads. diff --git a/lisp/icomplete.el b/lisp/icomplete.el index 104e3363831..13ada93b1f3 100644 --- a/lisp/icomplete.el +++ b/lisp/icomplete.el @@ -114,6 +114,9 @@ See `icomplete-delay-completions-threshold'." :type 'integer :group 'icomplete) +(defvar icomplete-in-buffer nil + "If non-nil, also use Icomplete when completing in non-mini buffers.") + (defcustom icomplete-minibuffer-setup-hook nil "Icomplete-specific customization of minibuffer setup. @@ -140,29 +143,22 @@ icompletion is occurring." (defvar icomplete-overlay (make-overlay (point-min) (point-min) nil t t) "Overlay used to display the list of completions.") -;;;_ = icomplete-pre-command-hook -(defvar icomplete-pre-command-hook nil - "Incremental-minibuffer-completion pre-command-hook. - -Is run in minibuffer before user input when `icomplete-mode' is non-nil. -Use `icomplete-mode' function to set it up properly for incremental -minibuffer completion.") -(add-hook 'icomplete-pre-command-hook 'icomplete-tidy) -;;;_ = icomplete-post-command-hook -(defvar icomplete-post-command-hook nil - "Incremental-minibuffer-completion post-command-hook. +(defun icomplete-pre-command-hook () + (let ((non-essential t)) + (icomplete-tidy))) -Is run in minibuffer after user input when `icomplete-mode' is non-nil. -Use `icomplete-mode' function to set it up properly for incremental -minibuffer completion.") -(add-hook 'icomplete-post-command-hook 'icomplete-exhibit) +(defun icomplete-post-command-hook () + (let ((non-essential t)) ;E.g. don't prompt for password! + (icomplete-exhibit))) ;;;_ = icomplete-with-completion-tables -(defvar icomplete-with-completion-tables '(internal-complete-buffer) +(defcustom icomplete-with-completion-tables t "Specialized completion tables with which icomplete should operate. Icomplete does not operate with any specialized completion tables -except those on this list.") +except those on this list." + :type '(choice (const :tag "All" t) + (repeat function))) (defvar icomplete-minibuffer-map (let ((map (make-sparse-keymap))) @@ -177,24 +173,28 @@ except those on this list.") Second entry becomes the first and can be selected with `minibuffer-force-complete-and-exit'." (interactive) - (let* ((comps (completion-all-sorted-completions)) + (let* ((beg (icomplete--field-beg)) + (end (icomplete--field-end)) + (comps (completion-all-sorted-completions beg end)) (last (last comps))) (when comps (setcdr last (cons (car comps) (cdr last))) - (completion--cache-all-sorted-completions (cdr comps))))) + (completion--cache-all-sorted-completions beg end (cdr comps))))) (defun icomplete-backward-completions () "Step backward completions by one entry. Last entry becomes the first and can be selected with `minibuffer-force-complete-and-exit'." (interactive) - (let* ((comps (completion-all-sorted-completions)) + (let* ((beg (icomplete--field-beg)) + (end (icomplete--field-end)) + (comps (completion-all-sorted-completions beg end)) (last-but-one (last comps 2)) (last (cdr last-but-one))) (when (consp last) ; At least two elements in comps (setcdr last-but-one (cdr last)) (push (car last) comps) - (completion--cache-all-sorted-completions comps)))) + (completion--cache-all-sorted-completions beg end comps)))) ;;;_ > icomplete-mode (&optional prefix) ;;;###autoload @@ -204,11 +204,32 @@ With a prefix argument ARG, enable Icomplete mode if ARG is positive, and disable it otherwise. If called from Lisp, enable the mode if ARG is omitted or nil." :global t :group 'icomplete - (if icomplete-mode - ;; The following is not really necessary after first time - - ;; no great loss. - (add-hook 'minibuffer-setup-hook 'icomplete-minibuffer-setup) - (remove-hook 'minibuffer-setup-hook 'icomplete-minibuffer-setup))) + (remove-hook 'minibuffer-setup-hook #'icomplete-minibuffer-setup) + (remove-hook 'completion-in-region-mode-hook #'icomplete--in-region-setup) + (when icomplete-mode + (when icomplete-in-buffer + (add-hook 'completion-in-region-mode-hook #'icomplete--in-region-setup)) + (add-hook 'minibuffer-setup-hook #'icomplete-minibuffer-setup))) + +(defun icomplete--completion-table () + (if (window-minibuffer-p) minibuffer-completion-table + (or (nth 2 completion-in-region--data) + (message "In %S (w=%S): %S" + (current-buffer) (selected-window) (window-minibuffer-p))))) +(defun icomplete--completion-predicate () + (if (window-minibuffer-p) minibuffer-completion-predicate + (nth 3 completion-in-region--data))) +(defun icomplete--field-string () + (if (window-minibuffer-p) (minibuffer-contents) + (buffer-substring-no-properties + (nth 0 completion-in-region--data) + (nth 1 completion-in-region--data)))) +(defun icomplete--field-beg () + (if (window-minibuffer-p) (minibuffer-prompt-end) + (nth 0 completion-in-region--data))) +(defun icomplete--field-end () + (if (window-minibuffer-p) (point-max) + (nth 1 completion-in-region--data))) ;;;_ > icomplete-simple-completing-p () (defun icomplete-simple-completing-p () @@ -217,17 +238,16 @@ the mode if ARG is omitted or nil." Conditions are: the selected window is a minibuffer, and not in the middle of macro execution, - and `minibuffer-completion-table' is not a symbol (which would + and the completion table is not a function (which would indicate some non-standard, non-simple completion mechanism, like file-name and other custom-func completions)." - (and (window-minibuffer-p) - (not executing-kbd-macro) - minibuffer-completion-table - (or (not (functionp minibuffer-completion-table)) - (eq icomplete-with-completion-tables t) - (member minibuffer-completion-table - icomplete-with-completion-tables)))) + (unless executing-kbd-macro + (let ((table (icomplete--completion-table))) + (and table + (or (not (functionp table)) + (eq icomplete-with-completion-tables t) + (member table icomplete-with-completion-tables)))))) ;;;_ > icomplete-minibuffer-setup () (defun icomplete-minibuffer-setup () @@ -237,16 +257,35 @@ Usually run by inclusion in `minibuffer-setup-hook'." (set (make-local-variable 'completion-show-inline-help) nil) (use-local-map (make-composed-keymap icomplete-minibuffer-map (current-local-map))) - (add-hook 'pre-command-hook - (lambda () (let ((non-essential t)) - (run-hooks 'icomplete-pre-command-hook))) - nil t) - (add-hook 'post-command-hook - (lambda () (let ((non-essential t)) ;E.g. don't prompt for password! - (run-hooks 'icomplete-post-command-hook))) - nil t) + (add-hook 'pre-command-hook #'icomplete-pre-command-hook nil t) + (add-hook 'post-command-hook #'icomplete-post-command-hook nil t) (run-hooks 'icomplete-minibuffer-setup-hook))) -; + +(defvar icomplete--in-region-buffer nil) + +(defun icomplete--in-region-setup () + (when (or (not completion-in-region-mode) + (and icomplete--in-region-buffer + (not (eq icomplete--in-region-buffer (current-buffer))))) + (with-current-buffer (or icomplete--in-region-buffer (current-buffer)) + (setq icomplete--in-region-buffer nil) + (delete-overlay icomplete-overlay) + (kill-local-variable 'completion-show-inline-help) + (remove-hook 'pre-command-hook 'icomplete-pre-command-hook t) + (remove-hook 'post-command-hook 'icomplete-post-command-hook t) + (message nil))) + (when (and completion-in-region-mode + icomplete-mode (icomplete-simple-completing-p)) + (setq icomplete--in-region-buffer (current-buffer)) + (set (make-local-variable 'completion-show-inline-help) nil) + (let ((tem (assq 'completion-in-region-mode + minor-mode-overriding-map-alist))) + (unless (memq icomplete-minibuffer-map (cdr tem)) + (setcdr tem (make-composed-keymap icomplete-minibuffer-map + (cdr tem))))) + (add-hook 'pre-command-hook 'icomplete-pre-command-hook nil t) + (add-hook 'post-command-hook 'icomplete-post-command-hook nil t))) + ;;;_* Completion @@ -263,32 +302,36 @@ and `minibuffer-setup-hook'." "Insert icomplete completions display. Should be run via minibuffer `post-command-hook'. See `icomplete-mode' and `minibuffer-setup-hook'." - (when (and icomplete-mode (icomplete-simple-completing-p)) + (when (and icomplete-mode + (icomplete-simple-completing-p)) ;Shouldn't be necessary. (save-excursion (goto-char (point-max)) ; Insert the match-status information: - (if (and (> (point-max) (minibuffer-prompt-end)) + (if (and (> (icomplete--field-end) (icomplete--field-beg)) buffer-undo-list ; Wait for some user input. (or ;; Don't bother with delay after certain number of chars: - (> (- (point) (field-beginning)) icomplete-max-delay-chars) + (> (- (point) (icomplete--field-beg)) + icomplete-max-delay-chars) ;; Don't delay if the completions are known. completion-all-sorted-completions ;; Don't delay if alternatives number is small enough: - (and (sequencep minibuffer-completion-table) - (< (length minibuffer-completion-table) + (and (sequencep (icomplete--completion-table)) + (< (length (icomplete--completion-table)) icomplete-delay-completions-threshold)) ;; Delay - give some grace time for next keystroke, before ;; embarking on computing completions: (sit-for icomplete-compute-delay))) - (let ((text (while-no-input - (icomplete-completions - (field-string) - minibuffer-completion-table - minibuffer-completion-predicate - (not minibuffer-completion-confirm)))) - (buffer-undo-list t) - deactivate-mark) + (let* ((field-string (icomplete--field-string)) + (text (while-no-input + (icomplete-completions + field-string + (icomplete--completion-table) + (icomplete--completion-predicate) + (if (window-minibuffer-p) + (not minibuffer-completion-confirm))))) + (buffer-undo-list t) + deactivate-mark) ;; Do nothing if while-no-input was aborted. (when (stringp text) (move-overlay icomplete-overlay (point) (point) (current-buffer)) @@ -318,15 +361,19 @@ The displays for unambiguous matches have ` [Matched]' appended matches exist. \(Keybindings for uniquely matched commands are exhibited within the square braces.)" - (let* ((md (completion--field-metadata (field-beginning))) - (comps (completion-all-sorted-completions)) + (let* ((minibuffer-completion-table candidates) + (minibuffer-completion-predicate predicate) + (md (completion--field-metadata (icomplete--field-beg))) + (comps (completion-all-sorted-completions + (icomplete--field-beg) (icomplete--field-end))) (last (if (consp comps) (last comps))) (base-size (cdr last)) (open-bracket (if require-match "(" "[")) (close-bracket (if require-match ")" "]"))) ;; `concat'/`mapconcat' is the slow part. (if (not (consp comps)) - (format " %sNo matches%s" open-bracket close-bracket) + (progn ;;(debug (format "Candidates=%S field=%S" candidates name)) + (format " %sNo matches%s" open-bracket close-bracket)) (if last (setcdr last nil)) (let* ((most-try (if (and base-size (> base-size 0)) @@ -381,7 +428,7 @@ are exhibited within the square braces.)" ;; Else, use try-completion. (and (stringp prefix) (length prefix))) ;;) prospects comp limit) - (if (eq most-try t) ;; (or (null (cdr comps)) + (if (or (eq most-try t) (not (consp (cdr comps)))) (setq prospects nil) (when (member name comps) ;; NAME is complete but not unique. This scenario poses diff --git a/lisp/image.el b/lisp/image.el index 6c15a7d0b96..91cc3addb06 100644 --- a/lisp/image.el +++ b/lisp/image.el @@ -291,6 +291,7 @@ be determined." (setq types (cdr types))))) (goto-char opoint) (and type + (boundp 'image-types) (memq type image-types) type))) @@ -624,13 +625,14 @@ The actual return value is a cons (NIMAGES . DELAY), where NIMAGES is the number of frames (or sub-images) in the image and DELAY is the delay in seconds that the image specifies between each frame. DELAY may be nil, in which case you might want to use `image-default-frame-delay'." - (let* ((metadata (image-metadata image)) - (images (plist-get metadata 'count)) - (delay (plist-get metadata 'delay))) - (when (and images (> images 1)) - (if (or (not (numberp delay)) (< delay 0)) - (setq delay image-default-frame-delay)) - (cons images delay)))) + (when (fboundp 'image-metadata) + (let* ((metadata (image-metadata image)) + (images (plist-get metadata 'count)) + (delay (plist-get metadata 'delay))) + (when (and images (> images 1)) + (if (or (not (numberp delay)) (< delay 0)) + (setq delay image-default-frame-delay)) + (cons images delay))))) (defun image-animated-p (image) "Like `image-multi-frame-p', but returns nil if no delay is specified." diff --git a/lisp/info.el b/lisp/info.el index 182ad8563aa..93442689319 100644 --- a/lisp/info.el +++ b/lisp/info.el @@ -790,7 +790,7 @@ See a list of available Info commands in `Info-mode'." (defun info-setup (file-or-node buffer) "Display Info node FILE-OR-NODE in BUFFER." - (if (and buffer (not (eq major-mode 'Info-mode))) + (if (and buffer (not (derived-mode-p 'Info-mode))) (Info-mode)) (if file-or-node ;; If argument already contains parentheses, don't add another set @@ -931,7 +931,7 @@ STRICT-CASE is non-nil)." (info-initialize) (setq filename (Info-find-file filename)) ;; Go into Info buffer. - (or (eq major-mode 'Info-mode) (switch-to-buffer "*info*")) + (or (derived-mode-p 'Info-mode) (switch-to-buffer "*info*")) ;; Record the node we are leaving, if we were in one. (and (not no-going-back) Info-current-file @@ -961,7 +961,7 @@ otherwise, that defaults to `Top'." "Go to an Info node FILENAME and NODENAME, re-reading disk contents. When *info* is already displaying FILENAME and NODENAME, the window position is preserved, if possible." - (or (eq major-mode 'Info-mode) (switch-to-buffer "*info*")) + (or (derived-mode-p 'Info-mode) (switch-to-buffer "*info*")) (let ((old-filename Info-current-file) (old-nodename Info-current-node) (window-selected (eq (selected-window) (get-buffer-window))) @@ -1065,7 +1065,7 @@ is non-nil)." (defun Info-find-node-2 (filename nodename &optional no-going-back strict-case) (buffer-disable-undo (current-buffer)) - (or (eq major-mode 'Info-mode) + (or (derived-mode-p 'Info-mode) (Info-mode)) (widen) (setq Info-current-node nil) @@ -1595,17 +1595,20 @@ escaped (\\\",\\\\)." "")) (image (if (file-exists-p image-file) (create-image image-file) - "[broken image]"))) + (or (cdr (assoc-string "text" parameter-alist)) + (and src (concat "[broken image:" src "]")) + "[broken image]")))) (if (not (get-text-property start 'display)) (add-text-properties - start (point) `(display ,image rear-nonsticky (display))))) + start (point) + `(display ,image rear-nonsticky (display) + help-echo ,(cdr (assoc-string "alt" parameter-alist)))))) ;; text-only display, show alternative text if provided, or ;; otherwise a clue that there's meant to be a picture (delete-region start (point)) (insert (or (cdr (assoc-string "text" parameter-alist)) (cdr (assoc-string "alt" parameter-alist)) - (and src - (concat "[image:" src "]")) + (and src (concat "[image:" src "]")) "[image]")))))) (set-buffer-modified-p nil))) @@ -2209,7 +2212,7 @@ End of submatch 0, 1, and 3 are the same, so you can safely concat." (interactive) ;; In case another window is currently selected (save-window-excursion - (or (eq major-mode 'Info-mode) (switch-to-buffer "*info*")) + (or (derived-mode-p 'Info-mode) (switch-to-buffer "*info*")) (Info-goto-node (Info-extract-pointer "next")))) (defun Info-prev () @@ -2217,7 +2220,7 @@ End of submatch 0, 1, and 3 are the same, so you can safely concat." (interactive) ;; In case another window is currently selected (save-window-excursion - (or (eq major-mode 'Info-mode) (switch-to-buffer "*info*")) + (or (derived-mode-p 'Info-mode) (switch-to-buffer "*info*")) (Info-goto-node (Info-extract-pointer "prev[ious]*" "previous")))) (defun Info-up (&optional same-file) @@ -2226,7 +2229,7 @@ If SAME-FILE is non-nil, do not move to a different Info file." (interactive) ;; In case another window is currently selected (save-window-excursion - (or (eq major-mode 'Info-mode) (switch-to-buffer "*info*")) + (or (derived-mode-p 'Info-mode) (switch-to-buffer "*info*")) (let ((old-node Info-current-node) (old-file Info-current-file) (node (Info-extract-pointer "up")) p) @@ -4079,7 +4082,7 @@ If FORK is non-nil, it is passed to `Info-goto-node'." (defun Info-menu-update () "Update the Info menu for the current node." (condition-case nil - (if (or (not (eq major-mode 'Info-mode)) + (if (or (not (derived-mode-p 'Info-mode)) (equal (list Info-current-file Info-current-node) Info-menu-last-node)) () @@ -4282,7 +4285,7 @@ Advanced commands: ;; When an Info buffer is killed, make sure the associated tags buffer ;; is killed too. (defun Info-kill-buffer () - (and (eq major-mode 'Info-mode) + (and (derived-mode-p 'Info-mode) Info-tag-table-buffer (kill-buffer Info-tag-table-buffer))) @@ -4299,10 +4302,11 @@ Advanced commands: (copy-marker (marker-position m))) (make-marker)))))) -(defvar Info-edit-map (let ((map (make-sparse-keymap))) - (set-keymap-parent map text-mode-map) - (define-key map "\C-c\C-c" 'Info-cease-edit) - map) +(define-obsolete-variable-alias 'Info-edit-map 'Info-edit-mode-map "24.1") +(defvar Info-edit-mode-map (let ((map (make-sparse-keymap))) + (set-keymap-parent map text-mode-map) + (define-key map "\C-c\C-c" 'Info-cease-edit) + map) "Local keymap used within `e' command of Info.") (make-obsolete-variable 'Info-edit-map @@ -4312,19 +4316,14 @@ Advanced commands: ;; Info-edit mode is suitable only for specially formatted data. (put 'Info-edit-mode 'mode-class 'special) -(defun Info-edit-mode () +(define-derived-mode Info-edit-mode text-mode "Info Edit" "Major mode for editing the contents of an Info node. Like text mode with the addition of `Info-cease-edit' which returns to Info mode for browsing. \\{Info-edit-map}" - (use-local-map Info-edit-map) - (setq major-mode 'Info-edit-mode) - (setq mode-name "Info Edit") - (kill-local-variable 'mode-line-buffer-identification) (setq buffer-read-only nil) (force-mode-line-update) - (buffer-enable-undo (current-buffer)) - (run-mode-hooks 'Info-edit-mode-hook)) + (buffer-enable-undo (current-buffer))) (make-obsolete 'Info-edit-mode "editing Info nodes by hand is not recommended." "24.4") @@ -4349,11 +4348,7 @@ This feature will be removed in future.") (and (buffer-modified-p) (y-or-n-p "Save the file? ") (save-buffer)) - (use-local-map Info-mode-map) - (setq major-mode 'Info-mode) - (setq mode-name "Info") - (Info-set-mode-line) - (setq buffer-read-only t) + (Info-mode) (force-mode-line-update) (and (marker-position Info-tag-table-marker) (buffer-modified-p) @@ -4466,7 +4461,7 @@ COMMAND must be a symbol or string." ;; Get Info running, and pop to it in another window. (save-window-excursion (info)) - (or (eq major-mode 'Info-mode) (pop-to-buffer "*info*")) + (or (derived-mode-p 'Info-mode) (pop-to-buffer "*info*")) ;; Bind Info-history to nil, to prevent the last Index node ;; visited by Info-find-emacs-command-nodes from being ;; pushed onto the history. @@ -5130,7 +5125,7 @@ INDENT is the current indentation depth." NODESPEC is a string of the form: (file)node." ;; Set up a buffer we can use to fake-out Info. (with-current-buffer (get-buffer-create " *info-browse-tmp*") - (if (not (equal major-mode 'Info-mode)) + (if (not (derived-mode-p 'Info-mode)) (Info-mode)) ;; Get the node into this buffer (if (not (string-match "^(\\([^)]+\\))\\([^.]+\\)$" nodespec)) diff --git a/lisp/international/characters.el b/lisp/international/characters.el index ce6256c1e47..ab83ff0034a 100644 --- a/lisp/international/characters.el +++ b/lisp/international/characters.el @@ -792,7 +792,7 @@ with L, LRE, or LRO Unicode bidi character type.") ;; Combining diacritics (modify-category-entry '(#x300 . #x362) ?^) ;; Combining marks - (modify-category-entry '(#x20d0 . #x20e3) ?^) + (modify-category-entry '(#x20d0 . #x20ff) ?^) ;; Fixme: syntax for symbols &c ) diff --git a/lisp/kmacro.el b/lisp/kmacro.el index d6de2feb3fc..d20b54eba35 100644 --- a/lisp/kmacro.el +++ b/lisp/kmacro.el @@ -1194,12 +1194,10 @@ following additional answers: `insert', `insert-1', `replace', `replace-1', (setq cmd 'ignore) nil) ((memq cmd kmacro-step-edit-prefix-commands) - (setq universal-argument-num-events 0) (reset-this-command-lengths) nil) ((eq cmd 'universal-argument-other-key) (setq kmacro-step-edit-action t) - (setq universal-argument-num-events 0) (reset-this-command-lengths) (if (numberp kmacro-step-edit-inserting) (setq kmacro-step-edit-inserting nil)) @@ -1214,7 +1212,6 @@ following additional answers: `insert', `insert-1', `replace', `replace-1', (setq kmacro-step-edit-prefix-index nil) (reset-this-command-lengths) (setq overriding-terminal-local-map nil) - (setq universal-argument-num-events nil) (setq next-index kmacro-step-edit-key-index) t) (t nil)) diff --git a/lisp/locate.el b/lisp/locate.el index ab0417070e7..99a99853da9 100644 --- a/lisp/locate.el +++ b/lisp/locate.el @@ -95,7 +95,7 @@ ;; ;; (defadvice dired-make-relative (before set-no-error activate) ;; "For locate mode and Windows, don't return errors" -;; (if (and (eq major-mode 'locate-mode) +;; (if (and (derived-mode-p 'locate-mode) ;; (memq system-type '(windows-nt ms-dos))) ;; (ad-set-arg 2 t) ;; )) @@ -448,7 +448,7 @@ file name or is inside a subdirectory." ;; Define a mode for locate ;; Default directory is set to "/" so that dired commands, which ;; expect to be in a tree, will work properly -(defun locate-mode () +(define-derived-mode locate-mode special-mode "Locate" "Major mode for the `*Locate*' buffer made by \\[locate]. \\<locate-mode-map>\ In that buffer, you can use almost all the usual dired bindings. @@ -463,39 +463,31 @@ Specific `locate-mode' commands, such as \\[locate-find-directory], do not work in subdirectories. \\{locate-mode-map}" - ;; Not to be called interactively. - (kill-all-local-variables) ;; Avoid clobbering this variable (make-local-variable 'dired-subdir-alist) - (use-local-map locate-mode-map) - (setq major-mode 'locate-mode - mode-name "Locate" - default-directory "/" + (setq default-directory "/" buffer-read-only t selective-display t) (dired-alist-add-1 default-directory (point-min-marker)) (set (make-local-variable 'dired-directory) "/") (set (make-local-variable 'dired-subdir-switches) locate-ls-subdir-switches) (setq dired-switches-alist nil) - (make-local-variable 'directory-listing-before-filename-regexp) ;; This should support both Unix and Windoze style names - (setq directory-listing-before-filename-regexp - (concat "^.\\(" - (make-string (1- locate-filename-indentation) ?\s) - "\\)\\|" - (default-value 'directory-listing-before-filename-regexp))) - (make-local-variable 'dired-actual-switches) - (setq dired-actual-switches "") - (make-local-variable 'dired-permission-flags-regexp) - (setq dired-permission-flags-regexp - (concat "^.\\(" - (make-string (1- locate-filename-indentation) ?\s) - "\\)\\|" - (default-value 'dired-permission-flags-regexp))) - (make-local-variable 'revert-buffer-function) - (setq revert-buffer-function 'locate-update) - (set (make-local-variable 'page-delimiter) "\n\n") - (run-mode-hooks 'locate-mode-hook)) + (setq-local directory-listing-before-filename-regexp + (concat "^.\\(" + (make-string (1- locate-filename-indentation) ?\s) + "\\)\\|" + (default-value + 'directory-listing-before-filename-regexp))) + (setq-local dired-actual-switches "") + (setq-local dired-permission-flags-regexp + (concat "^.\\(" + (make-string (1- locate-filename-indentation) ?\s) + "\\)\\|" + (default-value 'dired-permission-flags-regexp))) + + (setq-local revert-buffer-function #'locate-update) + (setq-local page-delimiter "\n\n")) (put 'locate-mode 'derived-mode-parent 'dired-mode) (defun locate-do-setup (search-string) diff --git a/lisp/ls-lisp.el b/lisp/ls-lisp.el index 82a78545d62..67bcdc8c82b 100644 --- a/lisp/ls-lisp.el +++ b/lisp/ls-lisp.el @@ -27,11 +27,9 @@ ;; OVERVIEW ========================================================== -;; This file redefines the function `insert-directory' to implement it -;; directly from Emacs lisp, without running ls in a subprocess. It -;; is useful if you cannot afford to fork Emacs on a real memory UNIX, -;; or other non-UNIX platforms if you don't have the ls -;; program, or if you want a different format from what ls offers. +;; This file advises the function `insert-directory' to implement it +;; directly from Emacs lisp, without running ls in a subprocess. +;; This is useful if you don't have ls installed (ie, on MS Windows). ;; This function can use regexps instead of shell wildcards. If you ;; enter regexps remember to double each $ sign. For example, to @@ -198,9 +196,6 @@ to fail to line up, e.g. if month names are not all of the same length." :type 'boolean :group 'ls-lisp) -(defvar original-insert-directory nil - "This holds the original function definition of `insert-directory'.") - (defvar ls-lisp-uid-d-fmt "-%d" "Format to display integer UIDs.") (defvar ls-lisp-uid-s-fmt "-%s" @@ -213,15 +208,10 @@ to fail to line up, e.g. if month names are not all of the same length." "Format to display integer file sizes.") (defvar ls-lisp-filesize-f-fmt "%.0f" "Format to display float file sizes.") - -;; Remember the original insert-directory function -(or (featurep 'ls-lisp) ; FJW: unless this file is being reloaded! - (setq original-insert-directory (symbol-function 'insert-directory))) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun insert-directory (file switches &optional wildcard full-directory-p) +(defun ls-lisp--insert-directory (orig-fun file switches &optional wildcard full-directory-p) "Insert directory listing for FILE, formatted according to SWITCHES. Leaves point after the inserted text. SWITCHES may be a string of options, or a list of strings. @@ -231,12 +221,10 @@ switches do not contain `d', so that a full listing is expected. This version of the function comes from `ls-lisp.el'. If the value of `ls-lisp-use-insert-directory-program' is non-nil then -it works exactly like the version from `files.el' and runs a directory -listing program whose name is in the variable -`insert-directory-program'; if also WILDCARD is non-nil then it runs -the shell specified by `shell-file-name'. If the value of -`ls-lisp-use-insert-directory-program' is nil then it runs a Lisp -emulation. +this advice just delegates the work to ORIG-FUN (the normal `insert-directory' +function from `files.el'). +But if the value of `ls-lisp-use-insert-directory-program' is nil +then it runs a Lisp emulation. The Lisp emulation does not run any external programs or shells. It supports ordinary shell wildcards if `ls-lisp-support-shell-wildcards' @@ -245,7 +233,7 @@ to match file names. It does not support all `ls' switches -- those that work are: A a B C c F G g h i n R r S s t U u X. The l switch is assumed to be always present and cannot be turned off." (if ls-lisp-use-insert-directory-program - (funcall original-insert-directory + (funcall orig-fun file switches wildcard full-directory-p) ;; We need the directory in order to find the right handler. (let ((handler (find-file-name-handler (expand-file-name file) @@ -305,6 +293,7 @@ is assumed to be always present and cannot be turned off." (replace-match "total used in directory") (end-of-line) (insert " available " available))))))))) +(advice-add 'insert-directory :around #'ls-lisp--insert-directory) (defun ls-lisp-insert-directory (file switches time-index wildcard-regexp full-directory-p) diff --git a/lisp/mail/emacsbug.el b/lisp/mail/emacsbug.el index c1bc7e2e1ab..e045519e850 100644 --- a/lisp/mail/emacsbug.el +++ b/lisp/mail/emacsbug.el @@ -1,7 +1,7 @@ ;;; emacsbug.el --- command to report Emacs bugs to appropriate mailing list -;; Copyright (C) 1985, 1994, 1997-1998, 2000-2013 Free Software -;; Foundation, Inc. +;; Copyright (C) 1985, 1994, 1997-1998, 2000-2013 +;; Free Software Foundation, Inc. ;; Author: K. Shane Hartman ;; Maintainer: FSF @@ -160,7 +160,7 @@ Prompts for bug subject. Leaves you in a mail buffer." (report-emacs-bug-can-use-osx-open))) user-point message-end-point) (setq message-end-point - (with-current-buffer (get-buffer-create "*Messages*") + (with-current-buffer (messages-buffer) (point-max-marker))) (compose-mail report-emacs-bug-address topic) ;; The rest of this does not execute if the user was asked to diff --git a/lisp/mail/mspools.el b/lisp/mail/mspools.el index 5e01a7149a8..b2618ef42db 100644 --- a/lisp/mail/mspools.el +++ b/lisp/mail/mspools.el @@ -344,19 +344,13 @@ nil." (interactive) (kill-buffer mspools-buffer)) -(defun mspools-mode () +(define-derived-mode mspools-mode special-mode "MSpools" "Major mode for output from mspools-show. \\<mspools-mode-map>Move point to one of the items in this buffer, then use \\[mspools-visit-spool] to go to the spool that the current line refers to. \\[revert-buffer] to regenerate the list of spools. \\{mspools-mode-map}" - (kill-all-local-variables) - (make-local-variable 'revert-buffer-function) - (setq revert-buffer-function 'mspools-revert-buffer) - (use-local-map mspools-mode-map) - (setq major-mode 'mspools-mode) - (setq mode-name "MSpools") - (run-mode-hooks 'mspools-mode-hook)) + (setq-local revert-buffer-function 'mspools-revert-buffer)) (defun mspools-get-spool-files () "Find the list of spool files and display them in *spools* buffer." diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el index aa244ddae81..246ee5f566a 100644 --- a/lisp/mail/rmail.el +++ b/lisp/mail/rmail.el @@ -4668,7 +4668,7 @@ With prefix argument N moves forward N messages with these labels. ;;;*** -;;;### (autoloads (rmail-mime) "rmailmm" "rmailmm.el" "93951f748e43e1015da1b485088970ca") +;;;### (autoloads nil "rmailmm" "rmailmm.el" "8c14f4cf6e7dacb0c94fd300d814caf7") ;;; Generated autoloads from rmailmm.el (autoload 'rmail-mime "rmailmm" "\ @@ -4768,7 +4768,7 @@ If prefix argument REVERSE is non-nil, sorts in reverse order. ;;;*** -;;;### (autoloads nil "rmailsum" "rmailsum.el" "a9b3bbd9b82dd566524a1209b5cdb7dd") +;;;### (autoloads nil "rmailsum" "rmailsum.el" "9005bd5da3e21d1cc173e86fd9fec3c9") ;;; Generated autoloads from rmailsum.el (autoload 'rmail-summary "rmailsum" "\ diff --git a/lisp/mail/rmailmm.el b/lisp/mail/rmailmm.el index 350e3dacbcf..f2437b16d14 100644 --- a/lisp/mail/rmailmm.el +++ b/lisp/mail/rmailmm.el @@ -685,7 +685,8 @@ directly." ((string-match "image/\\(.*\\)" content-type) (setq type (image-type-from-file-name (concat "." (match-string 1 content-type)))) - (if (and (memq type image-types) + (if (and (boundp 'image-types) + (memq type image-types) (image-type-available-p type)) (if (and rmail-mime-show-images (not (eq rmail-mime-show-images 'button)) diff --git a/lisp/mail/rmailsum.el b/lisp/mail/rmailsum.el index 3a0a7824ad8..cced2231522 100644 --- a/lisp/mail/rmailsum.el +++ b/lisp/mail/rmailsum.el @@ -408,7 +408,7 @@ If FUNCTION is nil, includes all messages." (unless rmail-buffer (error "No RMAIL buffer found")) (let (mesg was-in-summary sumbuf) - (if (eq major-mode 'rmail-summary-mode) + (if (derived-mode-p 'rmail-summary-mode) (setq was-in-summary t)) (with-current-buffer rmail-buffer (setq rmail-summary-buffer (rmail-new-summary-1 desc redo function args) @@ -1035,7 +1035,7 @@ Optional prefix ARG means undelete ARG previous messages." ;; Rmail Summary mode is suitable only for specially formatted data. (put 'rmail-summary-mode 'mode-class 'special) -(defun rmail-summary-mode () +(define-derived-mode rmail-summary-mode special-mode "RMAIL Summary" "Rmail Summary Mode is invoked from Rmail Mode by using \\<rmail-mode-map>\\[rmail-summary]. As commands are issued in the summary buffer, they are applied to the corresponding mail messages in the rmail buffer. @@ -1058,10 +1058,6 @@ Commands for sorting the summary: \\[rmail-summary-sort-by-correspondent] Sort by correspondent. \\[rmail-summary-sort-by-lines] Sort by lines. \\[rmail-summary-sort-by-labels] Sort by labels." - (interactive) - (kill-all-local-variables) - (setq major-mode 'rmail-summary-mode) - (setq mode-name "RMAIL Summary") (setq truncate-lines t) (setq buffer-read-only t) (set-syntax-table text-mode-syntax-table) @@ -1074,8 +1070,7 @@ Commands for sorting the summary: (make-local-variable 'revert-buffer-function) (make-local-variable 'font-lock-defaults) (setq font-lock-defaults '(rmail-summary-font-lock-keywords t)) - (rmail-summary-enable) - (run-mode-hooks 'rmail-summary-mode-hook)) + (rmail-summary-enable)) ;; Summary features need to be disabled during edit mode. (defun rmail-summary-disable () diff --git a/lisp/man.el b/lisp/man.el index 34131f43692..9eb0ccd719a 100644 --- a/lisp/man.el +++ b/lisp/man.el @@ -413,7 +413,7 @@ Otherwise, the value is whatever the function (defvar Man-topic-history nil "Topic read history.") -(defvar man-mode-syntax-table +(defvar Man-mode-syntax-table (let ((table (copy-syntax-table (standard-syntax-table)))) (modify-syntax-entry ?. "w" table) (modify-syntax-entry ?_ "w" table) @@ -1350,7 +1350,7 @@ manpage command." (put 'Man-mode 'mode-class 'special) -(defun Man-mode () +(define-derived-mode Man-mode fundamental-mode "Man" "A mode for browsing Un*x manual pages. The following man commands are available in the buffer. Try @@ -1387,11 +1387,7 @@ The following variables may be of some use. Try The following key bindings are currently in effect in the buffer: \\{Man-mode-map}" - (interactive) - (kill-all-local-variables) - (setq major-mode 'Man-mode - mode-name "Man" - buffer-auto-save-file-name nil + (setq buffer-auto-save-file-name nil mode-line-buffer-identification (list (default-value 'mode-line-buffer-identification) " {" 'Man-page-mode-string "}") @@ -1399,8 +1395,6 @@ The following key bindings are currently in effect in the buffer: buffer-read-only t) (buffer-disable-undo) (auto-fill-mode -1) - (use-local-map Man-mode-map) - (set-syntax-table man-mode-syntax-table) (setq imenu-generic-expression (list (list nil Man-heading-regexp 0))) (set (make-local-variable 'outline-regexp) Man-heading-regexp) (set (make-local-variable 'outline-level) (lambda () 1)) @@ -1409,8 +1403,7 @@ The following key bindings are currently in effect in the buffer: (Man-build-page-list) (Man-strip-page-headers) (Man-unindent) - (Man-goto-page 1 t) - (run-mode-hooks 'Man-mode-hook)) + (Man-goto-page 1 t)) (defsubst Man-build-section-alist () "Build the list of manpage sections." diff --git a/lisp/midnight.el b/lisp/midnight.el index f207d438e5b..25de2717b47 100644 --- a/lisp/midnight.el +++ b/lisp/midnight.el @@ -87,7 +87,7 @@ displayed more than this many seconds ago." :type 'integer :group 'midnight) -(defcustom clean-buffer-list-kill-regexps nil +(defcustom clean-buffer-list-kill-regexps '("^\\*Man ") "List of regexps saying which buffers will be killed at midnight. If buffer name matches a regexp in the list and the buffer was not displayed in the last `clean-buffer-list-delay-special' seconds, it is killed by @@ -101,7 +101,7 @@ See also `clean-buffer-list-kill-buffer-names', :group 'midnight) (defcustom clean-buffer-list-kill-buffer-names - '("*Help*" "*Apropos*" "*Man " "*Buffer List*" "*Compile-Log*" "*info*" + '("*Help*" "*Apropos*" "*Buffer List*" "*Compile-Log*" "*info*" "*vc*" "*vc-diff*" "*diff*") "List of strings saying which buffers will be killed at midnight. Buffers with names in this list, which were not displayed in the last diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index e07d28a54d0..e588964a65b 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -38,7 +38,7 @@ ;;; Bugs: -;; - completion-all-sorted-completions list all the completions, whereas +;; - completion-all-sorted-completions lists all the completions, whereas ;; it should only lists the ones that `try-completion' would consider. ;; E.g. it should honor completion-ignored-extensions. ;; - choose-completion can't automatically figure out the boundaries @@ -145,7 +145,7 @@ Like CL's `some'." (let ((firsterror nil) res) (while (and (not res) xs) - (condition-case err + (condition-case-unless-debug err (setq res (funcall fun (pop xs))) (error (unless firsterror (setq firsterror err)) nil))) (or res @@ -623,7 +623,8 @@ If ARGS are provided, then pass MESSAGE through `format'." (message nil))) ;; Clear out any old echo-area message to make way for our new thing. (message nil) - (setq message (if (and (null args) (string-match-p "\\` *\\[.+\\]\\'" message)) + (setq message (if (and (null args) + (string-match-p "\\` *\\[.+\\]\\'" message)) ;; Make sure we can put-text-property. (copy-sequence message) (concat " [" message "]"))) @@ -651,7 +652,7 @@ If ARGS are provided, then pass MESSAGE through `format'." "Return the user input in a minibuffer before point as a string. In Emacs-22, that was what completion commands operated on." (declare (obsolete nil "24.4")) - (buffer-substring (field-beginning) (point))) + (buffer-substring (minibuffer-prompt-end) (point))) (defun delete-minibuffer-contents () "Delete all user input in a minibuffer. @@ -670,8 +671,7 @@ If the value is t the *Completion* buffer is displayed whenever completion is requested but cannot be done. If the value is `lazy', the *Completions* buffer is only displayed after the second failed attempt to complete." - :type '(choice (const nil) (const t) (const lazy)) - :group 'minibuffer) + :type '(choice (const nil) (const t) (const lazy))) (defconst completion-styles-alist '((emacs21 @@ -750,7 +750,6 @@ The available styles are listed in `completion-styles-alist'. Note that `completion-category-overrides' may override these styles for specific categories, such as files, buffers, etc." :type completion--styles-type - :group 'minibuffer :version "23.1") (defcustom completion-category-overrides @@ -880,7 +879,7 @@ Moves point to the end of the new text." (defcustom completion-cycle-threshold nil "Number of completion candidates below which cycling is used. -Depending on this setting `minibuffer-complete' may use cycling, +Depending on this setting `completion-in-region' may use cycling, like `minibuffer-force-complete'. If nil, cycling is never used. If t, cycling is always used. @@ -894,8 +893,7 @@ completion candidates than this number." (over (assq 'cycle (cdr (assq cat completion-category-overrides))))) (if over (cdr over) completion-cycle-threshold))) -(defvar completion-all-sorted-completions nil) -(make-variable-buffer-local 'completion-all-sorted-completions) +(defvar-local completion-all-sorted-completions nil) (defvar-local completion--all-sorted-completions-location nil) (defvar completion-cycling nil) @@ -906,8 +904,8 @@ completion candidates than this number." (if completion-show-inline-help (minibuffer-message msg))) -(defun completion--do-completion (&optional try-completion-function - expect-exact) +(defun completion--do-completion (beg end &optional + try-completion-function expect-exact) "Do the completion and return a summary of what happened. M = completion was performed, the text was Modified. C = there were available Completions. @@ -926,9 +924,7 @@ E = after completion we now have an Exact match. TRY-COMPLETION-FUNCTION is a function to use in place of `try-completion'. EXPECT-EXACT, if non-nil, means that there is no need to tell the user when the buffer's text is already an exact match." - (let* ((beg (field-beginning)) - (end (field-end)) - (string (buffer-substring beg end)) + (let* ((string (buffer-substring beg end)) (md (completion--field-metadata beg)) (comp (funcall (or try-completion-function 'completion-try-completion) @@ -963,7 +959,8 @@ when the buffer's text is already an exact match." (if unchanged (goto-char end) ;; Insert in minibuffer the chars we got. - (completion--replace beg end completion)) + (completion--replace beg end completion) + (setq end (+ beg (length completion)))) ;; Move point to its completion-mandated destination. (forward-char (- comp-pos (length completion))) @@ -972,7 +969,8 @@ when the buffer's text is already an exact match." ;; whether this is a unique completion or not, so try again using ;; the real case (this shouldn't recurse again, because the next ;; time try-completion will return either t or the exact string). - (completion--do-completion try-completion-function expect-exact) + (completion--do-completion beg end + try-completion-function expect-exact) ;; It did find a match. Do we match some possibility exactly now? (let* ((exact (test-completion completion @@ -995,7 +993,7 @@ when the buffer's text is already an exact match." minibuffer-completion-predicate "")) comp-pos))) - (completion-all-sorted-completions)))) + (completion-all-sorted-completions beg end)))) (completion--flush-all-sorted-completions) (cond ((and (consp (cdr comps)) ;; There's something to cycle. @@ -1006,8 +1004,8 @@ when the buffer's text is already an exact match." ;; Not more than completion-cycle-threshold remaining ;; completions: let's cycle. (setq completed t exact t) - (completion--cache-all-sorted-completions comps) - (minibuffer-force-complete)) + (completion--cache-all-sorted-completions beg end comps) + (minibuffer-force-complete beg end)) (completed ;; We could also decide to refresh the completions, ;; if they're displayed (and assuming there are @@ -1024,14 +1022,14 @@ when the buffer's text is already an exact match." (if (pcase completion-auto-help (`lazy (eq this-command last-command)) (_ completion-auto-help)) - (minibuffer-completion-help) + (minibuffer-completion-help beg end) (completion--message "Next char not unique"))) ;; If the last exact completion and this one were the same, it ;; means we've already given a "Complete, but not unique" message ;; and the user's hit TAB again, so now we give him help. (t (if (and (eq this-command last-command) completion-auto-help) - (minibuffer-completion-help)) + (minibuffer-completion-help beg end)) (completion--done completion 'exact (unless expect-exact "Complete, but not unique")))) @@ -1045,6 +1043,11 @@ If no characters can be completed, display a list of possible completions. If you repeat this command after it displayed such a list, scroll the window of possible completions." (interactive) + (completion-in-region (minibuffer-prompt-end) (point-max) + minibuffer-completion-table + minibuffer-completion-predicate)) + +(defun completion--in-region-1 (beg end) ;; If the previous command was not this, ;; mark the completion buffer obsolete. (setq this-command 'completion-at-point) @@ -1067,17 +1070,17 @@ scroll the window of possible completions." nil))) ;; If we're cycling, keep on cycling. ((and completion-cycling completion-all-sorted-completions) - (minibuffer-force-complete) + (minibuffer-force-complete beg end) t) - (t (pcase (completion--do-completion) + (t (pcase (completion--do-completion beg end) (#b000 nil) (_ t))))) -(defun completion--cache-all-sorted-completions (comps) +(defun completion--cache-all-sorted-completions (beg end comps) (add-hook 'after-change-functions 'completion--flush-all-sorted-completions nil t) (setq completion--all-sorted-completions-location - (cons (copy-marker (field-beginning)) (copy-marker (field-end)))) + (cons (copy-marker beg) (copy-marker end))) (setq completion-all-sorted-completions comps)) (defun completion--flush-all-sorted-completions (&optional start end _len) @@ -1097,10 +1100,10 @@ scroll the window of possible completions." (if (eq (car bounds) base) md-at-point (completion-metadata (substring string 0 base) table pred)))) -(defun completion-all-sorted-completions () +(defun completion-all-sorted-completions (&optional start end) (or completion-all-sorted-completions - (let* ((start (field-beginning)) - (end (field-end)) + (let* ((start (or start (minibuffer-prompt-end))) + (end (or end (point-max))) (string (buffer-substring start end)) (md (completion--field-metadata start)) (all (completion-all-completions @@ -1138,18 +1141,20 @@ scroll the window of possible completions." ;; Cache the result. This is not just for speed, but also so that ;; repeated calls to minibuffer-force-complete can cycle through ;; all possibilities. - (completion--cache-all-sorted-completions (nconc all base-size)))))) + (completion--cache-all-sorted-completions + start end (nconc all base-size)))))) (defun minibuffer-force-complete-and-exit () "Complete the minibuffer with first of the matches and exit." (interactive) (minibuffer-force-complete) - (minibuffer--complete-and-exit + (completion--complete-and-exit + (minibuffer-prompt-end) (point-max) #'exit-minibuffer ;; If the previous completion completed to an element which fails ;; test-completion, then we shouldn't exit, but that should be rare. (lambda () (minibuffer-message "Incomplete")))) -(defun minibuffer-force-complete () +(defun minibuffer-force-complete (&optional start end) "Complete the minibuffer to an exact match. Repeated uses step through the possible completions." (interactive) @@ -1157,10 +1162,10 @@ Repeated uses step through the possible completions." ;; FIXME: Need to deal with the extra-size issue here as well. ;; FIXME: ~/src/emacs/t<M-TAB>/lisp/minibuffer.el completes to ;; ~/src/emacs/trunk/ and throws away lisp/minibuffer.el. - (let* ((start (copy-marker (field-beginning))) - (end (field-end)) + (let* ((start (copy-marker (or start (minibuffer-prompt-end)))) + (end (or end (point-max))) ;; (md (completion--field-metadata start)) - (all (completion-all-sorted-completions)) + (all (completion-all-sorted-completions start end)) (base (+ start (or (cdr (last all)) 0)))) (cond ((not (consp all)) @@ -1173,10 +1178,11 @@ Repeated uses step through the possible completions." 'finished (when done "Sole completion")))) (t (completion--replace base end (car all)) + (setq end (+ base (length (car all)))) (completion--done (buffer-substring-no-properties start (point)) 'sole) ;; Set cycling after modifying the buffer since the flush hook resets it. (setq completion-cycling t) - (setq this-command 'completion-at-point) ;For minibuffer-complete. + (setq this-command 'completion-at-point) ;For completion-in-region. ;; If completing file names, (car all) may be a directory, so we'd now ;; have a new set of possible completions and might want to reset ;; completion-all-sorted-completions to nil, but we prefer not to, @@ -1184,7 +1190,7 @@ Repeated uses step through the possible completions." ;; through the previous possible completions. (let ((last (last all))) (setcdr last (cons (car all) (cdr last))) - (completion--cache-all-sorted-completions (cdr all))) + (completion--cache-all-sorted-completions start end (cdr all))) ;; Make sure repeated uses cycle, even though completion--done might ;; have added a space or something that moved us outside of the field. ;; (bug#12221). @@ -1223,27 +1229,32 @@ If `minibuffer-completion-confirm' is `confirm-after-completion', `minibuffer-confirm-exit-commands', and accept the input otherwise." (interactive) - (minibuffer--complete-and-exit + (completion-complete-and-exit (minibuffer-prompt-end) (point-max) + #'exit-minibuffer)) + +(defun completion-complete-and-exit (beg end exit-function) + (completion--complete-and-exit + beg end exit-function (lambda () (pcase (condition-case nil - (completion--do-completion nil 'expect-exact) + (completion--do-completion beg end + nil 'expect-exact) (error 1)) - ((or #b001 #b011) (exit-minibuffer)) + ((or #b001 #b011) (funcall exit-function)) (#b111 (if (not minibuffer-completion-confirm) - (exit-minibuffer) + (funcall exit-function) (minibuffer-message "Confirm") nil)) (_ nil))))) -(defun minibuffer--complete-and-exit (completion-function) +(defun completion--complete-and-exit (beg end + exit-function completion-function) "Exit from `require-match' minibuffer. COMPLETION-FUNCTION is called if the current buffer's content does not appear to be a match." - (let ((beg (field-beginning)) - (end (field-end))) (cond ;; Allow user to specify null string - ((= beg end) (exit-minibuffer)) + ((= beg end) (funcall exit-function)) ((test-completion (buffer-substring beg end) minibuffer-completion-table minibuffer-completion-predicate) @@ -1269,7 +1280,7 @@ appear to be a match." ;; that file. (= (length string) (length compl))) (completion--replace beg end compl)))) - (exit-minibuffer)) + (funcall exit-function)) ((memq minibuffer-completion-confirm '(confirm confirm-after-completion)) ;; The user is permitted to exit with an input that's rejected @@ -1280,13 +1291,13 @@ appear to be a match." ;; catches most minibuffer typos). (and (eq minibuffer-completion-confirm 'confirm-after-completion) (not (memq last-command minibuffer-confirm-exit-commands)))) - (exit-minibuffer) + (funcall exit-function) (minibuffer-message "Confirm") nil)) (t ;; Call do-completion, but ignore errors. - (funcall completion-function))))) + (funcall completion-function)))) (defun completion--try-word-completion (string table predicate point md) (let ((comp (completion-try-completion string table predicate point md))) @@ -1381,9 +1392,18 @@ After one word is completed as much as possible, a space or hyphen is added, provided that matches some possible completion. Return nil if there is no valid completion, else t." (interactive) - (pcase (completion--do-completion 'completion--try-word-completion) + (completion-in-region--single-word + (minibuffer-prompt-end) (point-max) + minibuffer-completion-table minibuffer-completion-predicate)) + +(defun completion-in-region--single-word (beg end collection + &optional predicate) + (let ((minibuffer-completion-table collection) + (minibuffer-completion-predicate predicate)) + (pcase (completion--do-completion beg end + #'completion--try-word-completion) (#b000 nil) - (_ t))) + (_ t)))) (defface completions-annotations '((t :inherit italic)) "Face to use for annotations in the *Completions* buffer.") @@ -1395,7 +1415,6 @@ in columns in the *Completions* buffer. If the value is `horizontal', display completions sorted horizontally in alphabetical order, rather than down the screen." :type '(choice (const horizontal) (const vertical)) - :group 'minibuffer :version "23.2") (defun completion--insert-strings (strings) @@ -1504,15 +1523,13 @@ See also `display-completion-list'.") (defface completions-first-difference '((t (:inherit bold))) - "Face added on the first uncommon character in completions in *Completions* buffer." - :group 'completion) + "Face added on the first uncommon character in completions in *Completions* buffer.") (defface completions-common-part '((t nil)) "Face added on the common prefix substring in completions in *Completions* buffer. The idea of `completions-common-part' is that you can use it to make the common parts less visible than normal, so that the rest -of the differing parts is, by contrast, slightly highlighted." - :group 'completion) +of the differing parts is, by contrast, slightly highlighted.") (defun completion-hilit-commonality (completions prefix-len base-size) (when completions @@ -1555,12 +1572,8 @@ alternative, the second serves as annotation. The actual completion alternatives, as inserted, are given `mouse-face' properties of `highlight'. At the end, this runs the normal hook `completion-setup-hook'. -It can find the completion buffer in `standard-output'. - -The obsolete optional arg COMMON-SUBSTRING, if non-nil, should be a string -specifying a common substring for adding the faces -`completions-first-difference' and `completions-common-part' to -the completions buffer." +It can find the completion buffer in `standard-output'." + (declare (advertised-calling-convention (completions) "24.4")) (if common-substring (setq completions (completion-hilit-commonality completions (length common-substring) @@ -1647,19 +1660,19 @@ variables.") (equal pre-msg (and exit-fun (current-message)))) (completion--message message)))) -(defun minibuffer-completion-help () +(defun minibuffer-completion-help (&optional start end) "Display a list of possible completions of the current minibuffer contents." (interactive) (message "Making completion list...") - (let* ((start (field-beginning)) - (end (field-end)) - (string (field-string)) + (let* ((start (or start (minibuffer-prompt-end))) + (end (or end (point-max))) + (string (buffer-substring start end)) (md (completion--field-metadata start)) (completions (completion-all-completions string minibuffer-completion-table minibuffer-completion-predicate - (- (point) (field-beginning)) + (- (point) start) md))) (message nil) (if (or (null completions) @@ -1811,7 +1824,6 @@ exit." (if (memq system-type '(ms-dos windows-nt darwin cygwin)) t nil) "Non-nil means when reading a file name completion ignores case." - :group 'minibuffer :type 'boolean :version "22.1") @@ -1821,22 +1833,15 @@ exit." ;; completions" operation as well. completion-in-region-functions (start end collection predicate) (let ((minibuffer-completion-table collection) - (minibuffer-completion-predicate predicate) - (ol (make-overlay start end nil nil t))) - (overlay-put ol 'field 'completion) + (minibuffer-completion-predicate predicate)) ;; HACK: if the text we are completing is already in a field, we ;; want the completion field to take priority (e.g. Bug#6830). - (overlay-put ol 'priority 100) (when completion-in-region-mode-predicate - (completion-in-region-mode 1) (setq completion-in-region--data - (list (if (markerp start) start (copy-marker start)) - (copy-marker end) collection))) - ;; FIXME: `minibuffer-complete' should call `completion-in-region' rather - ;; than the other way around! - (unwind-protect - (call-interactively 'minibuffer-complete) - (delete-overlay ol))))) + `(,(if (markerp start) start (copy-marker start)) + ,(copy-marker end t) ,collection ,predicate)) + (completion-in-region-mode 1)) + (completion--in-region-1 start end)))) (defvar completion-in-region-mode-map (let ((map (make-sparse-keymap))) @@ -1869,22 +1874,25 @@ exit." ;; (defalias 'completion-in-region--prech 'completion-in-region--postch) +(defvar completion-in-region-mode nil) ;Explicit defvar, i.s.o defcustom. + (define-minor-mode completion-in-region-mode - "Transient minor mode used during `completion-in-region'. -With a prefix argument ARG, enable the modemode if ARG is -positive, and disable it otherwise. If called from Lisp, enable -the mode if ARG is omitted or nil." + "Transient minor mode used during `completion-in-region'." :global t :group 'minibuffer - (setq completion-in-region--data nil) + ;; Prevent definition of a custom-variable since it makes no sense to + ;; customize this variable. + :variable completion-in-region-mode ;; (remove-hook 'pre-command-hook #'completion-in-region--prech) (remove-hook 'post-command-hook #'completion-in-region--postch) (setq minor-mode-overriding-map-alist (delq (assq 'completion-in-region-mode minor-mode-overriding-map-alist) minor-mode-overriding-map-alist)) (if (null completion-in-region-mode) - (unless (equal "*Completions*" (buffer-name (window-buffer))) - (minibuffer-hide-completions)) + (progn + (setq completion-in-region--data nil) + (unless (equal "*Completions*" (buffer-name (window-buffer))) + (minibuffer-hide-completions))) ;; (add-hook 'pre-command-hook #'completion-in-region--prech) (cl-assert completion-in-region-mode-predicate) (setq completion-in-region-mode--predicate @@ -2001,19 +2009,15 @@ The completion method is determined by `completion-at-point-functions'." (lambda () ;; We're still in the same completion field. (let ((newstart (car-safe (funcall hookfun)))) - (and newstart (= newstart start))))) - (ol (make-overlay start end nil nil t))) + (and newstart (= newstart start)))))) ;; FIXME: We should somehow (ab)use completion-in-region-function or ;; introduce a corresponding hook (plus another for word-completion, ;; and another for force-completion, maybe?). - (overlay-put ol 'field 'completion) - (overlay-put ol 'priority 100) - (completion-in-region-mode 1) (setq completion-in-region--data - (list start (copy-marker end) collection)) - (unwind-protect - (call-interactively 'minibuffer-completion-help) - (delete-overlay ol)))) + `(,start ,(copy-marker end t) ,collection + ,(plist-get plist :predicate))) + (completion-in-region-mode 1) + (minibuffer-completion-help start end))) (`(,hookfun . ,_) ;; The hook function already performed completion :-( ;; Not much we can do at this point. @@ -2308,7 +2312,6 @@ the minibuffer empty. For some commands, exiting with an empty minibuffer has a special meaning, such as making the current buffer visit no file in the case of `set-visited-file-name'." - :group 'minibuffer :type 'boolean) ;; Not always defined, but only called if next-read-file-uses-dialog-p says so. @@ -2701,7 +2704,6 @@ expression (not containing character ranges like `a-z')." ;; Refresh other vars. (completion-pcm--prepare-delim-re value)) :initialize 'custom-initialize-reset - :group 'minibuffer :type 'string) (defcustom completion-pcm-complete-word-inserts-delimiters nil @@ -2734,7 +2736,8 @@ or a symbol, see `completion-pcm--merge-completions'." (completion-pcm--string->pattern suffix))) (let* ((pattern nil) (p 0) - (p0 p)) + (p0 p) + (pending nil)) (while (and (setq p (string-match completion-pcm--delim-wild-regex string p)) @@ -2751,18 +2754,49 @@ or a symbol, see `completion-pcm--merge-completions'." ;; This is determined by the presence of a submatch-1 which delimits ;; the prefix. (if (match-end 1) (setq p (match-end 1))) - (push (substring string p0 p) pattern) + (unless (= p0 p) + (if pending (push pending pattern)) + (push (substring string p0 p) pattern)) + (setq pending nil) (if (eq (aref string p) ?*) (progn (push 'star pattern) (setq p0 (1+ p))) (push 'any pattern) - (setq p0 p)) - (cl-incf p)) - + (if (match-end 1) + (setq p0 p) + (push (substring string p (match-end 0)) pattern) + ;; `any-delim' is used so that "a-b" also finds "array->beginning". + (setq pending 'any-delim) + (setq p0 (match-end 0)))) + (setq p p0)) + + (when (> (length string) p0) + (if pending (push pending pattern)) + (push (substring string p0) pattern)) ;; An empty string might be erroneously added at the beginning. ;; It should be avoided properly, but it's so easy to remove it here. - (delete "" (nreverse (cons (substring string p0) pattern)))))) + (delete "" (nreverse pattern))))) + +(defun completion-pcm--optimize-pattern (p) + ;; Remove empty strings in a separate phase since otherwise a "" + ;; might prevent some other optimization, as in '(any "" any). + (setq p (delete "" p)) + (let ((n '())) + (while p + (pcase p + (`(,(and s1 (pred stringp)) ,(and s2 (pred stringp)) . ,rest) + (setq p (cons (concat s1 s2) rest))) + (`(,(and p1 (pred symbolp)) ,(and p2 (guard (eq p1 p2))) . ,_) + (setq p (cdr p))) + (`(star ,(pred symbolp) . ,rest) (setq p `(star . ,rest))) + (`(,(pred symbolp) star . ,rest) (setq p `(star . ,rest))) + (`(point ,(or `any `any-delim) . ,rest) (setq p `(point . ,rest))) + (`(,(or `any `any-delim) point . ,rest) (setq p `(point . ,rest))) + (`(any ,(or `any `any-delim) . ,rest) (setq p `(any . ,rest))) + (`(,(pred symbolp)) (setq p nil)) ;Implicit terminating `any'. + (_ (push (pop p) n)))) + (nreverse n))) (defun completion-pcm--pattern->regex (pattern &optional group) (let ((re @@ -2771,8 +2805,13 @@ or a symbol, see `completion-pcm--merge-completions'." (lambda (x) (cond ((stringp x) (regexp-quote x)) - ((if (consp group) (memq x group) group) "\\(.*?\\)") - (t ".*?"))) + (t + (let ((re (if (eq x 'any-delim) + (concat completion-pcm--delim-wild-regex "*?") + ".*?"))) + (if (if (consp group) (memq x group) group) + (concat "\\(" re "\\)") + re))))) pattern "")))) ;; Avoid pathological backtracking. @@ -2846,11 +2885,11 @@ filter out additional entries (because TABLE might not obey PRED)." (setq string (substring string (car bounds) (+ point (cdr bounds)))) (let* ((relpoint (- point (car bounds))) (pattern (completion-pcm--string->pattern string relpoint)) - (all (condition-case err + (all (condition-case-unless-debug err (funcall filter (completion-pcm--all-completions prefix pattern table pred)) - (error (unless firsterror (setq firsterror err)) nil)))) + (error (setq firsterror err) nil)))) (when (and (null all) (> (car bounds) 0) (null (ignore-errors (try-completion prefix table pred)))) diff --git a/lisp/mouse.el b/lisp/mouse.el index 6f374b6cd88..91a17f0d980 100644 --- a/lisp/mouse.el +++ b/lisp/mouse.el @@ -1074,22 +1074,21 @@ regardless of where you click." (deactivate-mark))) (or mouse-yank-at-point (mouse-set-point click)) (let ((primary - (cond - ((eq (framep (selected-frame)) 'w32) - ;; MS-Windows emulates PRIMARY in x-get-selection, but not - ;; in x-get-selection-value (the latter only accesses the - ;; clipboard). So try PRIMARY first, in case they selected - ;; something with the mouse in the current Emacs session. - (or (x-get-selection 'PRIMARY) - (x-get-selection-value))) - ((fboundp 'x-get-selection-value) ; MS-DOS and X. - ;; On X, x-get-selection-value supports more formats and - ;; encodings, so use it in preference to x-get-selection. - (or (x-get-selection-value) - (x-get-selection 'PRIMARY))) - ;; FIXME: What about xterm-mouse-mode etc.? - (t - (x-get-selection 'PRIMARY))))) + (if (fboundp 'x-get-selection-value) + (if (eq (framep (selected-frame)) 'w32) + ;; MS-Windows emulates PRIMARY in x-get-selection, but not + ;; in x-get-selection-value (the latter only accesses the + ;; clipboard). So try PRIMARY first, in case they selected + ;; something with the mouse in the current Emacs session. + (or (x-get-selection 'PRIMARY) + (x-get-selection-value)) + ;; Else MS-DOS or X. + ;; On X, x-get-selection-value supports more formats and + ;; encodings, so use it in preference to x-get-selection. + (or (x-get-selection-value) + (x-get-selection 'PRIMARY))) + ;; FIXME: What about xterm-mouse-mode etc.? + (x-get-selection 'PRIMARY)))) (unless primary (error "No selection is available")) (push-mark (point)) diff --git a/lisp/mpc.el b/lisp/mpc.el index 825eb3c05d4..2bb3f91abc9 100644 --- a/lisp/mpc.el +++ b/lisp/mpc.el @@ -491,10 +491,9 @@ to call FUN for any change whatsoever.") (cancel-timer mpc--status-timer) (setq mpc--status-timer nil))) (defun mpc--status-timer-run () - (condition-case err - (when (process-get (mpc-proc) 'ready) - (with-local-quit (mpc-status-refresh))) - (error (message "MPC: %s" err)))) + (with-demoted-errors "MPC: %s" + (when (process-get (mpc-proc) 'ready) + (with-local-quit (mpc-status-refresh))))) (defvar mpc--status-idle-timer nil) (defun mpc--status-idle-timer-start () @@ -520,9 +519,8 @@ to call FUN for any change whatsoever.") (run-with-idle-timer 10 t 'mpc--status-idle-timer-run)))) (defun mpc--status-idle-timer-run () (when (process-get (mpc-proc) 'ready) - (condition-case err - (with-local-quit (mpc-status-refresh)) - (error (message "MPC: %s" err)))) + (with-demoted-errors "MPC: %s" + (with-local-quit (mpc-status-refresh)))) (mpc--status-timer-start)) (defun mpc--status-timers-refresh () @@ -999,9 +997,8 @@ If PLAYLIST is t or nil or missing, use the main playlist." (`Cover (let* ((dir (file-name-directory (cdr (assq 'file info)))) (cover (concat dir "cover.jpg")) - (file (condition-case err - (mpc-file-local-copy cover) - (error (message "MPC: %s" err)))) + (file (with-demoted-errors "MPC: %s" + (mpc-file-local-copy cover))) image) ;; (debug) (push `(equal ',dir (file-name-directory (cdr (assq 'file info)))) pred) @@ -1142,7 +1139,8 @@ If PLAYLIST is t or nil or missing, use the main playlist." "Major mode for the features common to all buffers of MPC." (buffer-disable-undo) (setq buffer-read-only t) - (setq-local tool-bar-map mpc-tool-bar-map) + (if (boundp 'tool-bar-map) ; not if --without-x + (setq-local tool-bar-map mpc-tool-bar-map)) (setq-local truncate-lines t)) ;;; The mpc-status-mode buffer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/lisp/net/eudc-hotlist.el b/lisp/net/eudc-hotlist.el index a8a51b7d61b..57675a483b2 100644 --- a/lisp/net/eudc-hotlist.el +++ b/lisp/net/eudc-hotlist.el @@ -44,7 +44,7 @@ (define-key map "x" 'kill-this-buffer) map)) -(defun eudc-hotlist-mode () +(define-derived-mode eudc-hotlist-mode fundamental-mode "EUDC-Servers" "Major mode used to edit the hotlist of servers. These are the special commands of this mode: @@ -54,18 +54,12 @@ These are the special commands of this mode: t -- Transpose the server at point and the previous one q -- Commit the changes and quit. x -- Quit without committing the changes." - (interactive) - (kill-all-local-variables) - (setq major-mode 'eudc-hotlist-mode) - (setq mode-name "EUDC-Servers") - (use-local-map eudc-hotlist-mode-map) (when (featurep 'xemacs) (setq mode-popup-menu eudc-hotlist-menu) (when (featurep 'menubar) (set-buffer-menubar current-menubar) (add-submenu nil (cons "EUDC-Hotlist" (cdr (cdr eudc-hotlist-menu)))))) - (setq buffer-read-only t) - (run-mode-hooks 'eudc-hotlist-mode-hook)) + (setq buffer-read-only t)) ;;;###autoload (defun eudc-edit-hotlist () @@ -76,10 +70,8 @@ These are the special commands of this mode: (switch-to-buffer (get-buffer-create "*EUDC Servers*")) (setq buffer-read-only nil) (erase-buffer) - (mapc (function - (lambda (entry) - (setq proto-col (max (length (car entry)) proto-col)))) - eudc-server-hotlist) + (dolist (entry eudc-server-hotlist) + (setq proto-col (max (length (car entry)) proto-col))) (setq proto-col (+ 3 proto-col)) (setq gap (make-string (- proto-col 6) ?\ )) (insert " EUDC Servers\n" @@ -89,17 +81,16 @@ These are the special commands of this mode: "------" gap "--------\n" "\n") (setq eudc-hotlist-list-beginning (point)) - (mapc (lambda (entry) - (insert (car entry)) - (indent-to proto-col) - (insert (symbol-name (cdr entry)) "\n")) - eudc-server-hotlist) - (eudc-hotlist-mode))) + (dolist (entry eudc-server-hotlist) + (insert (car entry)) + (indent-to proto-col) + (insert (symbol-name (cdr entry)) "\n")) + (eudc-hotlist-mode))) (defun eudc-hotlist-add-server () "Add a new server to the list after current one." (interactive) - (if (not (eq major-mode 'eudc-hotlist-mode)) + (if (not (derived-mode-p 'eudc-hotlist-mode)) (error "Not in a EUDC hotlist edit buffer")) (let ((server (read-from-minibuffer "Server: ")) (protocol (completing-read "Protocol: " @@ -117,7 +108,7 @@ These are the special commands of this mode: (defun eudc-hotlist-delete-server () "Delete the server at point from the list." (interactive) - (if (not (eq major-mode 'eudc-hotlist-mode)) + (if (not (derived-mode-p 'eudc-hotlist-mode)) (error "Not in a EUDC hotlist edit buffer")) (let ((buffer-read-only nil)) (save-excursion @@ -130,7 +121,7 @@ These are the special commands of this mode: (defun eudc-hotlist-quit-edit () "Quit the hotlist editing mode and save changes to the hotlist." (interactive) - (if (not (eq major-mode 'eudc-hotlist-mode)) + (if (not (derived-mode-p 'eudc-hotlist-mode)) (error "Not in a EUDC hotlist edit buffer")) (let (hotlist) (goto-char eudc-hotlist-list-beginning) @@ -149,7 +140,7 @@ These are the special commands of this mode: (defun eudc-hotlist-select-server () "Select the server at point as the current server." (interactive) - (if (not (eq major-mode 'eudc-hotlist-mode)) + (if (not (derived-mode-p 'eudc-hotlist-mode)) (error "Not in a EUDC hotlist edit buffer")) (save-excursion (beginning-of-line) @@ -163,7 +154,7 @@ These are the special commands of this mode: (defun eudc-hotlist-transpose-servers () "Swap the order of the server with the previous one in the list." (interactive) - (if (not (eq major-mode 'eudc-hotlist-mode)) + (if (not (derived-mode-p 'eudc-hotlist-mode)) (error "Not in a EUDC hotlist edit buffer")) (let ((buffer-read-only nil)) (save-excursion diff --git a/lisp/net/eudc.el b/lisp/net/eudc.el index c474ac9380d..453c19b27f9 100644 --- a/lisp/net/eudc.el +++ b/lisp/net/eudc.el @@ -652,7 +652,7 @@ Each copy is added a new field containing one of the values of FIELD." result)) -(defun eudc-mode () +(define-derived-mode eudc-mode special-mode "EUDC" "Major mode used in buffers displaying the results of directory queries. There is no sense in calling this command from a buffer other than one containing the results of a directory query. @@ -663,15 +663,9 @@ These are the special commands of EUDC mode: n -- Move to next record. p -- Move to previous record. b -- Insert record at point into the BBDB database." - (interactive) - (kill-all-local-variables) - (setq major-mode 'eudc-mode) - (setq mode-name "EUDC") - (use-local-map eudc-mode-map) (if (not (featurep 'xemacs)) (easy-menu-define eudc-emacs-menu eudc-mode-map "" (eudc-menu)) - (setq mode-popup-menu (eudc-menu))) - (run-mode-hooks 'eudc-mode-hook)) + (setq mode-popup-menu (eudc-menu)))) ;;}}} @@ -1084,7 +1078,7 @@ queries the server for the existing fields and displays a corresponding form." (defun eudc-move-to-next-record () "Move to next record, in a buffer displaying directory query results." (interactive) - (if (not (eq major-mode 'eudc-mode)) + (if (not (derived-mode-p 'eudc-mode)) (error "Not in a EUDC buffer") (let ((pt (next-overlay-change (point)))) (if (< pt (point-max)) @@ -1094,7 +1088,7 @@ queries the server for the existing fields and displays a corresponding form." (defun eudc-move-to-previous-record () "Move to previous record, in a buffer displaying directory query results." (interactive) - (if (not (eq major-mode 'eudc-mode)) + (if (not (derived-mode-p 'eudc-mode)) (error "Not in a EUDC buffer") (let ((pt (previous-overlay-change (point)))) (if (> pt (point-min)) @@ -1122,7 +1116,7 @@ queries the server for the existing fields and displays a corresponding form." (overlay-get (car (overlays-at (point))) 'eudc-record)) :help "Insert record at point into the BBDB database"] ["Insert All Records into BBDB" eudc-batch-export-records-to-bbdb - (and (eq major-mode 'eudc-mode) + (and (derived-mode-p 'eudc-mode) (or (featurep 'bbdb) (prog1 (locate-library "bbdb") (message "")))) :help "Insert all the records returned by a directory query into BBDB"] diff --git a/lisp/net/eww.el b/lisp/net/eww.el index 6cf4ff2c9bf..e67d9c5a25c 100644 --- a/lisp/net/eww.el +++ b/lisp/net/eww.el @@ -197,7 +197,12 @@ word(s) will be searched for via `eww-search-prefix'." "[\t\n\r ]*<\\?xml[\t\n\r ]+[^>]*encoding=\"\\([^\"]+\\)") (match-string 1))))) +(declare-function libxml-parse-html-region "xml.c" + (start end &optional base-url)) + (defun eww-display-html (charset url) + (or (fboundp 'libxml-parse-html-region) + (error "This function requires Emacs to be compiled with libxml2")) (unless (eq charset 'utf8) (condition-case nil (decode-coding-region (point) (point-max) charset) diff --git a/lisp/net/gnutls.el b/lisp/net/gnutls.el index 37755806616..923b108c708 100644 --- a/lisp/net/gnutls.el +++ b/lisp/net/gnutls.el @@ -115,6 +115,7 @@ trust and key files, and priority string." (declare-function gnutls-boot "gnutls.c" (proc type proplist)) (declare-function gnutls-errorp "gnutls.c" (error)) +(defvar gnutls-log-level) ; gnutls.c (cl-defun gnutls-negotiate (&rest spec diff --git a/lisp/net/mairix.el b/lisp/net/mairix.el index e6a5f8299ac..f2d404afa58 100644 --- a/lisp/net/mairix.el +++ b/lisp/net/mairix.el @@ -757,31 +757,24 @@ VALUES may contain values for editable fields from current article." map) "'mairix-searches-mode' keymap.") -(defvar mairix-searches-mode-font-lock-keywords) - -(defun mairix-searches-mode () +(defvar mairix-searches-mode-font-lock-keywords + '(("^\\([0-9]+\\)" + (1 font-lock-constant-face)) + ("^[0-9 ]+\\(Name:\\) \\(.*\\)" + (1 font-lock-keyword-face) (2 font-lock-string-face)) + ("^[ ]+\\(Query:\\) \\(.*\\) , " + (1 font-lock-keyword-face) (2 font-lock-string-face)) + (", \\(Threads:\\) \\(.*\\)" + (1 font-lock-keyword-face) (2 font-lock-constant-face)) + ("^\\([A-Z].*\\)$" + (1 font-lock-comment-face)) + ("^[ ]+\\(Folder:\\) \\(.*\\)" + (1 font-lock-keyword-face) (2 font-lock-string-face)))) + +(define-derived-mode mairix-searches-mode fundamental-mode "mairix-searches" "Major mode for editing mairix searches." - (interactive) - (kill-all-local-variables) - (setq major-mode 'mairix-searches-mode) - (setq mode-name "mairix-searches") - (set-syntax-table text-mode-syntax-table) - (use-local-map mairix-searches-mode-map) - (make-local-variable 'font-lock-defaults) - (setq mairix-searches-mode-font-lock-keywords - (list (list "^\\([0-9]+\\)" - '(1 font-lock-constant-face)) - (list "^[0-9 ]+\\(Name:\\) \\(.*\\)" - '(1 font-lock-keyword-face) '(2 font-lock-string-face)) - (list "^[ ]+\\(Query:\\) \\(.*\\) , " - '(1 font-lock-keyword-face) '(2 font-lock-string-face)) - (list ", \\(Threads:\\) \\(.*\\)" - '(1 font-lock-keyword-face) '(2 font-lock-constant-face)) - (list "^\\([A-Z].*\\)$" - '(1 font-lock-comment-face)) - (list "^[ ]+\\(Folder:\\) \\(.*\\)" - '(1 font-lock-keyword-face) '(2 font-lock-string-face)))) - (setq font-lock-defaults '(mairix-searches-mode-font-lock-keywords))) + :syntax-table text-mode-syntax-table + (setq-local font-lock-defaults '(mairix-searches-mode-font-lock-keywords))) (defun mairix-build-search-list () "Display saved searches in current buffer." diff --git a/lisp/net/newst-treeview.el b/lisp/net/newst-treeview.el index d6c8f6f557d..411d4dfdb43 100644 --- a/lisp/net/newst-treeview.el +++ b/lisp/net/newst-treeview.el @@ -1909,13 +1909,9 @@ Return t if groups have changed, nil otherwise." map) "Mode map for newsticker treeview.") -(defun newsticker-treeview-mode () +(define-derived-mode newsticker-treeview-mode fundamental-mode "Newsticker TV" "Major mode for Newsticker Treeview. \\{newsticker-treeview-mode-map}" - (kill-all-local-variables) - (use-local-map newsticker-treeview-mode-map) - (setq major-mode 'newsticker-treeview-mode) - (setq mode-name "Newsticker TV") (if (boundp 'tool-bar-map) (set (make-local-variable 'tool-bar-map) newsticker-treeview-tool-bar-map)) diff --git a/lisp/net/quickurl.el b/lisp/net/quickurl.el index 1e05d8db336..08ae9574a33 100644 --- a/lisp/net/quickurl.el +++ b/lisp/net/quickurl.el @@ -429,18 +429,12 @@ current buffer, this default action can be modified via (put 'quickurl-list-mode 'mode-class 'special) ;;;###autoload -(defun quickurl-list-mode () +(define-derived-mode quickurl-list-mode fundamental-mode "quickurl list" "A mode for browsing the quickurl URL list. The key bindings for `quickurl-list-mode' are: \\{quickurl-list-mode-map}" - (interactive) - (kill-all-local-variables) - (use-local-map quickurl-list-mode-map) - (setq major-mode 'quickurl-list-mode - mode-name "quickurl list") - (run-mode-hooks 'quickurl-list-mode-hook) (setq buffer-read-only t truncate-lines t)) diff --git a/lisp/net/shr.el b/lisp/net/shr.el index 9cac618b159..b742172be46 100644 --- a/lisp/net/shr.el +++ b/lisp/net/shr.el @@ -732,6 +732,10 @@ If EXTERNAL, browse the URL using `shr-external-browser'." (setq payload (base64-decode-string payload))) payload))) +;; Behind display-graphic-p test. +(declare-function image-size "image.c" (spec &optional pixels frame)) +(declare-function image-animate "image" (image &optional index limit)) + (defun shr-put-image (spec alt &optional flags) "Insert image SPEC with a string ALT. Return image. SPEC is either an image data blob, or a list where the first diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el index a5f59227ef7..132ffaa27a8 100644 --- a/lisp/net/tramp-adb.el +++ b/lisp/net/tramp-adb.el @@ -137,7 +137,7 @@ (insert-directory . tramp-adb-handle-insert-directory) (insert-file-contents . tramp-handle-insert-file-contents) (load . tramp-handle-load) - ;; `make-auto-save-file-name' performed by default handler. + (make-auto-save-file-name . tramp-handle-make-auto-save-file-name) (make-directory . tramp-adb-handle-make-directory) (make-directory-internal . ignore) (make-symbolic-link . ignore) @@ -407,9 +407,9 @@ Convert (\"-al\") to (\"-a\" \"-l\"). Remove arguments like \"--dired\"." (split-string (apply 'concat (mapcar (lambda (s) - (replace-regexp-in-string + (tramp-compat-replace-regexp-in-string "\\(.\\)" " -\\1" - (replace-regexp-in-string "^-" "" s))) + (tramp-compat-replace-regexp-in-string "^-" "" s))) ;; FIXME: Warning about removed switches (long and non-dash). (delq nil (mapcar @@ -1092,7 +1092,7 @@ FMT and ARGS are passed to `error'." "Maybe open a connection VEC. Does not do anything if a connection is already open, but re-opens the connection if a previous connection has died for some reason." - (tramp-check-proper-host vec) + (tramp-check-proper-method-and-host vec) (let* ((buf (tramp-get-connection-buffer vec)) (p (get-buffer-process buf)) @@ -1153,11 +1153,11 @@ connection if a previous connection has died for some reason." (read (current-buffer)))))) (when (and (stringp old-getprop) (not (string-equal old-getprop new-getprop))) - (tramp-cleanup vec) (tramp-message vec 3 "Connection reset, because remote host changed from `%s' to `%s'" old-getprop new-getprop) + (tramp-cleanup-connection vec t) (tramp-adb-maybe-open-connection vec))) ;; Change user if indicated. diff --git a/lisp/net/tramp-cache.el b/lisp/net/tramp-cache.el index b89c5124721..7407f83e92b 100644 --- a/lisp/net/tramp-cache.el +++ b/lisp/net/tramp-cache.el @@ -285,11 +285,18 @@ KEY identifies the connection, it is either a process or a vector." (let (result) (maphash (lambda (key value) - ;; Remove text properties from KEY. - (when (vectorp key) - (dotimes (i (length key)) - (when (stringp (aref key i)) - (aset key i (substring-no-properties (aref key i)))))) + ;; Remove text properties from KEY and VALUE. + ;; `substring-no-properties' does not exist in XEmacs. + (when (functionp 'substring-no-properties) + (when (vectorp key) + (dotimes (i (length key)) + (when (stringp (aref key i)) + (aset key i (funcall 'substring-no-properties (aref key i)))))) + (when (stringp key) + (setq key (funcall 'substring-no-properties key))) + (when (stringp value) + (setq value (funcall 'substring-no-properties value)))) + ;; Dump. (let ((tmp (format "(%s %s)" (if (processp key) diff --git a/lisp/net/tramp-cmds.el b/lisp/net/tramp-cmds.el index 937db34a346..5015929534d 100644 --- a/lisp/net/tramp-cmds.el +++ b/lisp/net/tramp-cmds.el @@ -55,9 +55,11 @@ (buffer-list)))) ;;;###tramp-autoload -(defun tramp-cleanup-connection (vec) +(defun tramp-cleanup-connection (vec &optional keep-debug keep-password) "Flush all connection related objects. -This includes password cache, file cache, connection cache, buffers. +This includes password cache, file cache, connection cache, +buffers. KEEP-DEBUG non-nil preserves the debug buffer. +KEEP-PASSWORD non-nil preserves the password cache. When called interactively, a Tramp connection has to be selected." (interactive ;; When interactive, select the Tramp remote identification. @@ -80,14 +82,15 @@ When called interactively, a Tramp connection has to be selected." "Enter Tramp connection: " connections nil t (try-completion "" connections))) (when (and name (file-remote-p name)) - (with-parsed-tramp-file-name name nil v)))))) + (with-parsed-tramp-file-name name nil v)))) + nil nil)) (if (not vec) ;; Nothing to do. (message "No Tramp connection found.") ;; Flush password cache. - (tramp-clear-passwd vec) + (unless keep-password (tramp-clear-passwd vec)) ;; Flush file cache. (tramp-flush-directory-property vec "") @@ -101,7 +104,8 @@ When called interactively, a Tramp connection has to be selected." ;; Remove buffers. (dolist (buf (list (get-buffer (tramp-buffer-name vec)) - (get-buffer (tramp-debug-buffer-name vec)) + (unless keep-debug + (get-buffer (tramp-debug-buffer-name vec))) (tramp-get-connection-property vec "process-buffer" nil))) (when (bufferp buf) (kill-buffer buf))))) @@ -190,7 +194,9 @@ This includes password cache, file cache, connection cache, buffers." 'tramp-load-report-modules ; pre-hook 'tramp-append-tramp-buffers ; post-hook - (propertize "\n" 'display "\ + (funcall + (if (functionp 'propertize) 'propertize 'progn) + "\n" 'display "\ Enter your bug report in this message, including as much detail as you possibly can about the problem, what you did to cause it and what the local and remote machines are. diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el index 8f9d9d8fee5..ca70c1384cb 100644 --- a/lisp/net/tramp-compat.el +++ b/lisp/net/tramp-compat.el @@ -313,13 +313,21 @@ Not actually used. Use `(format \"%o\" i)' instead?" "Like `copy-file' for Tramp files (compat function)." (cond (preserve-extended-attributes - (tramp-compat-funcall - 'copy-file filename newname ok-if-already-exists keep-date - preserve-uid-gid preserve-extended-attributes)) + (condition-case nil + (tramp-compat-funcall + 'copy-file filename newname ok-if-already-exists keep-date + preserve-uid-gid preserve-extended-attributes) + (wrong-number-of-arguments + (tramp-compat-copy-file + filename newname ok-if-already-exists keep-date preserve-uid-gid)))) (preserve-uid-gid - (tramp-compat-funcall - 'copy-file filename newname ok-if-already-exists keep-date - preserve-uid-gid)) + (condition-case nil + (tramp-compat-funcall + 'copy-file filename newname ok-if-already-exists keep-date + preserve-uid-gid) + (wrong-number-of-arguments + (tramp-compat-copy-file + filename newname ok-if-already-exists keep-date)))) (t (copy-file filename newname ok-if-already-exists keep-date)))) @@ -518,6 +526,58 @@ EOL-TYPE can be one of `dos', `unix', or `mac'." "`dos', `unix', or `mac'"))))) (t (error "Can't change EOL conversion -- is MULE missing?")))) +;; `replace-regexp-in-string' does not exist in XEmacs. +;; Implementation is taken from Emacs 24. +(if (fboundp 'replace-regexp-in-string) + (defalias 'tramp-compat-replace-regexp-in-string 'replace-regexp-in-string) + (defun tramp-compat-replace-regexp-in-string + (regexp rep string &optional fixedcase literal subexp start) + "Replace all matches for REGEXP with REP in STRING. + +Return a new string containing the replacements. + +Optional arguments FIXEDCASE, LITERAL and SUBEXP are like the +arguments with the same names of function `replace-match'. If START +is non-nil, start replacements at that index in STRING. + +REP is either a string used as the NEWTEXT arg of `replace-match' or a +function. If it is a function, it is called with the actual text of each +match, and its value is used as the replacement text. When REP is called, +the match data are the result of matching REGEXP against a substring +of STRING. + +To replace only the first match (if any), make REGEXP match up to \\' +and replace a sub-expression, e.g. + (replace-regexp-in-string \"\\\\(foo\\\\).*\\\\'\" \"bar\" \" foo foo\" nil nil 1) + => \" bar foo\"" + + (let ((l (length string)) + (start (or start 0)) + matches str mb me) + (save-match-data + (while (and (< start l) (string-match regexp string start)) + (setq mb (match-beginning 0) + me (match-end 0)) + ;; If we matched the empty string, make sure we advance by one char + (when (= me mb) (setq me (min l (1+ mb)))) + ;; Generate a replacement for the matched substring. + ;; Operate only on the substring to minimize string consing. + ;; Set up match data for the substring for replacement; + ;; presumably this is likely to be faster than munging the + ;; match data directly in Lisp. + (string-match regexp (setq str (substring string mb me))) + (setq matches + (cons (replace-match (if (stringp rep) + rep + (funcall rep (match-string 0 str))) + fixedcase literal str subexp) + (cons (substring string start mb) ; unmatched prefix + matches))) + (setq start me)) + ;; Reconstruct a string from the pieces. + (setq matches (cons (substring string start l) matches)) ; leftover + (apply #'concat (nreverse matches)))))) + (add-hook 'tramp-unload-hook (lambda () (unload-feature 'tramp-compat 'force))) diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el index e70400af820..8f79e495420 100644 --- a/lisp/net/tramp-gvfs.el +++ b/lisp/net/tramp-gvfs.el @@ -453,7 +453,7 @@ Every entry is a list (NAME ADDRESS).") (insert-directory . tramp-gvfs-handle-insert-directory) (insert-file-contents . tramp-gvfs-handle-insert-file-contents) (load . tramp-handle-load) - ;; `make-auto-save-file-name' performed by default handler. + (make-auto-save-file-name . tramp-handle-make-auto-save-file-name) (make-directory . tramp-gvfs-handle-make-directory) (make-directory-internal . ignore) (make-symbolic-link . ignore) @@ -594,15 +594,19 @@ is no information where to trace the message.") (and (tramp-tramp-file-p newname) (not (tramp-gvfs-file-name-p newname)))) - ;; We cannot copy directly. + ;; We cannot call `copy-file' directly. Use + ;; `tramp-compat-funcall' for backward compatibility (number + ;; of arguments). (let ((tmpfile (tramp-compat-make-temp-file filename))) (cond (preserve-extended-attributes - (copy-file + (tramp-compat-funcall + 'copy-file filename tmpfile t keep-date preserve-uid-gid preserve-extended-attributes)) (preserve-uid-gid - (copy-file filename tmpfile t keep-date preserve-uid-gid)) + (tramp-compat-funcall + 'copy-file filename tmpfile t keep-date preserve-uid-gid)) (t (copy-file filename tmpfile t keep-date))) (rename-file tmpfile newname ok-if-already-exists)) @@ -950,7 +954,7 @@ is no information where to trace the message.") (tramp-message proc 6 "%S\n%s" proc string) (setq string (concat rest-string string) ;; Attribute change is returned in unused wording. - string (replace-regexp-in-string + string (tramp-compat-replace-regexp-in-string "ATTRIB CHANGED" "ATTRIBUTE_CHANGED" string)) (while (string-match @@ -960,7 +964,7 @@ is no information where to trace the message.") "Event = \\([^[:blank:]]+\\)[\n\r]+") string) (let ((action (intern-soft - (replace-regexp-in-string + (tramp-compat-replace-regexp-in-string "_" "-" (downcase (match-string 2 string))))) (file (match-string 1 string))) (setq string (replace-match "" nil nil string)) @@ -1158,7 +1162,8 @@ is no information where to trace the message.") (defun tramp-gvfs-file-name (object-path) "Retrieve file name from D-Bus OBJECT-PATH." (dbus-unescape-from-identifier - (replace-regexp-in-string "^.*/\\([^/]+\\)$" "\\1" object-path))) + (tramp-compat-replace-regexp-in-string + "^.*/\\([^/]+\\)$" "\\1" object-path))) (defun tramp-bluez-address (device) "Return bluetooth device address from a given bluetooth DEVICE name." @@ -1424,7 +1429,8 @@ It was \"a(say)\", but has changed to \"a{sv})\"." (string-match "^/?\\([^/]+\\)" localname) (list (tramp-gvfs-mount-spec-entry "type" "smb-share") (tramp-gvfs-mount-spec-entry "server" host) - (tramp-gvfs-mount-spec-entry "share" (match-string 1 localname)))) + (tramp-gvfs-mount-spec-entry + "share" (match-string 1 localname)))) ((string-equal "obex" method) (list (tramp-gvfs-mount-spec-entry "type" method) (tramp-gvfs-mount-spec-entry @@ -1441,7 +1447,8 @@ It was \"a(say)\", but has changed to \"a{sv})\"." ,@(when domain (list (tramp-gvfs-mount-spec-entry "domain" domain))) ,@(when port - (list (tramp-gvfs-mount-spec-entry "port" (number-to-string port)))))) + (list (tramp-gvfs-mount-spec-entry + "port" (number-to-string port)))))) (mount-pref (if (and (string-match "\\`dav" method) (string-match "^/?[^/]+" localname)) @@ -1458,7 +1465,7 @@ It was \"a(say)\", but has changed to \"a{sv})\"." "Maybe open a connection VEC. Does not do anything if a connection is already open, but re-opens the connection if a previous connection has died for some reason." - (tramp-check-proper-host vec) + (tramp-check-proper-method-and-host vec) ;; We set the file name, in case there are incoming D-Bus signals or ;; D-Bus errors. @@ -1707,11 +1714,13 @@ They are retrieved from the hal daemon." (when (with-tramp-dbus-call-method tramp-gvfs-dbus-event-vector t :system tramp-hal-service device tramp-hal-interface-device "PropertyExists" "sync.plugin") - (pushnew - (with-tramp-dbus-call-method tramp-gvfs-dbus-event-vector t - :system tramp-hal-service device tramp-hal-interface-device - "GetPropertyString" "pda.pocketpc.name") - tramp-synce-devices :test #'equal))) + (let ((prop + (with-tramp-dbus-call-method + tramp-gvfs-dbus-event-vector t + :system tramp-hal-service device tramp-hal-interface-device + "GetPropertyString" "pda.pocketpc.name"))) + (unless (member prop tramp-synce-devices) + (push prop tramp-synce-devices))))) (tramp-message tramp-gvfs-dbus-event-vector 10 "%s" tramp-synce-devices) tramp-synce-devices)) diff --git a/lisp/net/tramp-gw.el b/lisp/net/tramp-gw.el index 53dbdbc45d4..e2c7461228f 100644 --- a/lisp/net/tramp-gw.el +++ b/lisp/net/tramp-gw.el @@ -238,7 +238,7 @@ authentication is requested from proxy server, provide it." tramp-gw-vector 6 "\n%s" (format "%s%s\r\n" command - (replace-regexp-in-string ;; no password in trace! + (tramp-compat-replace-regexp-in-string ;; no password in trace! "Basic [^\r\n]+" "Basic xxxxx" authentication t))) (with-current-buffer buffer ;; Trap errors to be traced in the right trace buffer. Often, diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 8ca94122af1..4bc836b88d5 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -850,7 +850,7 @@ of command line.") (insert-file-contents-literally . tramp-sh-handle-insert-file-contents-literally) (load . tramp-handle-load) - (make-auto-save-file-name . tramp-sh-handle-make-auto-save-file-name) + (make-auto-save-file-name . tramp-handle-make-auto-save-file-name) (make-directory . tramp-sh-handle-make-directory) (make-symbolic-link . tramp-sh-handle-make-symbolic-link) (process-file . tramp-sh-handle-process-file) @@ -2978,48 +2978,6 @@ the result will be a local, non-Tramp, filename." (fset 'find-buffer-file-type find-buffer-file-type-function) (fmakunbound 'find-buffer-file-type))))) -(defun tramp-sh-handle-make-auto-save-file-name () - "Like `make-auto-save-file-name' for Tramp files. -Returns a file name in `tramp-auto-save-directory' for autosaving this file." - (let ((tramp-auto-save-directory tramp-auto-save-directory) - (buffer-file-name - (tramp-subst-strs-in-string - '(("_" . "|") - ("/" . "_a") - (":" . "_b") - ("|" . "__") - ("[" . "_l") - ("]" . "_r")) - (buffer-file-name)))) - ;; File name must be unique. This is ensured with Emacs 22 (see - ;; UNIQUIFY element of `auto-save-file-name-transforms'); but for - ;; all other cases we must do it ourselves. - (when (boundp 'auto-save-file-name-transforms) - (mapc - (lambda (x) - (when (and (string-match (car x) buffer-file-name) - (not (car (cddr x)))) - (setq tramp-auto-save-directory - (or tramp-auto-save-directory - (tramp-compat-temporary-file-directory))))) - (symbol-value 'auto-save-file-name-transforms))) - ;; Create directory. - (when tramp-auto-save-directory - (setq buffer-file-name - (expand-file-name buffer-file-name tramp-auto-save-directory)) - (unless (file-exists-p tramp-auto-save-directory) - (make-directory tramp-auto-save-directory t))) - ;; Run plain `make-auto-save-file-name'. There might be an advice when - ;; it is not a magic file name operation (since Emacs 22). - ;; We must deactivate it temporarily. - (if (not (ad-is-active 'make-auto-save-file-name)) - (tramp-run-real-handler 'make-auto-save-file-name nil) - ;; else - (ad-deactivate 'make-auto-save-file-name) - (prog1 - (tramp-run-real-handler 'make-auto-save-file-name nil) - (ad-activate 'make-auto-save-file-name))))) - ;; CCC grok LOCKNAME (defun tramp-sh-handle-write-region (start end filename &optional append visit lockname confirm) @@ -3425,7 +3383,7 @@ Fall back to normal file name handler if no Tramp handler exists." (tramp-message proc 6 "%S\n%s" proc string) (setq string (concat rest-string string) ;; Attribute change is returned in unused wording. - string (replace-regexp-in-string + string (tramp-compat-replace-regexp-in-string "ATTRIB CHANGED" "ATTRIBUTE_CHANGED" string)) (while (string-match @@ -3439,7 +3397,7 @@ Fall back to normal file name handler if no Tramp handler exists." (list proc (intern-soft - (replace-regexp-in-string + (tramp-compat-replace-regexp-in-string "_" "-" (downcase (match-string 4 string)))) ;; File names are returned as absolute paths. We must ;; add the remote prefix. @@ -3475,7 +3433,8 @@ Fall back to normal file name handler if no Tramp handler exists." proc (mapcar (lambda (x) - (intern-soft (replace-regexp-in-string "_" "-" (downcase x)))) + (intern-soft + (tramp-compat-replace-regexp-in-string "_" "-" (downcase x)))) (split-string (match-string 1 line) "," 'omit-nulls)) (match-string 3 line)))) ;; Usually, we would add an Emacs event now. Unfortunately, @@ -3846,11 +3805,12 @@ process to set up. VEC specifies the connection." vec "uname" (tramp-send-command-and-read vec "echo \\\"`uname -sr`\\\"")))) (when (and (stringp old-uname) (not (string-equal old-uname new-uname))) - (tramp-cleanup vec) (tramp-message vec 3 "Connection reset, because remote host changed from `%s' to `%s'" old-uname new-uname) + ;; We want to keep the password. + (tramp-cleanup-connection vec t t) (throw 'uname-changed (tramp-maybe-open-connection vec)))) ;; Check whether the remote host suffers from buggy @@ -4252,7 +4212,7 @@ Gateway hops are already opened." ?h (or (tramp-file-name-host (car target-alist)) "")))) (with-parsed-tramp-file-name proxy l ;; Add the hop. - (pushnew l target-alist :test #'equal) + (push l target-alist) ;; Start next search. (setq choices tramp-default-proxies-alist))))) @@ -4270,11 +4230,11 @@ Gateway hops are already opened." vec 'file-error "Connection `%s' is not supported for gateway access." hop)) ;; Open the gateway connection. - (pushnew + (push (vector (tramp-file-name-method hop) (tramp-file-name-user hop) (tramp-compat-funcall 'tramp-gw-open-connection vec gw hop) nil nil) - target-alist :test #'equal) + target-alist) ;; For the password prompt, we need the correct values. ;; Therefore, we must remember the gateway vector. But we ;; cannot do it as connection property, because it shouldn't @@ -4326,70 +4286,70 @@ Gateway hops are already opened." "Maybe open a connection VEC. Does not do anything if a connection is already open, but re-opens the connection if a previous connection has died for some reason." - (tramp-check-proper-host vec) - - (catch 'uname-changed - (let ((p (tramp-get-connection-process vec)) - (process-name (tramp-get-connection-property vec "process-name" nil)) - (process-environment (copy-sequence process-environment)) - (pos (with-current-buffer (tramp-get-connection-buffer vec) (point)))) - - ;; If Tramp opens the same connection within a short time frame, - ;; there is a problem. We shall signal this. - (unless (or (and p (processp p) (memq (process-status p) '(run open))) - (not (equal (butlast (append vec nil) 2) - (car tramp-current-connection))) - (> (tramp-time-diff - (current-time) (cdr tramp-current-connection)) - (or tramp-connection-min-time-diff 0))) - (throw 'suppress 'suppress)) - - ;; If too much time has passed since last command was sent, look - ;; whether process is still alive. If it isn't, kill it. When - ;; using ssh, it can sometimes happen that the remote end has - ;; hung up but the local ssh client doesn't recognize this until - ;; it tries to send some data to the remote end. So that's why - ;; we try to send a command from time to time, then look again - ;; whether the process is really alive. - (condition-case nil - (when (and (> (tramp-time-diff - (current-time) - (tramp-get-connection-property - p "last-cmd-time" '(0 0 0))) - 60) - p (processp p) (memq (process-status p) '(run open))) - (tramp-send-command vec "echo are you awake" t t) - (unless (and (memq (process-status p) '(run open)) - (tramp-wait-for-output p 10)) - ;; The error will be caught locally. - (tramp-error vec 'file-error "Awake did fail"))) - (file-error - (tramp-cleanup vec) - (setq p nil))) - - ;; New connection must be opened. - (condition-case err - (unless (and p (processp p) (memq (process-status p) '(run open))) - - ;; We call `tramp-get-buffer' in order to get a debug - ;; buffer for messages from the beginning. - (tramp-get-buffer vec) - - ;; If `non-essential' is non-nil, don't reopen a new connection. - (when (and (boundp 'non-essential) (symbol-value 'non-essential)) - (throw 'non-essential 'non-essential)) - - (with-tramp-progress-reporter - vec 3 - (if (zerop (length (tramp-file-name-user vec))) - (format "Opening connection for %s using %s" - (tramp-file-name-host vec) - (tramp-file-name-method vec)) - (format "Opening connection for %s@%s using %s" - (tramp-file-name-user vec) + (tramp-check-proper-method-and-host vec) + + (let ((p (tramp-get-connection-process vec)) + (process-name (tramp-get-connection-property vec "process-name" nil)) + (process-environment (copy-sequence process-environment)) + (pos (with-current-buffer (tramp-get-connection-buffer vec) (point)))) + + ;; If Tramp opens the same connection within a short time frame, + ;; there is a problem. We shall signal this. + (unless (or (and p (processp p) (memq (process-status p) '(run open))) + (not (equal (butlast (append vec nil) 2) + (car tramp-current-connection))) + (> (tramp-time-diff + (current-time) (cdr tramp-current-connection)) + (or tramp-connection-min-time-diff 0))) + (throw 'suppress 'suppress)) + + ;; If too much time has passed since last command was sent, look + ;; whether process is still alive. If it isn't, kill it. When + ;; using ssh, it can sometimes happen that the remote end has hung + ;; up but the local ssh client doesn't recognize this until it + ;; tries to send some data to the remote end. So that's why we + ;; try to send a command from time to time, then look again + ;; whether the process is really alive. + (condition-case nil + (when (and (> (tramp-time-diff + (current-time) + (tramp-get-connection-property + p "last-cmd-time" '(0 0 0))) + 60) + p (processp p) (memq (process-status p) '(run open))) + (tramp-send-command vec "echo are you awake" t t) + (unless (and (memq (process-status p) '(run open)) + (tramp-wait-for-output p 10)) + ;; The error will be caught locally. + (tramp-error vec 'file-error "Awake did fail"))) + (file-error + (tramp-cleanup-connection vec t) + (setq p nil))) + + ;; New connection must be opened. + (condition-case err + (unless (and p (processp p) (memq (process-status p) '(run open))) + + ;; We call `tramp-get-buffer' in order to get a debug buffer + ;; for messages from the beginning. + (tramp-get-buffer vec) + + ;; If `non-essential' is non-nil, don't reopen a new connection. + (when (and (boundp 'non-essential) (symbol-value 'non-essential)) + (throw 'non-essential 'non-essential)) + + (with-tramp-progress-reporter + vec 3 + (if (zerop (length (tramp-file-name-user vec))) + (format "Opening connection for %s using %s" (tramp-file-name-host vec) - (tramp-file-name-method vec))) + (tramp-file-name-method vec)) + (format "Opening connection for %s@%s using %s" + (tramp-file-name-user vec) + (tramp-file-name-host vec) + (tramp-file-name-method vec))) + (catch 'uname-changed ;; Start new process. (when (and p (processp p)) (delete-process p)) @@ -4544,13 +4504,13 @@ connection if a previous connection has died for some reason." target-alist (cdr target-alist))) ;; Make initial shell settings. - (tramp-open-connection-setup-interactive-shell p vec)))) + (tramp-open-connection-setup-interactive-shell p vec))))) - ;; When the user did interrupt, we must cleanup. - (quit - (tramp-cleanup vec) - ;; Propagate the quit signal. - (signal (car err) (cdr err))))))) + ;; When the user did interrupt, we must cleanup. + (quit + (tramp-cleanup-connection vec t) + ;; Propagate the quit signal. + (signal (car err) (cdr err)))))) (defun tramp-send-command (vec command &optional neveropen nooutput) "Send the COMMAND to connection VEC. @@ -4990,38 +4950,99 @@ Return ATTR." (defun tramp-get-remote-id (vec) (with-tramp-connection-property vec "id" (tramp-message vec 5 "Finding POSIX `id' command") - (or - (catch 'id-found - (let ((dl (tramp-get-remote-path vec)) - result) - (while (and dl (setq result (tramp-find-executable vec "id" dl t t))) - ;; Check POSIX parameter. - (when (tramp-send-command-and-check vec (format "%s -u" result)) - (throw 'id-found result)) - (setq dl (cdr dl))))) - (tramp-error vec 'file-error "Couldn't find a POSIX `id' command")))) + (catch 'id-found + (let ((dl (tramp-get-remote-path vec)) + result) + (while (and dl (setq result (tramp-find-executable vec "id" dl t t))) + ;; Check POSIX parameter. + (when (tramp-send-command-and-check vec (format "%s -u" result)) + (throw 'id-found result)) + (setq dl (cdr dl))))))) + +(defun tramp-get-remote-uid-with-id (vec id-format) + (tramp-send-command-and-read + vec + (format "%s -u%s %s" + (tramp-get-remote-id vec) + (if (equal id-format 'integer) "" "n") + (if (equal id-format 'integer) + "" "| sed -e s/^/\\\"/ -e s/\$/\\\"/")))) + +(defun tramp-get-remote-uid-with-perl (vec id-format) + (tramp-send-command-and-read + vec + (format "%s -le '%s'" + (tramp-get-remote-perl vec) + (if (equal id-format 'integer) + "print $>" + "print \"\\\"\", scalar getpwuid($>), \"\\\"\"")))) + +(defun tramp-get-remote-python (vec) + (with-tramp-connection-property vec "python" + (tramp-message vec 5 "Finding a suitable `python' command") + (tramp-find-executable vec "python" (tramp-get-remote-path vec)))) + +(defun tramp-get-remote-uid-with-python (vec id-format) + (tramp-send-command-and-read + vec + (format "%s -c \"%s\"" + (tramp-get-remote-python vec) + (if (equal id-format 'integer) + "import os; print os.getuid()" + "import os, pwd; print '\\\"' + pwd.getpwuid(os.getuid())[0] + '\\\"'")))) (defun tramp-get-remote-uid (vec id-format) (with-tramp-connection-property vec (format "uid-%s" id-format) - (let ((res (tramp-send-command-and-read - vec - (format "%s -u%s %s" - (tramp-get-remote-id vec) - (if (equal id-format 'integer) "" "n") - (if (equal id-format 'integer) - "" "| sed -e s/^/\\\"/ -e s/\$/\\\"/"))))) + (let ((res (cond + ((tramp-get-remote-id vec) + (tramp-get-remote-uid-with-id vec id-format)) + ((tramp-get-remote-perl vec) + (tramp-get-remote-uid-with-perl vec id-format)) + ((tramp-get-remote-python vec) + (tramp-get-remote-uid-with-python vec id-format)) + (t (tramp-error + vec 'file-error "Cannot determine remote uid"))))) ;; The command might not always return a number. (if (and (equal id-format 'integer) (not (integerp res))) -1 res)))) +(defun tramp-get-remote-gid-with-id (vec id-format) + (tramp-send-command-and-read + vec + (format "%s -g%s %s" + (tramp-get-remote-id vec) + (if (equal id-format 'integer) "" "n") + (if (equal id-format 'integer) + "" "| sed -e s/^/\\\"/ -e s/\$/\\\"/")))) + +(defun tramp-get-remote-gid-with-perl (vec id-format) + (tramp-send-command-and-read + vec + (format "%s -le '%s'" + (tramp-get-remote-perl vec) + (if (equal id-format 'integer) + "print ($)=~/(\\d+)/)" + "print \"\\\"\", scalar getgrgid($)), \"\\\"\"")))) + +(defun tramp-get-remote-gid-with-python (vec id-format) + (tramp-send-command-and-read + vec + (format "%s -c \"%s\"" + (tramp-get-remote-python vec) + (if (equal id-format 'integer) + "import os; print os.getgid()" + "import os, grp; print '\\\"' + grp.getgrgid(os.getgid())[0] + '\\\"'")))) + (defun tramp-get-remote-gid (vec id-format) (with-tramp-connection-property vec (format "gid-%s" id-format) - (let ((res (tramp-send-command-and-read - vec - (format "%s -g%s %s" - (tramp-get-remote-id vec) - (if (equal id-format 'integer) "" "n") - (if (equal id-format 'integer) - "" "| sed -e s/^/\\\"/ -e s/\$/\\\"/"))))) + (let ((res (cond + ((tramp-get-remote-id vec) + (tramp-get-remote-gid-with-id vec id-format)) + ((tramp-get-remote-perl vec) + (tramp-get-remote-gid-with-perl vec id-format)) + ((tramp-get-remote-python vec) + (tramp-get-remote-gid-with-python vec id-format)) + (t (tramp-error + vec 'file-error "Cannot determine remote gid"))))) ;; The command might not always return a number. (if (and (equal id-format 'integer) (not (integerp res))) -1 res)))) diff --git a/lisp/net/tramp-smb.el b/lisp/net/tramp-smb.el index f05a54f46f7..03ad62be0a5 100644 --- a/lisp/net/tramp-smb.el +++ b/lisp/net/tramp-smb.el @@ -229,7 +229,7 @@ See `tramp-actions-before-shell' for more info.") (insert-directory . tramp-smb-handle-insert-directory) (insert-file-contents . tramp-handle-insert-file-contents) (load . tramp-handle-load) - ;; `make-auto-save-file-name' performed by default handler. + (make-auto-save-file-name . tramp-handle-make-auto-save-file-name) (make-directory . tramp-smb-handle-make-directory) (make-directory-internal . tramp-smb-handle-make-directory-internal) (make-symbolic-link . tramp-smb-handle-make-symbolic-link) @@ -403,7 +403,7 @@ pass to the OPERATION." (port (tramp-file-name-port v)) (share (tramp-smb-get-share v)) (localname (file-name-as-directory - (replace-regexp-in-string + (tramp-compat-replace-regexp-in-string "\\\\" "/" (tramp-smb-get-localname v)))) (tmpdir (make-temp-name (expand-file-name @@ -537,7 +537,8 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored." (unless (tramp-smb-send-command v (format "put \"%s\" \"%s\"" filename (tramp-smb-get-localname v))) - (tramp-error v 'file-error "Cannot copy `%s'" filename)))))) + (tramp-error + v 'file-error "Cannot copy `%s' to `%s'" filename newname)))))) ;; KEEP-DATE handling. (when keep-date @@ -1151,7 +1152,8 @@ target of the symlink differ." (tramp-dissect-file-name (if (file-remote-p filename) filename newname)) 0 (format "Renaming %s to %s" filename newname) - (if (and (tramp-equal-remote filename newname) + (if (and (not (file-exists-p newname)) + (tramp-equal-remote filename newname) (string-equal (tramp-smb-get-share (tramp-dissect-file-name filename)) (tramp-smb-get-share (tramp-dissect-file-name newname)))) @@ -1364,14 +1366,14 @@ Result is a list of (LOCALNAME MODE SIZE MONTH DAY TIME YEAR)." (while (not (eobp)) (setq entry (tramp-smb-read-file-entry share)) (forward-line) - (when entry (pushnew entry res :test #'equal)))) + (when entry (push entry res)))) ;; Cache share entries. (unless share (tramp-set-connection-property v "share-cache" res))) ;; Add directory itself. - (pushnew '("" "drwxrwxrwx" 0 (0 0)) res :test #'equal) + (push '("" "drwxrwxrwx" 0 (0 0)) res) ;; There's a very strange error (debugged with XEmacs 21.4.14) ;; If there's no short delay, it returns nil. No idea about. @@ -1564,7 +1566,7 @@ Does not do anything if a connection is already open, but re-opens the connection if a previous connection has died for some reason. If ARGUMENT is non-nil, use it as argument for `tramp-smb-winexe-program', and suppress any checks." - (tramp-check-proper-host vec) + (tramp-check-proper-method-and-host vec) (let* ((share (tramp-smb-get-share vec)) (buf (tramp-get-connection-buffer vec)) @@ -1719,11 +1721,15 @@ If ARGUMENT is non-nil, use it as argument for (error (with-current-buffer (tramp-get-connection-buffer vec) (goto-char (point-min)) - (if (search-forward-regexp - tramp-smb-wrong-passwd-regexp nil t) + (if (and (boundp 'auth-sources) + (symbol-value 'auth-sources) + (search-forward-regexp + tramp-smb-wrong-passwd-regexp nil t)) ;; Disable `auth-source' and `password-cache'. + (tramp-message + vec 3 "Retry connection with new password") (let (auth-sources) - (tramp-cleanup vec) + (tramp-cleanup-connection vec t) (tramp-smb-maybe-open-connection vec argument)) ;; Propagate the error. (signal (car err) (cdr err))))))))))))) diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index 6c3ae376dc3..48420aad5a3 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -690,7 +690,7 @@ Useful for \"rsync\" like methods.") ;; Tramp only knows how to deal with `file-name-handler-alist', not ;; the other places. -;; Currently, we have the choice between 'ftp, 'sep, and 'url. +;; Currently, we have the choice between 'ftp and 'sep. ;;;###autoload (defcustom tramp-syntax (if (featurep 'xemacs) 'sep 'ftp) @@ -699,20 +699,15 @@ Useful for \"rsync\" like methods.") It can have the following values: 'ftp -- Ange-FTP respective EFS like syntax (GNU Emacs default) - 'sep -- Syntax as defined for XEmacs (not available yet for GNU Emacs) - 'url -- URL-like syntax." + 'sep -- Syntax as defined for XEmacs." :group 'tramp - :type (if (featurep 'xemacs) - '(choice (const :tag "EFS" ftp) - (const :tag "XEmacs" sep) - (const :tag "URL" url)) - '(choice (const :tag "Ange-FTP" ftp) - (const :tag "URL" url)))) + :version "24.4" + :type `(choice (const :tag ,(if (featurep 'xemacs) "EFS" "Ange-FTP") ftp) + (const :tag "XEmacs" sep))) (defconst tramp-prefix-format (cond ((equal tramp-syntax 'ftp) "/") ((equal tramp-syntax 'sep) "/[") - ((equal tramp-syntax 'url) "/") (t (error "Wrong `tramp-syntax' defined"))) "String matching the very beginning of Tramp file names. Used in `tramp-make-tramp-file-name'.") @@ -729,7 +724,6 @@ Should always start with \"^\". Derived from `tramp-prefix-format'.") (defconst tramp-postfix-method-format (cond ((equal tramp-syntax 'ftp) ":") ((equal tramp-syntax 'sep) "/") - ((equal tramp-syntax 'url) "://") (t (error "Wrong `tramp-syntax' defined"))) "String matching delimiter between method and user or host names. Used in `tramp-make-tramp-file-name'.") @@ -776,7 +770,6 @@ Derived from `tramp-postfix-user-format'.") (defconst tramp-prefix-ipv6-format (cond ((equal tramp-syntax 'ftp) "[") ((equal tramp-syntax 'sep) "") - ((equal tramp-syntax 'url) "[") (t (error "Wrong `tramp-syntax' defined"))) "String matching left hand side of IPv6 addresses. Used in `tramp-make-tramp-file-name'.") @@ -796,7 +789,6 @@ Derived from `tramp-prefix-ipv6-format'.") (defconst tramp-postfix-ipv6-format (cond ((equal tramp-syntax 'ftp) "]") ((equal tramp-syntax 'sep) "") - ((equal tramp-syntax 'url) "]") (t (error "Wrong `tramp-syntax' defined"))) "String matching right hand side of IPv6 addresses. Used in `tramp-make-tramp-file-name'.") @@ -809,7 +801,6 @@ Derived from `tramp-postfix-ipv6-format'.") (defconst tramp-prefix-port-format (cond ((equal tramp-syntax 'ftp) "#") ((equal tramp-syntax 'sep) "#") - ((equal tramp-syntax 'url) ":") (t (error "Wrong `tramp-syntax' defined"))) "String matching delimiter between host names and port numbers.") @@ -838,7 +829,6 @@ Derived from `tramp-postfix-hop-format'.") (defconst tramp-postfix-host-format (cond ((equal tramp-syntax 'ftp) ":") ((equal tramp-syntax 'sep) "]") - ((equal tramp-syntax 'url) "") (t (error "Wrong `tramp-syntax' defined"))) "String matching delimiter between host names and localnames. Used in `tramp-make-tramp-file-name'.") @@ -909,15 +899,9 @@ XEmacs uses a separate filename syntax for Tramp and EFS. See `tramp-file-name-structure' for more explanations.") ;;;###autoload -(defconst tramp-file-name-regexp-url "\\`/[^/|:]+://" - "Value for `tramp-file-name-regexp' for URL-like remoting. -See `tramp-file-name-structure' for more explanations.") - -;;;###autoload (defconst tramp-file-name-regexp (cond ((equal tramp-syntax 'ftp) tramp-file-name-regexp-unified) ((equal tramp-syntax 'sep) tramp-file-name-regexp-separate) - ((equal tramp-syntax 'url) tramp-file-name-regexp-url) (t (error "Wrong `tramp-syntax' defined"))) "Regular expression matching file names handled by Tramp. This regexp should match Tramp file names but no other file names. @@ -952,16 +936,9 @@ XEmacs uses a separate filename syntax for Tramp and EFS. See `tramp-file-name-structure' for more explanations.") ;;;###autoload -(defconst tramp-completion-file-name-regexp-url - "\\`/[^/:]+\\(:\\(/\\(/[^/]*\\)?\\)?\\)?\\'" - "Value for `tramp-completion-file-name-regexp' for URL-like remoting. -See `tramp-file-name-structure' for more explanations.") - -;;;###autoload (defconst tramp-completion-file-name-regexp (cond ((equal tramp-syntax 'ftp) tramp-completion-file-name-regexp-unified) ((equal tramp-syntax 'sep) tramp-completion-file-name-regexp-separate) - ((equal tramp-syntax 'url) tramp-completion-file-name-regexp-url) (t (error "Wrong `tramp-syntax' defined"))) "Regular expression matching file names handled by Tramp completion. This regexp should match partial Tramp file names only. @@ -1245,10 +1222,11 @@ their replacement." ;; This works with the current set of `tramp-obsolete-methods'. ;; Must be improved, if their are more sophisticated replacements. (setq result (substring result 0 -1))) - ;; We must mark, whether a default value has been used. - (if (or method (null result)) + ;; We must mark, whether a default value has been used. Not + ;; applicable for XEmacs. + (if (or method (null result) (null (functionp 'propertize))) result - (propertize result 'tramp-default t)))) + (tramp-compat-funcall 'propertize result 'tramp-default t)))) (defun tramp-find-user (method user host) "Return the right user string to use. @@ -1266,10 +1244,11 @@ This is USER, if non-nil. Otherwise, do a lookup in (setq choices nil))) luser) tramp-default-user))) - ;; We must mark, whether a default value has been used. - (if (or user (null result)) + ;; We must mark, whether a default value has been used. Not + ;; applicable for XEmacs. + (if (or user (null result) (null (functionp 'propertize))) result - (propertize result 'tramp-default t)))) + (tramp-compat-funcall 'propertize result 'tramp-default t)))) (defun tramp-find-host (method user host) "Return the right host string to use. @@ -1286,15 +1265,19 @@ This is HOST, if non-nil. Otherwise, it is `tramp-default-host'." lhost) tramp-default-host)) -(defun tramp-check-proper-host (vec) - "Check host name of VEC." +(defun tramp-check-proper-method-and-host (vec) + "Check method and host name of VEC." (let ((method (tramp-file-name-method vec)) (user (tramp-file-name-user vec)) - (host (tramp-file-name-host vec))) + (host (tramp-file-name-host vec)) + (methods (mapcar 'car tramp-methods))) + (when (and method (not (member method methods))) + (tramp-cleanup-connection vec) + (tramp-user-error vec "Unknown method \"%s\"" method)) (when (and (equal tramp-syntax 'ftp) host (or (null method) (get-text-property 0 'tramp-default method)) (or (null user) (get-text-property 0 'tramp-default user)) - (member host (mapcar 'car tramp-methods))) + (member host methods)) (tramp-cleanup-connection vec) (tramp-user-error vec "Host name must not match method \"%s\"" host)))) @@ -1664,7 +1647,7 @@ without a visible progress reporter." (declare (indent 3) (debug t)) `(progn (tramp-message ,vec ,level "%s..." ,message) - (let ((result "failed") + (let ((cookie "failed") (tm ;; We start a pulsing progress reporter after 3 seconds. Feature ;; introduced in Emacs 24.1. @@ -1679,10 +1662,10 @@ without a visible progress reporter." #'tramp-progress-reporter-update pr))))))) (unwind-protect ;; Execute the body. - (prog1 (progn ,@body) (setq result "done")) + (prog1 (progn ,@body) (setq cookie "done")) ;; Stop progress reporter. (if tm (tramp-compat-funcall 'cancel-timer tm)) - (tramp-message ,vec ,level "%s...%s" ,message result))))) + (tramp-message ,vec ,level "%s...%s" ,message cookie))))) (tramp-compat-font-lock-add-keywords 'emacs-lisp-mode '("\\<with-tramp-progress-reporter\\>")) @@ -1733,19 +1716,6 @@ letter into the file name. This function removes it." (replace-match "/" nil t name) name))) -(defun tramp-cleanup (vec) - "Cleanup connection VEC, but keep the debug buffer." - (with-current-buffer (tramp-get-debug-buffer vec) - ;; Keep the debug buffer. - (rename-buffer - (generate-new-buffer-name tramp-temp-buffer-name) 'unique) - (tramp-cleanup-connection vec) - (if (= (point-min) (point-max)) - (kill-buffer nil) - (rename-buffer (tramp-debug-buffer-name vec) 'unique)) - ;; We call `tramp-get-buffer' in order to keep the debug buffer. - (tramp-get-buffer vec))) - ;;; Config Manipulation Functions: ;;;###tramp-autoload @@ -2168,7 +2138,7 @@ Falls back to normal file name handler if no Tramp file name handler exists." (tramp-message v 1 "Suppress received in operation %s" (append (list operation) args)) - (tramp-cleanup v) + (tramp-cleanup-connection v t) (tramp-run-real-handler operation args))) (t result))) @@ -2542,64 +2512,40 @@ They are collected by `tramp-completion-dissect-file-name1'." tramp-prefix-ipv6-regexp "\\(" tramp-completion-ipv6-regexp x-nil "\\)$") nil 1 2 nil)) - ;; "/method:user" "/[method/user" "/method://user" + ;; "/method:user" "/[method/user" (tramp-completion-file-name-structure7 (list (concat tramp-prefix-regexp "\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp "\\(" tramp-user-regexp x-nil "\\)$") 1 2 nil nil)) - ;; "/method:host" "/[method/host" "/method://host" + ;; "/method:host" "/[method/host" (tramp-completion-file-name-structure8 (list (concat tramp-prefix-regexp "\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp "\\(" tramp-host-regexp x-nil "\\)$") 1 nil 2 nil)) - ;; "/method:[ipv6" "/[method/ipv6" "/method://[ipv6" + ;; "/method:[ipv6" "/[method/ipv6" (tramp-completion-file-name-structure9 (list (concat tramp-prefix-regexp "\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp tramp-prefix-ipv6-regexp "\\(" tramp-completion-ipv6-regexp x-nil "\\)$") 1 nil 2 nil)) - ;; "/method:user@host" "/[method/user@host" "/method://user@host" + ;; "/method:user@host" "/[method/user@host" (tramp-completion-file-name-structure10 (list (concat tramp-prefix-regexp "\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp "\\(" tramp-user-regexp "\\)" tramp-postfix-user-regexp "\\(" tramp-host-regexp x-nil "\\)$") 1 2 3 nil)) - ;; "/method:user@[ipv6" "/[method/user@ipv6" "/method://user@[ipv6" + ;; "/method:user@[ipv6" "/[method/user@ipv6" (tramp-completion-file-name-structure11 (list (concat tramp-prefix-regexp "\\(" tramp-method-regexp "\\)" tramp-postfix-method-regexp "\\(" tramp-user-regexp "\\)" tramp-postfix-user-regexp tramp-prefix-ipv6-regexp "\\(" tramp-completion-ipv6-regexp x-nil "\\)$") - 1 2 3 nil)) - ;; "/method: "/method:/" - (tramp-completion-file-name-structure12 - (list - (if (equal tramp-syntax 'url) - (concat tramp-prefix-regexp - "\\(" tramp-method-regexp "\\)" - "\\(" (substring tramp-postfix-method-regexp 0 1) - "\\|" (substring tramp-postfix-method-regexp 1 2) "\\)" - "\\(" "\\)$") - ;; Should not match if not URL syntax. - (concat tramp-prefix-regexp "/$")) - 1 3 nil nil)) - ;; "/method: "/method:/" - (tramp-completion-file-name-structure13 - (list - (if (equal tramp-syntax 'url) - (concat tramp-prefix-regexp - "\\(" tramp-method-regexp "\\)" - "\\(" (substring tramp-postfix-method-regexp 0 1) - "\\|" (substring tramp-postfix-method-regexp 1 2) "\\)" - "\\(" "\\)$") - ;; Should not match if not URL syntax. - (concat tramp-prefix-regexp "/$")) - 1 nil 3 nil))) + 1 2 3 nil))) (mapc (lambda (structure) (add-to-list 'result @@ -2616,8 +2562,6 @@ They are collected by `tramp-completion-dissect-file-name1'." tramp-completion-file-name-structure9 tramp-completion-file-name-structure10 tramp-completion-file-name-structure11 - tramp-completion-file-name-structure12 - tramp-completion-file-name-structure13 tramp-file-name-structure)) (delq nil result))) @@ -3289,35 +3233,19 @@ User is always nil." (defun tramp-handle-substitute-in-file-name (filename) "Like `substitute-in-file-name' for Tramp files. -\"//\" and \"/~\" substitute only in the local filename part. -If the URL Tramp syntax is chosen, \"//\" as method delimiter and \"/~\" at -beginning of local filename are not substituted." +\"//\" and \"/~\" substitute only in the local filename part." ;; First, we must replace environment variables. (setq filename (tramp-replace-environment-variables filename)) (with-parsed-tramp-file-name filename nil - (if (equal tramp-syntax 'url) - ;; We need to check localname only. The other parts cannot contain - ;; "//" or "/~". - (if (and (> (length localname) 1) - (or (string-match "//" localname) - (string-match "/~" localname 1))) - (tramp-run-real-handler 'substitute-in-file-name (list filename)) - (tramp-make-tramp-file-name - (when method (substitute-in-file-name method)) - (when user (substitute-in-file-name user)) - (when host (substitute-in-file-name host)) - (when localname - (tramp-run-real-handler - 'substitute-in-file-name (list localname))))) - ;; Ignore in LOCALNAME everything before "//" or "/~". - (when (and (stringp localname) (string-match ".+?/\\(/\\|~\\)" localname)) - (setq filename - (concat (file-remote-p filename) - (replace-match "\\1" nil nil localname))) - ;; "/m:h:~" does not work for completion. We use "/m:h:~/". - (when (string-match "~$" filename) - (setq filename (concat filename "/")))) - (tramp-run-real-handler 'substitute-in-file-name (list filename))))) + ;; Ignore in LOCALNAME everything before "//" or "/~". + (when (and (stringp localname) (string-match ".+?/\\(/\\|~\\)" localname)) + (setq filename + (concat (file-remote-p filename) + (replace-match "\\1" nil nil localname))) + ;; "/m:h:~" does not work for completion. We use "/m:h:~/". + (when (string-match "~$" filename) + (setq filename (concat filename "/")))) + (tramp-run-real-handler 'substitute-in-file-name (list filename)))) (defun tramp-handle-unhandled-file-name-directory (_filename) "Like `unhandled-file-name-directory' for Tramp files." @@ -3985,6 +3913,48 @@ Return the local name of the temporary file." ;;; Auto saving to a special directory: +(defun tramp-handle-make-auto-save-file-name () + "Like `make-auto-save-file-name' for Tramp files. +Returns a file name in `tramp-auto-save-directory' for autosaving this file." + (let ((tramp-auto-save-directory tramp-auto-save-directory) + (buffer-file-name + (tramp-subst-strs-in-string + '(("_" . "|") + ("/" . "_a") + (":" . "_b") + ("|" . "__") + ("[" . "_l") + ("]" . "_r")) + (buffer-file-name)))) + ;; File name must be unique. This is ensured with Emacs 22 (see + ;; UNIQUIFY element of `auto-save-file-name-transforms'); but for + ;; all other cases we must do it ourselves. + (when (boundp 'auto-save-file-name-transforms) + (mapc + (lambda (x) + (when (and (string-match (car x) buffer-file-name) + (not (car (cddr x)))) + (setq tramp-auto-save-directory + (or tramp-auto-save-directory + (tramp-compat-temporary-file-directory))))) + (symbol-value 'auto-save-file-name-transforms))) + ;; Create directory. + (when tramp-auto-save-directory + (setq buffer-file-name + (expand-file-name buffer-file-name tramp-auto-save-directory)) + (unless (file-exists-p tramp-auto-save-directory) + (make-directory tramp-auto-save-directory t))) + ;; Run plain `make-auto-save-file-name'. There might be an advice when + ;; it is not a magic file name operation (since Emacs 22). + ;; We must deactivate it temporarily. + (if (not (ad-is-active 'make-auto-save-file-name)) + (tramp-run-real-handler 'make-auto-save-file-name nil) + ;; else + (ad-deactivate 'make-auto-save-file-name) + (prog1 + (tramp-run-real-handler 'make-auto-save-file-name nil) + (ad-activate 'make-auto-save-file-name))))) + (unless (tramp-exists-file-name-handler 'make-auto-save-file-name) (defadvice make-auto-save-file-name (around tramp-advice-make-auto-save-file-name () activate) diff --git a/lisp/obsolete/options.el b/lisp/obsolete/options.el index f25003e5652..16941167fb6 100644 --- a/lisp/obsolete/options.el +++ b/lisp/obsolete/options.el @@ -88,7 +88,7 @@ The Custom feature is intended to make this obsolete." ;; Edit Options mode is suitable only for specially formatted data. (put 'Edit-options-mode 'mode-class 'special) -(defun Edit-options-mode () +(define-derived-mode Edit-options-mode emacs-lisp-mode "Options" "\\<Edit-options-mode-map>\ Major mode for editing Emacs user option settings. Special commands are: @@ -100,17 +100,9 @@ Changed values made by these commands take effect immediately. Each variable description is a paragraph. For convenience, the characters \\[backward-paragraph] and \\[forward-paragraph] move back and forward by paragraphs." - (kill-all-local-variables) - (set-syntax-table emacs-lisp-mode-syntax-table) - (use-local-map Edit-options-mode-map) - (make-local-variable 'paragraph-separate) - (setq paragraph-separate "[^\^@-\^?]") - (make-local-variable 'paragraph-start) - (setq paragraph-start "\t") - (setq truncate-lines t) - (setq major-mode 'Edit-options-mode) - (setq mode-name "Options") - (run-mode-hooks 'Edit-options-mode-hook)) + (setq-local paragraph-separate "[^\^@-\^?]") + (setq-local paragraph-start "\t") + (setq-local truncate-lines t)) (defun Edit-options-set () (interactive) (Edit-options-modify diff --git a/lisp/play/5x5.el b/lisp/play/5x5.el index 2e3f500766f..4bd0c4ddcf4 100644 --- a/lisp/play/5x5.el +++ b/lisp/play/5x5.el @@ -185,19 +185,8 @@ GRID is the grid of positions to click.") ;; Gameplay functions. -(put '5x5-mode 'mode-class 'special) - -(defun 5x5-mode () - "A mode for playing `5x5'. - -The key bindings for `5x5-mode' are: - -\\{5x5-mode-map}" - (kill-all-local-variables) - (use-local-map 5x5-mode-map) - (setq major-mode '5x5-mode - mode-name "5x5") - (run-mode-hooks '5x5-mode-hook) +(define-derived-mode 5x5-mode special-mode "5x5" + "A mode for playing `5x5'." (setq buffer-read-only t truncate-lines t) (buffer-disable-undo)) diff --git a/lisp/play/blackbox.el b/lisp/play/blackbox.el index d38f799756b..ce2c928db0d 100644 --- a/lisp/play/blackbox.el +++ b/lisp/play/blackbox.el @@ -113,9 +113,8 @@ map)) ;; Blackbox mode is suitable only for specially formatted data. -(put 'blackbox-mode 'mode-class 'special) -(defun blackbox-mode () +(define-derived-mode blackbox-mode special-mode "Blackbox" "Major mode for playing blackbox. To learn how to play blackbox, see the documentation for function `blackbox'. @@ -124,13 +123,7 @@ The usual mnemonic keys move the cursor around the box. \\[bb-romp] -- send in a ray from point, or toggle a ball at point \\[bb-done] -- end game and get score" - (interactive) - (kill-all-local-variables) - (use-local-map blackbox-mode-map) - (setq truncate-lines t) - (setq major-mode 'blackbox-mode) - (setq mode-name "Blackbox") - (run-mode-hooks 'blackbox-mode-hook)) + (setq truncate-lines t)) ;;;###autoload (defun blackbox (num) diff --git a/lisp/play/bubbles.el b/lisp/play/bubbles.el index 665e98a69b2..ca7a4013796 100644 --- a/lisp/play/bubbles.el +++ b/lisp/play/bubbles.el @@ -1108,25 +1108,24 @@ Set `bubbles--col-offset' and `bubbles--row-offset'." Use optional parameter POS instead of point if given." (when bubbles--playing (unless pos (setq pos (point))) - (condition-case err - (let ((char (char-after pos)) - (inhibit-read-only t) - (row (bubbles--row (point))) - (col (bubbles--col (point)))) - (add-text-properties (point-min) (point-max) - '(face default active nil)) - (let ((count 0)) - (when (and row col (not (eq char (bubbles--empty-char)))) - (setq count (bubbles--mark-direct-neighbours row col char)) - (unless (> count 1) - (add-text-properties (point-min) (point-max) - '(face default active nil)) - (setq count 0))) - (bubbles--update-neighbourhood-score count)) - (put-text-property (point-min) (point-max) 'pointer 'arrow) - (bubbles--update-faces-or-images) - (sit-for 0)) - (error (message "Bubbles: Internal error %s" err))))) + (with-demoted-errors "Bubbles: Internal error %s" + (let ((char (char-after pos)) + (inhibit-read-only t) + (row (bubbles--row (point))) + (col (bubbles--col (point)))) + (add-text-properties (point-min) (point-max) + '(face default active nil)) + (let ((count 0)) + (when (and row col (not (eq char (bubbles--empty-char)))) + (setq count (bubbles--mark-direct-neighbours row col char)) + (unless (> count 1) + (add-text-properties (point-min) (point-max) + '(face default active nil)) + (setq count 0))) + (bubbles--update-neighbourhood-score count)) + (put-text-property (point-min) (point-max) 'pointer 'arrow) + (bubbles--update-faces-or-images) + (sit-for 0))))) (defun bubbles--neighbourhood-available () "Return t if another valid neighborhood is available." diff --git a/lisp/play/landmark.el b/lisp/play/landmark.el index cf86d7a9de5..8ee633e3917 100644 --- a/lisp/play/landmark.el +++ b/lisp/play/landmark.el @@ -233,10 +233,8 @@ (put 'landmark-mode 'intangible 1) ;; This one is for when they set view-read-only to t: Landmark cannot ;; allow View Mode to be activated in its buffer. -(put 'landmark-mode 'mode-class 'special) - -(defun landmark-mode () - "Major mode for playing Landmark against Emacs. +(define-derived-mode landmark-mode special-mode "Lm" + "Major mode for playing Lm against Emacs. You and Emacs play in turn by marking a free square. You mark it with X and Emacs marks it with O. The winner is the first to get five contiguous marks horizontally, vertically or in diagonal. @@ -247,16 +245,9 @@ Other useful commands: \\{landmark-mode-map} Entry to this mode calls the value of `landmark-mode-hook' if that value is non-nil. One interesting value is `turn-on-font-lock'." - (interactive) - (kill-all-local-variables) - (setq major-mode 'landmark-mode - mode-name "Landmark") (landmark-display-statistics) - (use-local-map landmark-mode-map) - (make-local-variable 'font-lock-defaults) - (setq font-lock-defaults '(landmark-font-lock-keywords t) - buffer-read-only t) - (run-mode-hooks 'landmark-mode-hook)) + (setq-local font-lock-defaults '(landmark-font-lock-keywords t)) + (setq buffer-read-only t)) ;;;_ + THE SCORE TABLE. diff --git a/lisp/play/life.el b/lisp/play/life.el index a73f3a58e66..438ff92c402 100644 --- a/lisp/play/life.el +++ b/lisp/play/life.el @@ -122,33 +122,32 @@ generations (this defaults to 1)." (life-setup) (catch 'life-exit (while t - (let ((inhibit-quit t)) + (let ((inhibit-quit t) + (inhibit-read-only t)) (life-display-generation sleeptime) (life-grim-reaper) (life-expand-plane-if-needed) (life-increment-generation))))) -(defalias 'life-mode 'life) -(put 'life-mode 'mode-class 'special) +(define-derived-mode life-mode special-mode "Life" + "Major mode for the buffer of `life'." + (setq-local case-fold-search nil) + (setq-local truncate-lines t) + (setq-local show-trailing-whitespace nil) + (setq-local life-current-generation 0) + (setq-local life-generation-string "0") + (setq-local mode-line-buffer-identification '("Life: generation " + life-generation-string)) + (setq-local fill-column (1- (window-width))) + (setq-local life-window-start 1) + (buffer-disable-undo)) (defun life-setup () - (let (n) - (switch-to-buffer (get-buffer-create "*Life*") t) - (erase-buffer) - (kill-all-local-variables) - (setq case-fold-search nil - mode-name "Life" - major-mode 'life-mode - truncate-lines t - show-trailing-whitespace nil - life-current-generation 0 - life-generation-string "0" - mode-line-buffer-identification '("Life: generation " - life-generation-string) - fill-column (1- (window-width)) - life-window-start 1) - (buffer-disable-undo (current-buffer)) - ;; stuff in the random pattern + (switch-to-buffer (get-buffer-create "*Life*") t) + (erase-buffer) + (life-mode) + ;; stuff in the random pattern + (let ((inhibit-read-only t)) (life-insert-random-pattern) ;; make sure (life-life-char) is used throughout (goto-char (point-min)) @@ -156,18 +155,18 @@ generations (this defaults to 1)." (replace-match (life-life-string) t t)) ;; center the pattern horizontally (goto-char (point-min)) - (setq n (/ (- fill-column (line-end-position)) 2)) - (while (not (eobp)) - (indent-to n) - (forward-line)) + (let ((n (/ (- fill-column (line-end-position)) 2))) + (while (not (eobp)) + (indent-to n) + (forward-line))) ;; center the pattern vertically - (setq n (/ (- (1- (window-height)) - (count-lines (point-min) (point-max))) - 2)) - (goto-char (point-min)) - (newline n) - (goto-char (point-max)) - (newline n) + (let ((n (/ (- (1- (window-height)) + (count-lines (point-min) (point-max))) + 2))) + (goto-char (point-min)) + (newline n) + (goto-char (point-max)) + (newline n)) ;; pad lines out to fill-column (goto-char (point-min)) (while (not (eobp)) diff --git a/lisp/play/mpuz.el b/lisp/play/mpuz.el index e4e627a5293..f4c26bfc6c4 100644 --- a/lisp/play/mpuz.el +++ b/lisp/play/mpuz.el @@ -94,7 +94,9 @@ The value t means never ding, and `error' means only ding on wrong input." map) "Local keymap to use in Mult Puzzle.") -(defun mpuz-mode () + + +(define-derived-mode mpuz-mode fundamental-mode "Mult Puzzle" "Multiplication puzzle mode. You have to guess which letters stand for which digits in the @@ -106,13 +108,7 @@ then the digit. Thus, to guess that A=3, type `A 3'. To leave the game to do other editing work, just switch buffers. Then you may resume the game with M-x mpuz. You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]." - (interactive) - (kill-all-local-variables) - (setq major-mode 'mpuz-mode - mode-name "Mult Puzzle" - tab-width 30) - (use-local-map mpuz-mode-map) - (run-mode-hooks 'mpuz-mode-hook)) + (setq tab-width 30)) ;; Some variables for statistics diff --git a/lisp/play/snake.el b/lisp/play/snake.el index 85acfb116d2..4c110914298 100644 --- a/lisp/play/snake.el +++ b/lisp/play/snake.el @@ -353,21 +353,13 @@ Argument SNAKE-BUFFER is the name of the buffer." (put 'snake-mode 'mode-class 'special) -(defun snake-mode () - "A mode for playing Snake. - -Snake mode keybindings: - \\{snake-mode-map} -" - (kill-all-local-variables) +(define-derived-mode snake-mode special-mode "Snake" + "A mode for playing Snake." (add-hook 'kill-buffer-hook 'gamegrid-kill-timer nil t) (use-local-map snake-null-map) - (setq major-mode 'snake-mode) - (setq mode-name "Snake") - (unless (featurep 'emacs) (setq mode-popup-menu '("Snake Commands" @@ -382,9 +374,7 @@ Snake mode keybindings: (setq gamegrid-use-glyphs snake-use-glyphs-flag) (setq gamegrid-use-color snake-use-color-flag) - (gamegrid-init (snake-display-options)) - - (run-mode-hooks 'snake-mode-hook)) + (gamegrid-init (snake-display-options))) ;;;###autoload (defun snake () diff --git a/lisp/play/spook.el b/lisp/play/spook.el index 08c31d3878b..d2ecd3a62cc 100644 --- a/lisp/play/spook.el +++ b/lisp/play/spook.el @@ -69,10 +69,6 @@ "Checking authorization..." "Checking authorization...Approved")) -;; Note: the implementation that used to take up most of this file has been -;; cleaned up, generalized, gratuitously broken by esr, and now resides in -;; cookie1.el. - (provide 'spook) ;;; spook.el ends here diff --git a/lisp/profiler.el b/lisp/profiler.el index 609a0308cf0..93ab10015ea 100644 --- a/lisp/profiler.el +++ b/lisp/profiler.el @@ -256,10 +256,9 @@ Optional argument MODE means only check for the specified mode (cpu or mem)." (defun profiler-calltree-find (tree entry) "Return a child tree of ENTRY under TREE." (let (result (children (profiler-calltree-children tree))) - ;; FIXME: Use `assoc'. (while (and children (null result)) (let ((child (car children))) - (when (equal (profiler-calltree-entry child) entry) + (when (function-equal (profiler-calltree-entry child) entry) (setq result child)) (setq children (cdr children)))) result)) diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index db2a6c68539..ce83efd114b 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -4729,6 +4729,11 @@ comment at the start of cc-engine.el for more info." ;; inside `c-find-decl-spots'. The point is left at `cfd-match-pos' ;; if there is a match, otherwise at `cfd-limit'. ;; + ;; The macro moves point forward to the next putative start of a declaration + ;; or cfd-limit. This decl start is the next token after a "declaration + ;; prefix". The declaration prefix is the earlier of `cfd-prop-match' and + ;; `cfd-re-match'. `cfd-match-pos' is set to the decl prefix. + ;; ;; This macro might do hidden buffer changes. '(progn @@ -4750,34 +4755,47 @@ comment at the start of cc-engine.el for more info." (if (> cfd-re-match-end (point)) (goto-char cfd-re-match-end)) - (while (if (setq cfd-re-match-end - (re-search-forward c-decl-prefix-or-start-re - cfd-limit 'move)) - - ;; Match. Check if it's inside a comment or string literal. - (c-got-face-at - (if (setq cfd-re-match (match-end 1)) - ;; Matched the end of a token preceding a decl spot. - (progn - (goto-char cfd-re-match) - (1- cfd-re-match)) - ;; Matched a token that start a decl spot. - (goto-char (match-beginning 0)) - (point)) - c-literal-faces) - - ;; No match. Finish up and exit the loop. - (setq cfd-re-match cfd-limit) - nil) - - ;; Skip out of comments and string literals. - (while (progn - (goto-char (next-single-property-change - (point) 'face nil cfd-limit)) - (and (< (point) cfd-limit) - (c-got-face-at (point) c-literal-faces))))) + ;; Each time round, the next `while' moves forward over a pseudo match + ;; of `c-decl-prefix-or-start-re' which is either inside a literal, or + ;; is a ":" not preceded by "public", etc.. `cfd-re-match' and + ;; `cfd-re-match-end' get set. + (while + (progn + (setq cfd-re-match-end (re-search-forward c-decl-prefix-or-start-re + cfd-limit 'move)) + (cond + ((null cfd-re-match-end) + ;; No match. Finish up and exit the loop. + (setq cfd-re-match cfd-limit) + nil) + ((c-got-face-at + (if (setq cfd-re-match (match-end 1)) + ;; Matched the end of a token preceding a decl spot. + (progn + (goto-char cfd-re-match) + (1- cfd-re-match)) + ;; Matched a token that start a decl spot. + (goto-char (match-beginning 0)) + (point)) + c-literal-faces) + ;; Pseudo match inside a comment or string literal. Skip out + ;; of comments and string literals. + (while (progn + (goto-char (next-single-property-change + (point) 'face nil cfd-limit)) + (and (< (point) cfd-limit) + (c-got-face-at (point) c-literal-faces)))) + t) ; Continue the loop over pseudo matches. + ((and (match-string 1) + (string= (match-string 1) ":") + (save-excursion + (or (/= (c-backward-token-2 2) 0) ; no search limit. :-( + (not (looking-at c-decl-start-colon-kwd-re))))) + ;; Found a ":" which isn't part of "public:", etc. + t) + (t nil)))) ;; Found a real match. Exit the pseudo-match loop. - ;; If we matched at the decl start, we have to back up over the + ;; If our match was at the decl start, we have to back up over the ;; preceding syntactic ws to set `cfd-match-pos' and to catch ;; any decl spots in the syntactic ws. (unless cfd-re-match @@ -6905,32 +6923,38 @@ comment at the start of cc-engine.el for more info." ;; Skip over type decl prefix operators. (Note similar code in ;; `c-font-lock-declarators'.) - (while (and (looking-at c-type-decl-prefix-key) - (if (and (c-major-mode-is 'c++-mode) - (match-beginning 3)) - ;; If the third submatch matches in C++ then - ;; we're looking at an identifier that's a - ;; prefix only if it specifies a member pointer. - (when (setq got-identifier (c-forward-name)) - (if (looking-at "\\(::\\)") - ;; We only check for a trailing "::" and - ;; let the "*" that should follow be - ;; matched in the next round. - (progn (setq got-identifier nil) t) - ;; It turned out to be the real identifier, - ;; so stop. - nil)) - t)) - - (if (eq (char-after) ?\() + (if (and c-recognize-typeless-decls + (equal c-type-decl-prefix-key "\\<\\>")) + (when (eq (char-after) ?\() (progn (setq paren-depth (1+ paren-depth)) - (forward-char)) - (unless got-prefix-before-parens - (setq got-prefix-before-parens (= paren-depth 0))) - (setq got-prefix t) - (goto-char (match-end 1))) - (c-forward-syntactic-ws)) + (forward-char))) + (while (and (looking-at c-type-decl-prefix-key) + (if (and (c-major-mode-is 'c++-mode) + (match-beginning 3)) + ;; If the third submatch matches in C++ then + ;; we're looking at an identifier that's a + ;; prefix only if it specifies a member pointer. + (when (setq got-identifier (c-forward-name)) + (if (looking-at "\\(::\\)") + ;; We only check for a trailing "::" and + ;; let the "*" that should follow be + ;; matched in the next round. + (progn (setq got-identifier nil) t) + ;; It turned out to be the real identifier, + ;; so stop. + nil)) + t)) + + (if (eq (char-after) ?\() + (progn + (setq paren-depth (1+ paren-depth)) + (forward-char)) + (unless got-prefix-before-parens + (setq got-prefix-before-parens (= paren-depth 0))) + (setq got-prefix t) + (goto-char (match-end 1))) + (c-forward-syntactic-ws))) (setq got-parens (> paren-depth 0)) @@ -7402,7 +7426,11 @@ comment at the start of cc-engine.el for more info." ;; interactive refontification. (c-put-c-type-property (point) 'c-decl-arg-start)) - (when (and c-record-type-identifiers at-type (not (eq at-type t))) + (when (and c-record-type-identifiers at-type ;; (not (eq at-type t)) + ;; There seems no reason to exclude a token from + ;; fontification just because it's "a known type that can't + ;; be a name or other expression". 2013-09-18. + ) (let ((c-promote-possible-types t)) (save-excursion (goto-char type-start) diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el index 0116e9ec3dd..c1e8a1524dc 100644 --- a/lisp/progmodes/cc-langs.el +++ b/lisp/progmodes/cc-langs.el @@ -2587,6 +2587,15 @@ Note that Java specific rules are currently applied to tell this from ;;; Additional constants for parser-level constructs. +(c-lang-defconst c-decl-start-colon-kwd-re + "Regexp matching a keyword that is followed by a colon, where + the whole construct can precede a declaration. + E.g. \"public:\" in C++." + t "\\<\\>" + c++ (c-make-keywords-re t (c-lang-const c-protection-kwds))) +(c-lang-defvar c-decl-start-colon-kwd-re + (c-lang-const c-decl-start-colon-kwd-re)) + (c-lang-defconst c-decl-prefix-re "Regexp matching something that might precede a declaration, cast or label, such as the last token of a preceding statement or declaration. @@ -2626,8 +2635,11 @@ more info." java "\\([\{\}\(;,<]+\\)" ;; Match "<" in C++ to get the first argument in a template arglist. ;; In that case there's an additional check in `c-find-decl-spots' - ;; that it got open paren syntax. - c++ "\\([\{\}\(\);,<]+\\)" + ;; that it got open paren syntax. Match ":" to aid in picking up + ;; "public:", etc. This involves additional checks in + ;; `c-find-decl-prefix-search' to prevent a match of identifiers + ;; or labels. + c++ "\\([\{\}\(\);:,<]+\\)" ;; Additionally match the protection directives in Objective-C. ;; Note that this doesn't cope with the longer directives, which we ;; would have to match from start to end since they don't end with @@ -2816,7 +2828,8 @@ is in effect when this is matched (see `c-identifier-syntax-table')." "\\>") "") "\\)") - (java idl) "\\([\[\(]\\)") + java "\\([\[\(\)]\\)" + idl "\\([\[\(]\\)") (c-lang-defvar c-type-decl-suffix-key (c-lang-const c-type-decl-suffix-key) 'dont-doc) @@ -2937,7 +2950,7 @@ calls before a brace block. This setting does not affect declarations that are preceded by a declaration starting keyword, so e.g. `c-typeless-decl-kwds' may still be used when it's set to nil." t nil - (c c++ objc) t) + (c c++ objc java) t) (c-lang-defvar c-recognize-typeless-decls (c-lang-const c-recognize-typeless-decls)) diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el index 1e8d6cba8c4..e977a415d62 100644 --- a/lisp/progmodes/cc-mode.el +++ b/lisp/progmodes/cc-mode.el @@ -1594,10 +1594,6 @@ Key bindings: ;;;###autoload (add-to-list 'interpreter-mode-alist '("nawk" . awk-mode)) ;;;###autoload (add-to-list 'interpreter-mode-alist '("gawk" . awk-mode)) -;;; Autoload directives must be on the top level, so we construct an -;;; autoload form instead. -;;;###autoload (autoload 'awk-mode "cc-mode" "Major mode for editing AWK code." t) - (c-define-abbrev-table 'awk-mode-abbrev-table '(("else" "else" c-electric-continued-statement 0) ("while" "while" c-electric-continued-statement 0)) diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index 770e78bb3b1..8a7d1e77bd2 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el @@ -412,15 +412,15 @@ Affects: `cperl-font-lock', `cperl-electric-lbrace-space', "use cperl-vc-rcs-header or cperl-vc-sccs-header instead." "22.1") -(defcustom cperl-clobber-mode-lists - (not - (and - (boundp 'interpreter-mode-alist) - (assoc "miniperl" interpreter-mode-alist) - (assoc "\\.\\([pP][Llm]\\|al\\)$" auto-mode-alist))) - "*Whether to install us into `interpreter-' and `extension' mode lists." - :type 'boolean - :group 'cperl) +;; (defcustom cperl-clobber-mode-lists +;; (not +;; (and +;; (boundp 'interpreter-mode-alist) +;; (assoc "miniperl" interpreter-mode-alist) +;; (assoc "\\.\\([pP][Llm]\\|al\\)$" auto-mode-alist))) +;; "*Whether to install us into `interpreter-' and `extension' mode lists." +;; :type 'boolean +;; :group 'cperl) (defcustom cperl-info-on-command-no-prompt nil "*Not-nil (and non-null) means not to prompt on C-h f. @@ -6535,7 +6535,7 @@ side-effect of memorizing only. Examples in `cperl-style-examples'." (eval '(mode-compile)))) ; Avoid a warning (declare-function Info-find-node "info" - (filename nodename &optional no-going-back)) + (filename nodename &optional no-going-back strict-case)) (defun cperl-info-buffer (type) ;; Returns buffer with documentation. Creates if missing. diff --git a/lisp/progmodes/executable.el b/lisp/progmodes/executable.el index a305393c7d8..7b08df8b85f 100644 --- a/lisp/progmodes/executable.el +++ b/lisp/progmodes/executable.el @@ -269,16 +269,15 @@ file modes." (save-restriction (widen) (string= "#!" (buffer-substring (point-min) (+ 2 (point-min))))) - (condition-case nil - (let* ((current-mode (file-modes (buffer-file-name))) - (add-mode (logand ?\111 (default-file-modes)))) - (or (/= (logand ?\111 current-mode) 0) - (zerop add-mode) - (set-file-modes (buffer-file-name) - (logior current-mode add-mode)))) - ;; Eg file-modes can return nil (bug#9879). It should not, - ;; in this context, but we should handle it all the same. - (error (message "Unable to make file executable"))))) + ;; Eg file-modes can return nil (bug#9879). It should not, + ;; in this context, but we should handle it all the same. + (with-demoted-errors "Unable to make file executable: %s" + (let* ((current-mode (file-modes (buffer-file-name))) + (add-mode (logand ?\111 (default-file-modes)))) + (or (/= (logand ?\111 current-mode) 0) + (zerop add-mode) + (set-file-modes (buffer-file-name) + (logior current-mode add-mode))))))) (provide 'executable) diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el index 2017636435c..2f1f7b3c8d3 100644 --- a/lisp/progmodes/gdb-mi.el +++ b/lisp/progmodes/gdb-mi.el @@ -3257,11 +3257,16 @@ line." gud-stop-subjob "Interrupt thread at current line.") +;; Defined opaquely in M-x gdb via gud-def. +(declare-function gud-cont "gdb-mi" (arg) t) + (def-gdb-thread-buffer-gud-command gdb-continue-thread gud-cont "Continue thread at current line.") +(declare-function gud-step "gdb-mi" (arg) t) + (def-gdb-thread-buffer-gud-command gdb-step-thread gud-step diff --git a/lisp/progmodes/gud.el b/lisp/progmodes/gud.el index c549d9eedef..14f6aa154d7 100644 --- a/lisp/progmodes/gud.el +++ b/lisp/progmodes/gud.el @@ -1,7 +1,6 @@ ;;; gud.el --- Grand Unified Debugger mode for running GDB and other debuggers -;; Copyright (C) 1992-1996, 1998, 2000-2013 Free Software Foundation, -;; Inc. +;; Copyright (C) 1992-1996, 1998, 2000-2013 Free Software Foundation, Inc. ;; Author: Eric S. Raymond <esr@snark.thyrsus.com> ;; Maintainer: FSF @@ -321,8 +320,9 @@ Uses `gud-<MINOR-MODE>-directories' to find the source files." (when buf ;; Copy `gud-minor-mode' to the found buffer to turn on the menu. (with-current-buffer buf - (set (make-local-variable 'gud-minor-mode) minor-mode) - (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) + (setq-local gud-minor-mode minor-mode) + (if (boundp 'tool-bar-map) ; not --without-x + (setq-local tool-bar-map gud-tool-bar-map)) (when (and gud-tooltip-mode (eq gud-minor-mode 'gdbmi)) (make-local-variable 'gdb-define-alist) @@ -2482,7 +2482,8 @@ comint mode, which see." (setq mode-line-process '(":%s")) (define-key (current-local-map) "\C-c\C-l" 'gud-refresh) (set (make-local-variable 'gud-last-frame) nil) - (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) + (if (boundp 'tool-bar-map) ; not --without-x + (setq-local tool-bar-map gud-tool-bar-map)) (make-local-variable 'comint-prompt-regexp) ;; Don't put repeated commands in command history many times. (set (make-local-variable 'comint-input-ignoredups) t) @@ -3282,6 +3283,8 @@ Treats actions as defuns." ;;; Customizable settings +(defvar tooltip-mode) + ;;;###autoload (define-minor-mode gud-tooltip-mode "Toggle the display of GUD tooltips. diff --git a/lisp/progmodes/octave.el b/lisp/progmodes/octave.el index de1c26a7fa7..f20a57940be 100644 --- a/lisp/progmodes/octave.el +++ b/lisp/progmodes/octave.el @@ -1581,6 +1581,9 @@ code line." :group 'octave :version "24.4") +;; Used in a mode derived from help-mode. +(declare-function help-button-action "help-mode" (button)) + (define-button-type 'octave-help-file 'follow-link t 'action #'help-button-action diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index be151bf8114..5f919bf495f 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -225,7 +225,7 @@ ;;;###autoload (add-to-list 'auto-mode-alist (cons (purecopy "\\.py\\'") 'python-mode)) ;;;###autoload -(add-to-list 'interpreter-mode-alist (cons (purecopy "python") 'python-mode)) +(add-to-list 'interpreter-mode-alist (cons (purecopy "python[0-9.]*") 'python-mode)) (defgroup python nil "Python Language's flying circus support for Emacs." @@ -2140,7 +2140,7 @@ the python shell: 1. When Optional Argument NOMAIN is non-nil everything under an \"if __name__ == '__main__'\" block will be removed. 2. When a subregion of the buffer is sent, it takes care of - appending extra whitelines so tracebacks are correct. + appending extra empty lines so tracebacks are correct. 3. Wraps indented regions under an \"if True:\" block so the interpreter evaluates them correctly." (let ((substring (buffer-substring-no-properties start end)) diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el index acc7738ae5c..95206c15390 100644 --- a/lisp/progmodes/ruby-mode.el +++ b/lisp/progmodes/ruby-mode.el @@ -132,7 +132,7 @@ This should only be called after matching against `ruby-here-doc-beg-re'." ruby-block-end-re "\\|}\\|\\]\\)") "Regexp to match where the indentation gets shallower.") -(defconst ruby-operator-re "[-,.+*/%&|^~=<>:]" +(defconst ruby-operator-re "[-,.+*/%&|^~=<>:]\\|\\\\$" "Regexp to match operators.") (defconst ruby-symbol-chars "a-zA-Z0-9_" @@ -1377,6 +1377,7 @@ If the result is do-end block, it will always be multiline." ;; Unusual code layout confuses the byte-compiler. (declare-function ruby-syntax-propertize-expansion "ruby-mode" ()) (declare-function ruby-syntax-expansion-allowed-p "ruby-mode" (parse-state)) +(declare-function ruby-syntax-propertize-function "ruby-mode" (start end)) (if (eval-when-compile (fboundp #'syntax-propertize-rules)) ;; New code that works independently from font-lock. @@ -1862,11 +1863,11 @@ See `font-lock-syntax-table'.") "using") 'symbols)) 1 'font-lock-builtin-face) - ;; Perl-ish keywords - "\\_<\\(?:BEGIN\\|END\\)\\_>\\|^__END__$" ;; here-doc beginnings `(,ruby-here-doc-beg-re 0 (unless (ruby-singleton-class-p (match-beginning 0)) 'font-lock-string-face)) + ;; Perl-ish keywords + "\\_<\\(?:BEGIN\\|END\\)\\_>\\|^__END__$" ;; variables `(,(concat ruby-font-lock-keyword-beg-re "\\_<\\(nil\\|self\\|true\\|false\\)\\>") diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el index 292bc2369a6..3ea2afb6fc3 100644 --- a/lisp/progmodes/sh-script.el +++ b/lisp/progmodes/sh-script.el @@ -2170,11 +2170,18 @@ the visited file executable, and NO-QUERY-FLAG (the second argument) controls whether to query about making the visited file executable. Calls the value of `sh-set-shell-hook' if set." - (interactive (list (completing-read (format "Shell \(default %s\): " - sh-shell-file) - interpreter-mode-alist - (lambda (x) (eq (cdr x) 'sh-mode)) - nil nil nil sh-shell-file) + (interactive (list (completing-read + (format "Shell \(default %s\): " + sh-shell-file) + ;; This used to use interpreter-mode-alist, but that is + ;; no longer appropriate now that uses regexps. + ;; Maybe there could be a separate variable that lists + ;; the shells, used here and to construct i-mode-alist. + ;; But the following is probably good enough: + (append (mapcar (lambda (e) (symbol-name (car e))) + sh-ancestor-alist) + '("csh" "rc" "sh")) + nil nil nil nil sh-shell-file) (eq executable-query 'function) t)) (if (string-match "\\.exe\\'" shell) diff --git a/lisp/replace.el b/lisp/replace.el index 5e44677b0f8..abb59a674e3 100644 --- a/lisp/replace.el +++ b/lisp/replace.el @@ -490,12 +490,13 @@ If `replace-lax-whitespace' is non-nil, a space or spaces in the string to be replaced will match a sequence of whitespace chars defined by the regexp in `search-whitespace-regexp'. -In Transient Mark mode, if the mark is active, operate on the contents -of the region. Otherwise, operate from point to the end of the buffer. - Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace only matches surrounded by word boundaries. -Fourth and fifth arg START and END specify the region to operate on. + +Operates on the region between START and END (if both are nil, from point +to the end of the buffer). Interactively, if Transient Mark mode is +enabled and the mark is active, operates on the contents of the region; +otherwise from point to the end of the buffer. Use \\<minibuffer-local-map>\\[next-history-element] \ to pull the last incremental search string to the minibuffer diff --git a/lisp/reveal.el b/lisp/reveal.el index 92c1178041c..6740f7e923f 100644 --- a/lisp/reveal.el +++ b/lisp/reveal.el @@ -72,27 +72,26 @@ Each element has the form (WINDOW . OVERLAY).") ;; - we only refresh spots in the current window. ;; FIXME: do we actually know that (current-buffer) = (window-buffer) ? (with-local-quit - (condition-case err - (let ((old-ols - (delq nil - (mapcar - (lambda (x) - ;; We refresh any spot in the current window as well - ;; as any spots associated with a dead window or - ;; a window which does not show this buffer any more. - (cond - ((eq (car x) (selected-window)) (cdr x)) - ((not (and (window-live-p (car x)) - (eq (window-buffer (car x)) (current-buffer)))) - ;; Adopt this since it's owned by a window that's - ;; either not live or at least not showing this - ;; buffer any more. - (setcar x (selected-window)) - (cdr x)))) - reveal-open-spots)))) - (setq old-ols (reveal-open-new-overlays old-ols)) - (reveal-close-old-overlays old-ols)) - (error (message "Reveal: %s" err))))) + (with-demoted-errors "Reveal: %s" + (let ((old-ols + (delq nil + (mapcar + (lambda (x) + ;; We refresh any spot in the current window as well + ;; as any spots associated with a dead window or + ;; a window which does not show this buffer any more. + (cond + ((eq (car x) (selected-window)) (cdr x)) + ((not (and (window-live-p (car x)) + (eq (window-buffer (car x)) (current-buffer)))) + ;; Adopt this since it's owned by a window that's + ;; either not live or at least not showing this + ;; buffer any more. + (setcar x (selected-window)) + (cdr x)))) + reveal-open-spots)))) + (setq old-ols (reveal-open-new-overlays old-ols)) + (reveal-close-old-overlays old-ols))))) (defun reveal-open-new-overlays (old-ols) (let ((repeat t)) diff --git a/lisp/savehist.el b/lisp/savehist.el index 374e57feb1f..379818b2707 100644 --- a/lisp/savehist.el +++ b/lisp/savehist.el @@ -49,7 +49,7 @@ (require 'custom) (eval-when-compile - (require 'cl)) + (if (featurep 'xemacs) (require 'cl))) ;; User variables diff --git a/lisp/saveplace.el b/lisp/saveplace.el index 2ddac6d6c43..e070a7da489 100644 --- a/lisp/saveplace.el +++ b/lisp/saveplace.el @@ -255,8 +255,9 @@ may have changed\) back to `save-place-alist'." (insert-file-contents file) (goto-char (point-min)) (setq save-place-alist - (car (read-from-string - (buffer-substring (point-min) (point-max))))) + (with-demoted-errors "Error reading save-place-file: %S" + (car (read-from-string + (buffer-substring (point-min) (point-max)))))) ;; If there is a limit, and we're over it, then we'll ;; have to truncate the end of the list: diff --git a/lisp/shell.el b/lisp/shell.el index 3ca2564b65c..2047543f288 100644 --- a/lisp/shell.el +++ b/lisp/shell.el @@ -1,7 +1,6 @@ ;;; shell.el --- specialized comint.el for running the shell -*- lexical-binding: t -*- -;; Copyright (C) 1988, 1993-1997, 2000-2013 Free Software Foundation, -;; Inc. +;; Copyright (C) 1988, 1993-1997, 2000-2013 Free Software Foundation, Inc. ;; Author: Olin Shivers <shivers@cs.cmu.edu> ;; Simon Marshall <simon@gnu.org> @@ -792,7 +791,7 @@ and `shell-pushd-dunique' control the behavior of the relevant command. Environment variables are expanded, see function `substitute-in-file-name'." (if shell-dirtrackp ;; We fail gracefully if we think the command will fail in the shell. - (condition-case nil + (with-demoted-errors "Couldn't cd: %s" (let ((start (progn (string-match (concat "^" shell-command-separator-regexp) str) ; skip whitespace @@ -825,8 +824,7 @@ Environment variables are expanded, see function `substitute-in-file-name'." (setq start (progn (string-match shell-command-separator-regexp str end) ;; skip again - (match-end 0))))) - (error "Couldn't cd")))) + (match-end 0)))))))) (defun shell-unquote-argument (string) "Remove all kinds of shell quoting from STRING." @@ -908,7 +906,7 @@ Environment variables are expanded, see function `substitute-in-file-name'." (cond ((> num (length shell-dirstack)) (message "Directory stack not that deep.")) ((= num 0) - (error (message "Couldn't cd"))) + (error "Couldn't cd")) (shell-pushd-dextract (let ((dir (nth (1- num) shell-dirstack))) (shell-process-popd arg) @@ -1015,12 +1013,11 @@ command again." ds)) (setq i (match-end 0))) (let ((ds (nreverse ds))) - (condition-case nil - (progn (shell-cd (car ds)) - (setq shell-dirstack (cdr ds) - shell-last-dir (car shell-dirstack)) - (shell-dirstack-message)) - (error (message "Couldn't cd")))))) + (with-demoted-errors "Couldn't cd: %s" + (shell-cd (car ds)) + (setq shell-dirstack (cdr ds) + shell-last-dir (car shell-dirstack)) + (shell-dirstack-message))))) (if started-at-pmark (goto-char (marker-position pmark))))) ;; For your typing convenience: diff --git a/lisp/simple.el b/lisp/simple.el index c5e5b313b7b..d259851dc85 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -1231,7 +1231,7 @@ is a string to insert in the minibuffer before reading. Such arguments are used as in `read-from-minibuffer'.)" ;; Used for interactive spec `x'. (read-from-minibuffer prompt initial-contents minibuffer-local-map - t minibuffer-history)) + t 'minibuffer-history)) (defun eval-minibuffer (prompt &optional initial-contents) "Return value of Lisp expression read using the minibuffer. @@ -3180,12 +3180,18 @@ see other processes running on the system, use `list-system-processes'." nil) (defvar universal-argument-map - (let ((map (make-sparse-keymap))) - (define-key map [t] 'universal-argument-other-key) - (define-key map (vector meta-prefix-char t) 'universal-argument-other-key) - (define-key map [switch-frame] nil) + (let ((map (make-sparse-keymap)) + (universal-argument-minus + ;; For backward compatibility, minus with no modifiers is an ordinary + ;; command if digits have already been entered. + `(menu-item "" negative-argument + :filter ,(lambda (cmd) + (if (integerp prefix-arg) nil cmd))))) + (define-key map [switch-frame] + (lambda (e) (interactive "e") + (handle-switch-frame e) (universal-argument--mode))) (define-key map [?\C-u] 'universal-argument-more) - (define-key map [?-] 'universal-argument-minus) + (define-key map [?-] universal-argument-minus) (define-key map [?0] 'digit-argument) (define-key map [?1] 'digit-argument) (define-key map [?2] 'digit-argument) @@ -3206,30 +3212,12 @@ see other processes running on the system, use `list-system-processes'." (define-key map [kp-7] 'digit-argument) (define-key map [kp-8] 'digit-argument) (define-key map [kp-9] 'digit-argument) - (define-key map [kp-subtract] 'universal-argument-minus) + (define-key map [kp-subtract] universal-argument-minus) map) "Keymap used while processing \\[universal-argument].") -(defvar universal-argument-num-events nil - "Number of argument-specifying events read by `universal-argument'. -`universal-argument-other-key' uses this to discard those events -from (this-command-keys), and reread only the final command.") - -(defvar saved-overriding-map t - "The saved value of `overriding-terminal-local-map'. -That variable gets restored to this value on exiting \"universal -argument mode\".") - -(defun save&set-overriding-map (map) - "Set `overriding-terminal-local-map' to MAP." - (when (eq saved-overriding-map t) - (setq saved-overriding-map overriding-terminal-local-map) - (setq overriding-terminal-local-map map))) - -(defun restore-overriding-map () - "Restore `overriding-terminal-local-map' to its saved value." - (setq overriding-terminal-local-map saved-overriding-map) - (setq saved-overriding-map t)) +(defun universal-argument--mode () + (set-temporary-overlay-map universal-argument-map)) (defun universal-argument () "Begin a numeric argument for the following command. @@ -3243,33 +3231,27 @@ which is different in effect from any particular numeric argument. These commands include \\[set-mark-command] and \\[start-kbd-macro]." (interactive) (setq prefix-arg (list 4)) - (setq universal-argument-num-events (length (this-command-keys))) - (save&set-overriding-map universal-argument-map)) + (universal-argument--mode)) -;; A subsequent C-u means to multiply the factor by 4 if we've typed -;; nothing but C-u's; otherwise it means to terminate the prefix arg. (defun universal-argument-more (arg) + ;; A subsequent C-u means to multiply the factor by 4 if we've typed + ;; nothing but C-u's; otherwise it means to terminate the prefix arg. (interactive "P") - (if (consp arg) - (setq prefix-arg (list (* 4 (car arg)))) - (if (eq arg '-) - (setq prefix-arg (list -4)) - (setq prefix-arg arg) - (restore-overriding-map))) - (setq universal-argument-num-events (length (this-command-keys)))) + (setq prefix-arg (if (consp arg) + (list (* 4 (car arg))) + (if (eq arg '-) + (list -4) + arg))) + (when (consp prefix-arg) (universal-argument--mode))) (defun negative-argument (arg) "Begin a negative numeric argument for the next command. \\[universal-argument] following digits or minus sign ends the argument." (interactive "P") - (cond ((integerp arg) - (setq prefix-arg (- arg))) - ((eq arg '-) - (setq prefix-arg nil)) - (t - (setq prefix-arg '-))) - (setq universal-argument-num-events (length (this-command-keys))) - (save&set-overriding-map universal-argument-map)) + (setq prefix-arg (cond ((integerp arg) (- arg)) + ((eq arg '-) nil) + (t '-))) + (universal-argument--mode)) (defun digit-argument (arg) "Part of the numeric argument for the next command. @@ -3279,37 +3261,15 @@ These commands include \\[set-mark-command] and \\[start-kbd-macro]." last-command-event (get last-command-event 'ascii-character))) (digit (- (logand char ?\177) ?0))) - (cond ((integerp arg) - (setq prefix-arg (+ (* arg 10) - (if (< arg 0) (- digit) digit)))) - ((eq arg '-) - ;; Treat -0 as just -, so that -01 will work. - (setq prefix-arg (if (zerop digit) '- (- digit)))) - (t - (setq prefix-arg digit)))) - (setq universal-argument-num-events (length (this-command-keys))) - (save&set-overriding-map universal-argument-map)) - -;; For backward compatibility, minus with no modifiers is an ordinary -;; command if digits have already been entered. -(defun universal-argument-minus (arg) - (interactive "P") - (if (integerp arg) - (universal-argument-other-key arg) - (negative-argument arg))) - -;; Anything else terminates the argument and is left in the queue to be -;; executed as a command. -(defun universal-argument-other-key (arg) - (interactive "P") - (setq prefix-arg arg) - (let* ((key (this-command-keys)) - (keylist (listify-key-sequence key))) - (setq unread-command-events - (append (nthcdr universal-argument-num-events keylist) - unread-command-events))) - (reset-this-command-lengths) - (restore-overriding-map)) + (setq prefix-arg (cond ((integerp arg) + (+ (* arg 10) + (if (< arg 0) (- digit) digit))) + ((eq arg '-) + ;; Treat -0 as just -, so that -01 will work. + (if (zerop digit) '- (- digit))) + (t + digit)))) + (universal-argument--mode)) (defvar filter-buffer-substring-functions nil @@ -4199,6 +4159,12 @@ a mistake; see the documentation of `set-mark'." (marker-position (mark-marker)) (signal 'mark-inactive nil))) +;; Behind display-selections-p. +(declare-function x-selection-owner-p "xselect.c" + (&optional selection terminal)) +(declare-function x-selection-exists-p "xselect.c" + (&optional selection terminal)) + (defun deactivate-mark (&optional force) "Deactivate the mark. If Transient Mark mode is disabled, this function normally does @@ -4754,6 +4720,9 @@ lines." :group 'editing-basics :version "23.1") +;; Only used if display-graphic-p. +(declare-function font-info "font.c" (name &optional frame)) + (defun default-font-height () "Return the height in pixels of the current buffer's default face font." (let ((default-font (face-font 'default))) @@ -7384,6 +7353,24 @@ and setting it to nil." buffer-invisibility-spec) (setq buffer-invisibility-spec nil))) +(defvar messages-buffer-mode-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map special-mode-map) + (define-key map "g" nil) ; nothing to revert + map)) + +(define-derived-mode messages-buffer-mode special-mode "Messages" + "Major mode used in the \"*Messages*\" buffer.") + +(defun messages-buffer () + "Return the \"*Messages*\" buffer. +If it does not exist, create and it switch it to `messages-buffer-mode'." + (or (get-buffer "*Messages*") + (with-current-buffer (get-buffer-create "*Messages*") + (messages-buffer-mode) + (current-buffer)))) + + ;; Minibuffer prompt stuff. ;;(defun minibuffer-prompt-modification (start end) diff --git a/lisp/startup.el b/lisp/startup.el index ec7d73306a2..059d7710320 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -1,7 +1,6 @@ ;;; startup.el --- process Emacs shell arguments -*- lexical-binding: t -*- -;; Copyright (C) 1985-1986, 1992, 1994-2013 Free Software Foundation, -;; Inc. +;; Copyright (C) 1985-1986, 1992, 1994-2013 Free Software Foundation, Inc. ;; Maintainer: FSF ;; Keywords: internal @@ -494,6 +493,7 @@ It is the default value of the variable `top-level'." (setq command-line-processed t) (let ((dir default-directory)) (with-current-buffer "*Messages*" + (messages-buffer-mode) ;; Make it easy to do like "tail -f". (set (make-local-variable 'window-point-insertion-type) t) ;; Give *Messages* the same default-directory as *scratch*, diff --git a/lisp/subr.el b/lisp/subr.el index 0a28d4778d4..43be9f529be 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -1366,7 +1366,7 @@ function, it is changed to a list of functions." (setq local t))) (let ((hook-value (if local (symbol-value hook) (default-value hook)))) ;; If the hook value is a single function, turn it into a list. - (when (or (not (listp hook-value)) (eq (car hook-value) 'lambda)) + (when (or (not (listp hook-value)) (functionp hook-value)) (setq hook-value (list hook-value))) ;; Do the actual addition if necessary (unless (member function hook-value) @@ -2239,6 +2239,9 @@ floating point support." (push read unread-command-events) nil)))))) +;; Behind display-popup-menus-p test. +(declare-function x-popup-dialog "xmenu.c" (position contents &optional header)) + (defun y-or-n-p (prompt) "Ask user a \"y or n\" question. Return t if answer is \"y\". PROMPT is the string to display to ask the question. It should @@ -3350,16 +3353,22 @@ even if this catches the signal." (define-obsolete-function-alias 'condition-case-no-debug 'condition-case-unless-debug "24.1") -(defmacro with-demoted-errors (&rest body) +(defmacro with-demoted-errors (format &rest body) "Run BODY and demote any errors to simple messages. If `debug-on-error' is non-nil, run BODY without catching its errors. This is to be used around code which is not expected to signal an error -but which should be robust in the unexpected case that an error is signaled." - (declare (debug t) (indent 0)) - (let ((err (make-symbol "err"))) +but which should be robust in the unexpected case that an error is signaled. +For backward compatibility, if FORMAT is not a constant string, it +is assumed to be part of BODY, in which case the message format +used is \"Error: %S\"." + (declare (debug t) (indent 1)) + (let ((err (make-symbol "err")) + (format (if (and (stringp format) body) format + (prog1 "Error: %S" + (if format (push format body)))))) `(condition-case-unless-debug ,err - (progn ,@body) - (error (message "Error: %S" ,err) nil)))) + ,(macroexp-progn body) + (error (message ,format ,err) nil)))) (defmacro combine-after-change-calls (&rest body) "Execute BODY, but don't call the after-change functions till the end. @@ -3872,7 +3881,7 @@ This function makes or adds to an entry on `after-load-alist'." (when (equal file lfn) (remove-hook 'after-load-functions fun) (funcall func)))) - (add-hook 'after-load-functions fun))))))) + (add-hook 'after-load-functions fun 'append))))))) ;; Add FORM to the element unless it's already there. (unless (member delayed-func (cdr elt)) (nconc elt (list delayed-func))))))) @@ -3901,12 +3910,27 @@ This function is called directly from the C code." (mapc #'funcall (cdr a-l-element)))) ;; Complain when the user uses obsolete files. (when (string-match-p "/obsolete/[^/]*\\'" abs-file) - (run-with-timer 0 nil - (lambda (file) - (message "Package %s is obsolete!" - (substring file 0 - (string-match "\\.elc?\\>" file)))) - (file-name-nondirectory abs-file))) + ;; Maybe we should just use display-warning? This seems yucky... + (let* ((file (file-name-nondirectory abs-file)) + (msg (format "Package %s is obsolete!" + (substring file 0 + (string-match "\\.elc?\\>" file))))) + ;; Cribbed from cl--compiling-file. + (if (and (boundp 'byte-compile--outbuffer) + (bufferp (symbol-value 'byte-compile--outbuffer)) + (equal (buffer-name (symbol-value 'byte-compile--outbuffer)) + " *Compiler Output*")) + ;; Don't warn about obsolete files using other obsolete files. + (unless (and (stringp byte-compile-current-file) + (string-match-p "/obsolete/[^/]*\\'" + (expand-file-name + byte-compile-current-file + byte-compile-root-dir))) + (byte-compile-log-warning msg)) + (run-with-timer 0 nil + (lambda (msg) + (message "%s" msg)) msg)))) + ;; Finally, run any other hook. (run-hook-with-args 'after-load-functions abs-file)) @@ -4222,6 +4246,8 @@ I is the index of the frame after FRAME2. It should return nil if those frames don't seem special and otherwise, it should return the number of frames to skip (minus 1).") +(defconst internal--call-interactively (symbol-function 'call-interactively)) + (defun called-interactively-p (&optional kind) "Return t if the containing function was called by `call-interactively'. If KIND is `interactive', then only return t if the call was made @@ -4294,9 +4320,9 @@ command is called from a keyboard macro?" (pcase (cons frame nextframe) ;; No subr calls `interactive-p', so we can rule that out. (`((,_ ,(pred (lambda (f) (subrp (indirect-function f)))) . ,_) . ,_) nil) - ;; Somehow, I sometimes got `command-execute' rather than - ;; `call-interactively' on my stacktrace !? - ;;(`(,_ . (t command-execute . ,_)) t) + ;; In case #<subr call-interactively> without going through the + ;; `call-interactively' symbol (bug#3984). + (`(,_ . (t ,(pred (eq internal--call-interactively)) . ,_)) t) (`(,_ . (t call-interactively . ,_)) t))))) (defun interactive-p () diff --git a/lisp/term.el b/lisp/term.el index 31889a78273..d9ba848e8be 100644 --- a/lisp/term.el +++ b/lisp/term.el @@ -1252,15 +1252,14 @@ without any interpretation." (setq this-command 'yank) (mouse-set-point click) (term-send-raw-string - (or (cond ; From `mouse-yank-primary': - ((eq system-type 'windows-nt) - (or (x-get-selection 'PRIMARY) - (x-get-selection-value))) - ((fboundp 'x-get-selection-value) - (or (x-get-selection-value) - (x-get-selection 'PRIMARY))) - (t - (x-get-selection 'PRIMARY))) + ;; From `mouse-yank-primary': + (or (if (fboundp 'x-get-selection-value) + (if (eq system-type 'windows-nt) + (or (x-get-selection 'PRIMARY) + (x-get-selection-value)) + (or (x-get-selection-value) + (x-get-selection 'PRIMARY))) + (x-get-selection 'PRIMARY)) (error "No selection is available"))))) (defun term-paste () @@ -2937,8 +2936,10 @@ See `term-prompt-regexp'." (let ((end (string-match "\r?$" str i))) (if end (funcall term-command-hook - (prog1 (substring str (1+ i) end) - (setq i (match-end 0)))) + (decode-coding-string + (prog1 (substring str (1+ i) end) + (setq i (match-end 0))) + locale-coding-system)) (setq term-terminal-parameter (substring str i)) (setq term-terminal-state 4) (setq i str-length)))) diff --git a/lisp/term/common-win.el b/lisp/term/common-win.el index aadab96f75a..158db4d09c8 100644 --- a/lisp/term/common-win.el +++ b/lisp/term/common-win.el @@ -44,6 +44,10 @@ This variable is not used by the Nextstep port." (defvar ns-last-selected-text) ; ns-win.el (declare-function ns-set-pasteboard "ns-win" (string)) +(defvar x-select-enable-primary) ; x-win.el +(defvar x-last-selected-text-primary) +(defvar x-last-selected-text-clipboard) + (defun x-select-text (text) "Select TEXT, a string, according to the window system. diff --git a/lisp/term/ns-win.el b/lisp/term/ns-win.el index b92ca1244fb..53c602048ff 100644 --- a/lisp/term/ns-win.el +++ b/lisp/term/ns-win.el @@ -104,7 +104,6 @@ The properties returned may include `top', `left', `height', and `width'." (define-key global-map [?\s-~] 'ns-prev-frame) (define-key global-map [?\s--] 'center-line) (define-key global-map [?\s-:] 'ispell) -(define-key global-map [?\s-\;] 'ispell-next) (define-key global-map [?\s-?] 'info) (define-key global-map [?\s-^] 'kill-some-buffers) (define-key global-map [?\s-&] 'kill-this-buffer) @@ -557,29 +556,9 @@ unless the current buffer is a scratch buffer." (interactive) (other-frame -1)) -;; If no position specified, make new frame offset by 25 from current. -;; You'd think this was a window manager's job, but apparently without -;; this, new frames open exactly on top of old ones (?). -;; http://lists.gnu.org/archive/html/emacs-devel/2010-10/msg00988.html -;; Note that AFAICS it is not documented that functions on -;; before-make-frame-hook can access PARAMETERS. -(defvar parameters) ; dynamically bound in make-frame -(add-hook 'before-make-frame-hook - (lambda () - (let ((left (cdr (assq 'left (frame-parameters)))) - (top (cdr (assq 'top (frame-parameters))))) - (if (consp left) (setq left (cadr left))) - (if (consp top) (setq top (cadr top))) - (cond - ((or (assq 'top parameters) (assq 'left parameters))) - ((or (not left) (not top))) - (t - (setq parameters (cons (cons 'left (+ left 25)) - (cons (cons 'top (+ top 25)) - parameters)))))))) - -;; frame will be focused anyway, so select it +;; Frame will be focused anyway, so select it ;; (if this is not done, mode line is dimmed until first interaction) +;; FIXME: Sounds like we're working around a bug in the underlying code. (add-hook 'after-make-frame-functions 'select-frame) (defvar tool-bar-mode) @@ -893,6 +872,7 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.") (defvar ns-initialized nil "Non-nil if Nextstep windowing has been initialized.") +(declare-function x-handle-args "common-win" (args)) (declare-function ns-list-services "nsfns.m" ()) (declare-function x-open-connection "nsfns.m" (display &optional xrm-string must-succeed)) diff --git a/lisp/term/pc-win.el b/lisp/term/pc-win.el index 96831cea9a6..e5229bd3f0a 100644 --- a/lisp/term/pc-win.el +++ b/lisp/term/pc-win.el @@ -1,7 +1,7 @@ ;;; pc-win.el --- setup support for `PC windows' (whatever that is) -;; Copyright (C) 1994, 1996-1997, 1999, 2001-2013 Free Software -;; Foundation, Inc. +;; Copyright (C) 1994, 1996-1997, 1999, 2001-2013 +;; Free Software Foundation, Inc. ;; Author: Morten Welinder <terra@diku.dk> ;; Maintainer: FSF @@ -238,9 +238,8 @@ is not used)." (if x-select-enable-clipboard (let (text) ;; Don't die if x-get-selection signals an error. - (condition-case c - (setq text (w16-get-clipboard-data)) - (error (message "w16-get-clipboard-data:%s" c))) + (with-demoted-errors "w16-get-clipboard-data:%s" + (setq text (w16-get-clipboard-data))) (if (string= text "") (setq text nil)) (cond ((not text) nil) diff --git a/lisp/term/w32-win.el b/lisp/term/w32-win.el index 55181ab7d6d..892ac9749d6 100644 --- a/lisp/term/w32-win.el +++ b/lisp/term/w32-win.el @@ -238,6 +238,7 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.") (declare-function x-open-connection "w32fns.c" (display &optional xrm-string must-succeed)) +(declare-function create-default-fontset "fontset" ()) (declare-function create-fontset-from-fontset-spec "fontset" (fontset-spec &optional style-variant noerror)) (declare-function create-fontset-from-x-resource "fontset" ()) diff --git a/lisp/term/x-win.el b/lisp/term/x-win.el index 28fd3d7090c..3c7373b6d65 100644 --- a/lisp/term/x-win.el +++ b/lisp/term/x-win.el @@ -1217,6 +1217,8 @@ The value nil is the same as the list (UTF8_STRING COMPOUND_TEXT STRING)." (remove-text-properties 0 (length text) '(foreign-selection nil) text)) text)) +(defvar x-select-enable-clipboard) ; common-win + ;; Return the value of the current X selection. ;; Consult the selection. Treat empty strings as if they were unset. ;; If this function is called twice and finds the same text, diff --git a/lisp/textmodes/bibtex.el b/lisp/textmodes/bibtex.el index 171f373317a..795c04e31e1 100644 --- a/lisp/textmodes/bibtex.el +++ b/lisp/textmodes/bibtex.el @@ -468,7 +468,7 @@ alternatives, starting from zero." nil (("editor") ("editora") ("editorb") ("editorc") ("translator") ("annotator") ("commentator") - ("introduction") ("foreword") ("afterword") ("titleaddon") + ("introduction") ("foreword") ("afterword") ("subtitle") ("titleaddon") ("maintitle") ("mainsubtitle") ("maintitleaddon") ("language") ("origlanguage") ("volume") ("part") ("edition") ("volumes") ("series") ("number") ("note") ("publisher") ("location") ("isbn") diff --git a/lisp/textmodes/two-column.el b/lisp/textmodes/two-column.el index 23e90552096..dcc664cc7f2 100644 --- a/lisp/textmodes/two-column.el +++ b/lisp/textmodes/two-column.el @@ -349,6 +349,9 @@ accepting the proposed default buffer. (if b1 (setq 2C-window-width (- (frame-width) b1))) (2C-two-columns b2))) +(autoload 'scroll-bar-columns "scroll-bar") +(eval-when-compile + (require 'fringe)) ; fringe-columns defsubst ;;;###autoload (defun 2C-split (arg) diff --git a/lisp/url/ChangeLog b/lisp/url/ChangeLog index 52a69690534..7619f2e2b86 100644 --- a/lisp/url/ChangeLog +++ b/lisp/url/ChangeLog @@ -1,3 +1,17 @@ +2013-09-18 Glenn Morris <rgm@gnu.org> + + * url-http.el (zlib-decompress-region): Declare. + +2013-09-16 Glenn Morris <rgm@gnu.org> + + * url-misc.el (url-data): Avoid match-data mix-up with base64 case. + Use Content-Transfer-Encoding rather than Content-Encoding. (Bug#15285) + +2013-09-13 Glenn Morris <rgm@gnu.org> + + * url-http.el (url-handle-content-transfer-encoding): + * url-vars.el (url-mime-encoding-string): Silence compiler. + 2013-08-14 Lars Magne Ingebrigtsen <larsi@gnus.org> * url-http.el (url-http-parse-headers): Always place point at the diff --git a/lisp/url/url-http.el b/lisp/url/url-http.el index 7047e6b5f13..e2a2033e527 100644 --- a/lisp/url/url-http.el +++ b/lisp/url/url-http.el @@ -858,10 +858,12 @@ should be shown to the user." (goto-char (point-min)) success)) +(declare-function zlib-decompress-region "decompress.c" (start end)) + (defun url-handle-content-transfer-encoding () (let ((encoding (mail-fetch-field "content-encoding"))) (when (and encoding - (fboundp 'zlib-decompress-region) + (fboundp 'zlib-available-p) (zlib-available-p) (equal (downcase encoding) "gzip")) (save-restriction diff --git a/lisp/url/url-misc.el b/lisp/url/url-misc.el index c8e9b591790..ecc602940f3 100644 --- a/lisp/url/url-misc.el +++ b/lisp/url/url-misc.el @@ -1,7 +1,6 @@ ;;; url-misc.el --- Misc Uniform Resource Locator retrieval code -;; Copyright (C) 1996-1999, 2002, 2004-2013 Free Software Foundation, -;; Inc. +;; Copyright (C) 1996-1999, 2002, 2004-2013 Free Software Foundation, Inc. ;; Keywords: comm, data, processes @@ -89,19 +88,19 @@ (save-excursion (if (not (string-match "\\([^,]*\\)?," desc)) (error "Malformed data URL: %s" desc) - (setq mediatype (match-string 1 desc)) + (setq mediatype (match-string 1 desc) + data (url-unhex-string (substring desc (match-end 0)))) (if (and mediatype (string-match ";base64\\'" mediatype)) (setq mediatype (substring mediatype 0 (match-beginning 0)) encoding "base64")) (if (or (null mediatype) (eq ?\; (aref mediatype 0))) - (setq mediatype (concat "text/plain" mediatype))) - (setq data (url-unhex-string (substring desc (match-end 0))))) + (setq mediatype (concat "text/plain" mediatype)))) (set-buffer (generate-new-buffer " *url-data*")) (mm-disable-multibyte) (insert (format "Content-Length: %d\n" (length data)) "Content-Type: " mediatype "\n" - "Content-Encoding: " encoding "\n" + "Content-Transfer-Encoding: " encoding "\n" "\n") (if data (insert data)) (current-buffer)))) diff --git a/lisp/url/url-vars.el b/lisp/url/url-vars.el index 0361e01dfb4..a34111c27b7 100644 --- a/lisp/url/url-vars.el +++ b/lisp/url/url-vars.el @@ -210,7 +210,7 @@ Should be an assoc list of headers/contents.") (defvar url-request-method nil "The method to use for the next request.") -(defvar url-mime-encoding-string (and (fboundp 'zlib-decompress-region) +(defvar url-mime-encoding-string (and (fboundp 'zlib-available-p) (zlib-available-p) "gzip") "String to send in the Accept-encoding: field in HTTP requests.") diff --git a/lisp/vc/ediff.el b/lisp/vc/ediff.el index 9ab592587c9..fc47bf0fc10 100644 --- a/lisp/vc/ediff.el +++ b/lisp/vc/ediff.el @@ -1481,7 +1481,7 @@ When called interactively, displays the version." (format "Ediff %s of %s" ediff-version ediff-date))) ;; info is run first, and will autoload info.el. -(declare-function Info-goto-node "info" (nodename &optional fork)) +(declare-function Info-goto-node "info" (nodename &optional fork strict-case)) ;;;###autoload (defun ediff-documentation (&optional node) diff --git a/lisp/vc/pcvs.el b/lisp/vc/pcvs.el index 914eef4dd39..539e8b43735 100644 --- a/lisp/vc/pcvs.el +++ b/lisp/vc/pcvs.el @@ -1963,7 +1963,7 @@ With a prefix argument, prompt for cvs flags." This command ignores files that are not flagged as `Unknown'." (interactive) (dolist (fi (cvs-mode-marked 'ignore)) - (cvs-append-to-ignore (cvs-fileinfo->dir fi) (cvs-fileinfo->file fi) + (vc-cvs-append-to-ignore (cvs-fileinfo->dir fi) (cvs-fileinfo->file fi) (eq (cvs-fileinfo->subtype fi) 'NEW-DIR)) (setf (cvs-fileinfo->type fi) 'DEAD)) (cvs-cleanup-collection cvs-cookies nil nil nil)) diff --git a/lisp/vc/vc-bzr.el b/lisp/vc/vc-bzr.el index 5f5416dc2ff..00604088c17 100644 --- a/lisp/vc/vc-bzr.el +++ b/lisp/vc/vc-bzr.el @@ -320,11 +320,10 @@ in the repository root directory of FILE." ("^Using saved parent location: \\(.+\\)" 1 nil nil 0)) "Value of `compilation-error-regexp-alist' in *vc-bzr* buffers.") -;; Follows vc-bzr-(async-)command, which uses vc-do-(async-)command -;; from vc-dispatcher. +;; To be called via vc-pull from vc.el, which requires vc-dispatcher. (declare-function vc-exec-after "vc-dispatcher" (code)) -;; Follows vc-exec-after. (declare-function vc-set-async-update "vc-dispatcher" (process-buffer)) +(declare-function vc-compilation-mode "vc-dispatcher" (backend)) (defun vc-bzr-pull (prompt) "Pull changes into the current Bzr branch. @@ -354,6 +353,7 @@ prompt for the Bzr command to run." (setq vc-bzr-program (car args) command (cadr args) args (cddr args))) + (require 'vc-dispatcher) (let ((buf (apply 'vc-bzr-async-command command args))) (with-current-buffer buf (vc-run-delayed (vc-compilation-mode 'bzr))) (vc-set-async-update buf)))) diff --git a/lisp/vc/vc-cvs.el b/lisp/vc/vc-cvs.el index 931193c46e0..57e23aba4d9 100644 --- a/lisp/vc/vc-cvs.el +++ b/lisp/vc/vc-cvs.el @@ -1226,11 +1226,11 @@ is non-nil." table (lambda () (vc-cvs-revision-table (car files)))))) table)) -(defun vc-cvs-ignore (file) +(defun vc-cvs-ignore (file &optional _directory _remove) "Ignore FILE under CVS." - (cvs-append-to-ignore (file-name-directory file) file)) + (vc-cvs-append-to-ignore (file-name-directory file) file)) -(defun cvs-append-to-ignore (dir str &optional old-dir) +(defun vc-cvs-append-to-ignore (dir str &optional old-dir) "In DIR, add STR to the .cvsignore file. If OLD-DIR is non-nil, then this is a directory that we don't want to hear about anymore." @@ -1245,7 +1245,9 @@ to hear about anymore." (goto-char (point-max)) (unless (bolp) (insert "\n")) (insert str (if old-dir "/\n" "\n")) - (if cvs-sort-ignore-file (sort-lines nil (point-min) (point-max))) + ;; FIXME this is a pcvs variable. + (if (bound-and-true-p cvs-sort-ignore-file) + (sort-lines nil (point-min) (point-max))) (save-buffer))) (provide 'vc-cvs) diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el index 5ddcfd57748..1e6ec15174a 100644 --- a/lisp/vc/vc-dir.el +++ b/lisp/vc/vc-dir.el @@ -245,6 +245,7 @@ See `run-hooks'." (define-key map "+" 'vc-update) ;; C-x v + (define-key map "l" 'vc-print-log) ;; C-x v l (define-key map "L" 'vc-print-root-log) ;; C-x v L + (define-key map "I" 'vc-log-incoming) ;; C-x v I ;; More confusing than helpful, probably ;;(define-key map "R" 'vc-revert) ;; u is taken by vc-dir-unmark. ;;(define-key map "A" 'vc-annotate) ;; g is taken by revert-buffer diff --git a/lisp/vc/vc-dispatcher.el b/lisp/vc/vc-dispatcher.el index 7888752553e..62fb72d0fbc 100644 --- a/lisp/vc/vc-dispatcher.el +++ b/lisp/vc/vc-dispatcher.el @@ -398,6 +398,8 @@ Display the buffer in some window, but don't select it." (set (make-local-variable 'compilation-error-regexp-alist) error-regexp-alist))) +(declare-function vc-dir-refresh "vc-dir" ()) + (defun vc-set-async-update (process-buffer) "Set a `vc-exec-after' action appropriate to the current buffer. This action will update the current buffer after the current diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index a4ce3a2c46c..e730db17526 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -706,6 +706,9 @@ It is based on `log-edit-mode', and has Git-specific extensions.") '(("^ \\(.+\\) |" 1 nil nil 0)) "Value of `compilation-error-regexp-alist' in *vc-git* buffers.") +;; To be called via vc-pull from vc.el, which requires vc-dispatcher. +(declare-function vc-compilation-mode "vc-dispatcher" (backend)) + (defun vc-git-pull (prompt) "Pull changes into the current Git branch. Normally, this runs \"git pull\". If PROMPT is non-nil, prompt @@ -725,6 +728,7 @@ for the Git command to run." (setq git-program (car args) command (cadr args) args (cddr args))) + (require 'vc-dispatcher) (apply 'vc-do-async-command buffer root git-program command args) (with-current-buffer buffer (vc-run-delayed (vc-compilation-mode 'git))) (vc-set-async-update buffer))) diff --git a/lisp/vc/vc-sccs.el b/lisp/vc/vc-sccs.el index e00d55218c8..d78564e15ed 100644 --- a/lisp/vc/vc-sccs.el +++ b/lisp/vc/vc-sccs.el @@ -506,7 +506,7 @@ Remaining arguments are ignored." ;; a (autoload 'vc-sccs-search-project-dir "vc-sccs") which would not ;; help us avoid loading vc-sccs. ;;;###autoload -(progn (defun vc-sccs-search-project-dir (dirname basename) +(progn (defun vc-sccs-search-project-dir (_dirname basename) "Return the name of a master file in the SCCS project directory. Does not check whether the file exists but returns nil if it does not find any project directory." diff --git a/lisp/vc/vc-svn.el b/lisp/vc/vc-svn.el index afc76c09742..36f27548123 100644 --- a/lisp/vc/vc-svn.el +++ b/lisp/vc/vc-svn.el @@ -234,12 +234,12 @@ RESULT is a list of conses (FILE . STATE) for directory DIR." (vc-run-delayed (vc-svn-after-dir-status callback remote)))) -(defun vc-svn-dir-status-files (dir files _default-state callback) +(defun vc-svn-dir-status-files (_dir files _default-state callback) (apply 'vc-svn-command (current-buffer) 'async nil "status" files) (vc-run-delayed (vc-svn-after-dir-status callback))) -(defun vc-svn-dir-extra-headers (dir) +(defun vc-svn-dir-extra-headers (_dir) "Generate extra status headers for a Subversion working copy." (let (process-file-side-effects) (vc-svn-command "*vc*" 0 nil "info")) @@ -352,7 +352,7 @@ This is only possible if SVN is responsible for FILE's directory.") (concat "-r" rev)) (vc-switches 'SVN 'checkout)))) -(defun vc-svn-ignore (file &optional directory remove) +(defun vc-svn-ignore (file &optional _directory _remove) "Ignore FILE under Subversion. FILE is a file wildcard, relative to the root directory of DIRECTORY." (vc-svn-command t 0 file "propedit" "svn:ignore")) @@ -593,7 +593,7 @@ NAME is assumed to be a URL." (vc-svn-command nil 0 dir "copy" name) (when branchp (vc-svn-retrieve-tag dir name nil))) -(defun vc-svn-retrieve-tag (dir name update) +(defun vc-svn-retrieve-tag (dir name _update) "Retrieve a tag at and below DIR. NAME is the name of the tag; if it is empty, do a `svn update'. If UPDATE is non-nil, then update (resynch) any affected buffers. @@ -674,19 +674,23 @@ and that it passes `vc-svn-global-switches' to it before FLAGS." (defun vc-svn-parse-status (&optional filename) "Parse output of \"svn status\" command in the current buffer. -Set file properties accordingly. Unless FILENAME is non-nil, parse only -information about FILENAME and return its status." - (let (file status propstat) +Set file properties accordingly. If FILENAME is non-nil, return its status." + (let (multifile file status propstat) (goto-char (point-min)) (while (re-search-forward ;; Ignore the files with status X. "^\\(?:\\?\\|[ ACDGIMR!~][ MC][ L][ +][ S]..\\([ *]\\) +\\([-0-9]+\\) +\\([0-9?]+\\) +\\([^ ]+\\)\\) +" nil t) ;; If the username contains spaces, the output format is ambiguous, ;; so don't trust the output's filename unless we have to. - (setq file (or filename + (setq file (or (unless multifile filename) (expand-file-name - (buffer-substring (point) (line-end-position))))) - (setq status (char-after (line-beginning-position)) + (buffer-substring (point) (line-end-position)))) + ;; If we are parsing the result of running status on a directory, + ;; there could be multiple files in the output. + ;; We assume that filename, if supplied, applies to the first + ;; listed file (ie, the directory). Bug#15322. + multifile t + status (char-after (line-beginning-position)) ;; Status of the item's properties ([ MC]). propstat (char-after (1+ (line-beginning-position)))) (if (eq status ??) diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index 39e3fbdc29a..69098efc50b 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -965,7 +965,8 @@ Within directories, only files already under version control are noticed." "Deduce a set of files and a backend to which to apply an operation. Return (BACKEND FILESET FILESET-ONLY-FILES STATE CHECKOUT-MODEL). -If we're in VC-dir mode, FILESET is the list of marked files. +If we're in VC-dir mode, FILESET is the list of marked files, +or the directory if no files are marked. Otherwise, if in a buffer visiting a version-controlled file, FILESET is a single-file fileset containing that file. Otherwise, if ALLOW-UNREGISTERED is non-nil and the visited file @@ -2335,7 +2336,7 @@ When called interactively with a prefix argument, prompt for LIMIT." ;;;###autoload (defun vc-log-incoming (&optional remote-location) "Show a log of changes that will be received with a pull operation from REMOTE-LOCATION. -When called interactively with a prefix argument, prompt for REMOTE-LOCATION.." +When called interactively with a prefix argument, prompt for REMOTE-LOCATION." (interactive (when current-prefix-arg (list (read-string "Remote location (empty for default): ")))) diff --git a/lisp/w32-common-fns.el b/lisp/w32-common-fns.el index 9f3501a01d7..6b1c3ac976e 100644 --- a/lisp/w32-common-fns.el +++ b/lisp/w32-common-fns.el @@ -23,6 +23,8 @@ ;;; and Cygwin Emacs compiled to use the native Windows widget ;;; library. +(declare-function x-server-version "w32fns.c" (&optional terminal)) + (defun w32-version () "Return the MS-Windows version numbers. The value is a list of three integers: the major and minor version @@ -100,6 +102,7 @@ in `selection-converter-alist', which see." ;; current selection against it, and avoid passing back our own text ;; from x-selection-value. (defvar x-last-selected-text nil) +(defvar x-select-enable-clipboard) (defun x-get-selection-value () "Return the value of the current selection. @@ -107,9 +110,8 @@ Consult the selection. Treat empty strings as if they were unset." (if x-select-enable-clipboard (let (text) ;; Don't die if x-get-selection signals an error. - (condition-case c - (setq text (w32-get-clipboard-data)) - (error (message "w32-get-clipboard-data:%s" c))) + (with-demoted-errors "w32-get-clipboard-data:%s" + (setq text (w32-get-clipboard-data))) (if (string= text "") (setq text nil)) (cond ((not text) nil) diff --git a/lisp/wdired.el b/lisp/wdired.el index 6c2c9777a47..7159db812ac 100644 --- a/lisp/wdired.el +++ b/lisp/wdired.el @@ -73,8 +73,6 @@ ;;; Code: -(defvar dired-backup-overwrite) ; Only in Emacs 20.x this is a custom var - (require 'dired) (autoload 'dired-do-create-files-regexp "dired-aux") @@ -185,7 +183,8 @@ renamed by `dired-do-rename' and `dired-do-rename-regexp'." (define-key map [remap capitalize-word] 'wdired-capitalize-word) (define-key map [remap downcase-word] 'wdired-downcase-word) - map)) + map) + "Keymap used in `wdired-mode'.") (defvar wdired-mode-hook nil "Hooks run when changing to WDired mode.") diff --git a/lisp/window.el b/lisp/window.el index a111b3cb5b4..e4959da3d21 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -1,7 +1,6 @@ ;;; window.el --- GNU Emacs window commands aside from those written in C -;; Copyright (C) 1985, 1989, 1992-1994, 2000-2013 Free Software -;; Foundation, Inc. +;; Copyright (C) 1985, 1989, 1992-1994, 2000-2013 Free Software Foundation, Inc. ;; Maintainer: FSF ;; Keywords: internal @@ -4464,62 +4463,66 @@ value can be also stored on disk and read back in a new session." (set-window-parameter window (car parameter) (cdr parameter)))) ;; Process buffer related state. (when state - ;; We don't want to raise an error in case the buffer does not - ;; exist anymore, so we switch to a previous one and save the - ;; window with the intention of deleting it later if possible. (let ((buffer (get-buffer (car state)))) (if buffer - (set-window-buffer window buffer) + (with-current-buffer buffer + (set-window-buffer window buffer) + (set-window-hscroll window (cdr (assq 'hscroll state))) + (apply 'set-window-fringes + (cons window (cdr (assq 'fringes state)))) + (let ((margins (cdr (assq 'margins state)))) + (set-window-margins window (car margins) (cdr margins))) + (let ((scroll-bars (cdr (assq 'scroll-bars state)))) + (set-window-scroll-bars + window (car scroll-bars) (nth 2 scroll-bars) + (nth 3 scroll-bars))) + (set-window-vscroll window (cdr (assq 'vscroll state))) + ;; Adjust vertically. + (if (memq window-size-fixed '(t height)) + ;; A fixed height window, try to restore the + ;; original size. + (let ((delta (- (cdr (assq 'total-height item)) + (window-total-height window))) + window-size-fixed) + (when (window-resizable-p window delta) + (window-resize window delta))) + ;; Else check whether the window is not high enough. + (let* ((min-size (window-min-size window nil ignore)) + (delta (- min-size (window-total-size window)))) + (when (and (> delta 0) + (window-resizable-p window delta nil ignore)) + (window-resize window delta nil ignore)))) + ;; Adjust horizontally. + (if (memq window-size-fixed '(t width)) + ;; A fixed width window, try to restore the original + ;; size. + (let ((delta (- (cdr (assq 'total-width item)) + (window-total-width window))) + window-size-fixed) + (when (window-resizable-p window delta) + (window-resize window delta))) + ;; Else check whether the window is not wide enough. + (let* ((min-size (window-min-size window t ignore)) + (delta (- min-size (window-total-size window t)))) + (when (and (> delta 0) + (window-resizable-p window delta t ignore)) + (window-resize window delta t ignore)))) + ;; Set dedicated status. + (set-window-dedicated-p window (cdr (assq 'dedicated state))) + ;; Install positions (maybe we should do this after all + ;; windows have been created and sized). + (ignore-errors + (set-window-start window (cdr (assq 'start state))) + (set-window-point window (cdr (assq 'point state)))) + ;; Select window if it's the selected one. + (when (cdr (assq 'selected state)) + (select-window window))) + ;; We don't want to raise an error in case the buffer does + ;; not exist anymore, so we switch to a previous one and + ;; save the window with the intention of deleting it later + ;; if possible. (switch-to-prev-buffer window) - (push window window-state-put-stale-windows))) - (with-current-buffer (window-buffer window) - (set-window-hscroll window (cdr (assq 'hscroll state))) - (apply 'set-window-fringes - (cons window (cdr (assq 'fringes state)))) - (let ((margins (cdr (assq 'margins state)))) - (set-window-margins window (car margins) (cdr margins))) - (let ((scroll-bars (cdr (assq 'scroll-bars state)))) - (set-window-scroll-bars - window (car scroll-bars) (nth 2 scroll-bars) (nth 3 scroll-bars))) - (set-window-vscroll window (cdr (assq 'vscroll state))) - ;; Adjust vertically. - (if (memq window-size-fixed '(t height)) - ;; A fixed height window, try to restore the original size. - (let ((delta (- (cdr (assq 'total-height item)) - (window-total-height window))) - window-size-fixed) - (when (window-resizable-p window delta) - (window-resize window delta))) - ;; Else check whether the window is not high enough. - (let* ((min-size (window-min-size window nil ignore)) - (delta (- min-size (window-total-size window)))) - (when (and (> delta 0) - (window-resizable-p window delta nil ignore)) - (window-resize window delta nil ignore)))) - ;; Adjust horizontally. - (if (memq window-size-fixed '(t width)) - ;; A fixed width window, try to restore the original size. - (let ((delta (- (cdr (assq 'total-width item)) - (window-total-width window))) - window-size-fixed) - (when (window-resizable-p window delta) - (window-resize window delta))) - ;; Else check whether the window is not wide enough. - (let* ((min-size (window-min-size window t ignore)) - (delta (- min-size (window-total-size window t)))) - (when (and (> delta 0) - (window-resizable-p window delta t ignore)) - (window-resize window delta t ignore)))) - ;; Set dedicated status. - (set-window-dedicated-p window (cdr (assq 'dedicated state))) - ;; Install positions (maybe we should do this after all windows - ;; have been created and sized). - (ignore-errors - (set-window-start window (cdr (assq 'start state))) - (set-window-point window (cdr (assq 'point state)))) - ;; Select window if it's the selected one. - (when (cdr (assq 'selected state)) - (select-window window))))))) + (push window window-state-put-stale-windows))))))) (defun window-state-put (state &optional window ignore) "Put window state STATE into WINDOW. @@ -6149,6 +6152,9 @@ reduce this. If it is thicker, you might want to increase this." :version "24.3" :group 'windows) +(declare-function x-display-pixel-height "xfns.c" (&optional terminal)) +(declare-function tool-bar-lines-needed "xdisp.c" (&optional frame)) + (defun fit-frame-to-buffer (&optional frame max-height min-height) "Adjust height of FRAME to display its buffer contents exactly. FRAME can be any live frame and defaults to the selected one. @@ -6159,6 +6165,8 @@ top line of FRAME, minus `fit-frame-to-buffer-bottom-margin'. Optional argument MIN-HEIGHT specifies the minimum height of FRAME. The default corresponds to `window-min-height'." (interactive) + (or (fboundp 'x-display-pixel-height) + (user-error "Cannot resize frame in non-graphic Emacs")) (setq frame (window-normalize-frame frame)) (let* ((root (frame-root-window frame)) (frame-min-height @@ -6681,7 +6689,7 @@ is active. This function is run by `mouse-autoselect-window-timer'." (window-at (cadr mouse-position) (cddr mouse-position) (car mouse-position))))) (cond - ((or (menu-or-popup-active-p) + ((or (and (fboundp 'menu-or-popup-active-p) (menu-or-popup-active-p)) (and window (let ((coords (coordinates-in-window-p (cdr mouse-position) window))) diff --git a/m4/extern-inline.m4 b/m4/extern-inline.m4 index c4c5e7f221b..4862d60d8e7 100644 --- a/m4/extern-inline.m4 +++ b/m4/extern-inline.m4 @@ -19,20 +19,28 @@ AC_DEFUN([gl_EXTERN_INLINE], 'reference to static identifier "f" in extern inline function'. This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16. - Suppress the use of extern inline on Apple's platforms, as Libc at least - through Libc-825.26 (2013-04-09) is incompatible with it; see, e.g., + Suppress the use of extern inline on problematic Apple configurations, as + Libc at least through Libc-825.26 (2013-04-09) mishandles it; see, e.g., <http://lists.gnu.org/archive/html/bug-gnulib/2012-12/msg00023.html>. Perhaps Apple will fix this some day. */ +#if (defined __APPLE__ \ + && ((! defined _DONT_USE_CTYPE_INLINE_ \ + && (defined __GNUC__ || defined __cplusplus)) \ + || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \ + && defined __GNUC__ && ! defined __cplusplus))) +# define _GL_EXTERN_INLINE_APPLE_BUG +#endif #if ((__GNUC__ \ ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \ : (199901L <= __STDC_VERSION__ \ && !defined __HP_cc \ && !(defined __SUNPRO_C && __STDC__))) \ - && !defined __APPLE__) + && !defined _GL_EXTERN_INLINE_APPLE_BUG) # define _GL_INLINE inline # define _GL_EXTERN_INLINE extern inline +# define _GL_EXTERN_INLINE_IN_USE #elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \ - && !defined __APPLE__) + && !defined _GL_EXTERN_INLINE_APPLE_BUG) # if __GNUC_GNU_INLINE__ /* __gnu_inline__ suppresses a GCC 4.2 diagnostic. */ # define _GL_INLINE extern inline __attribute__ ((__gnu_inline__)) @@ -40,6 +48,7 @@ AC_DEFUN([gl_EXTERN_INLINE], # define _GL_INLINE extern inline # endif # define _GL_EXTERN_INLINE extern +# define _GL_EXTERN_INLINE_IN_USE #else # define _GL_INLINE static _GL_UNUSED # define _GL_EXTERN_INLINE static _GL_UNUSED diff --git a/m4/manywarnings.m4 b/m4/manywarnings.m4 index be6d4c91c50..80b2476d250 100644 --- a/m4/manywarnings.m4 +++ b/m4/manywarnings.m4 @@ -1,4 +1,4 @@ -# manywarnings.m4 serial 5 +# manywarnings.m4 serial 6 dnl Copyright (C) 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -204,6 +204,8 @@ AC_DEFUN([gl_MANYWARN_ALL_GCC], -Wvla \ -Wvolatile-register-var \ -Wwrite-strings \ + -fdiagnostics-show-option \ + -funit-at-a-time \ \ ; do gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item" diff --git a/m4/warnings.m4 b/m4/warnings.m4 index 5f5da51606b..e3d239b64ff 100644 --- a/m4/warnings.m4 +++ b/m4/warnings.m4 @@ -1,4 +1,4 @@ -# warnings.m4 serial 10 +# warnings.m4 serial 11 dnl Copyright (C) 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -36,9 +36,9 @@ AC_CACHE_CHECK([whether _AC_LANG compiler handles $1], m4_defn([gl_Warn]), [ gl_save_compiler_FLAGS="$gl_Flags" gl_AS_VAR_APPEND(m4_defn([gl_Flags]), [" $gl_unknown_warnings_are_errors ]m4_defn([gl_Positive])["]) - AC_COMPILE_IFELSE([m4_default([$4], [AC_LANG_PROGRAM([])])], - [AS_VAR_SET(gl_Warn, [yes])], - [AS_VAR_SET(gl_Warn, [no])]) + AC_LINK_IFELSE([m4_default([$4], [AC_LANG_PROGRAM([])])], + [AS_VAR_SET(gl_Warn, [yes])], + [AS_VAR_SET(gl_Warn, [no])]) gl_Flags="$gl_save_compiler_FLAGS" ]) AS_VAR_IF(gl_Warn, [yes], [$2], [$3]) diff --git a/nt/ChangeLog b/nt/ChangeLog index e7d9ed99e3c..2f9a2f5608d 100644 --- a/nt/ChangeLog +++ b/nt/ChangeLog @@ -1,3 +1,12 @@ +2013-09-20 Eli Zaretskii <eliz@gnu.org> + + * mingw-cfg.site (gl_cv_sys_struct_timeval_tv_sec): Set to "yes" + to avoid gnulib replacement of 'struct timeval' and the resulting + compilation of lib/gettimeofday.c with incompatible version of + gettimeofday. Related discussions on emacs-devel: + http://lists.gnu.org/archive/html/emacs-devel/2013-09/msg00286.html + http://lists.gnu.org/archive/html/emacs-devel/2013-09/msg00361.html + 2013-08-31 Glenn Morris <rgm@gnu.org> * INSTALL: Rename from INSTALL.MSYS. diff --git a/nt/mingw-cfg.site b/nt/mingw-cfg.site index 325bba29ae5..a217cbc8c70 100644 --- a/nt/mingw-cfg.site +++ b/nt/mingw-cfg.site @@ -31,6 +31,9 @@ # We want to use getopt.h from gnulib ac_cv_header_getopt_h=no +# We don't want our struct timeval replaced due to Posix conformance +gl_cv_sys_struct_timeval_tv_sec=yes + # ACL functions are implemented in w32.c ac_cv_search_acl_get_file="none required" ac_cv_func_acl_get_file=yes diff --git a/src/ChangeLog b/src/ChangeLog index 3ef8bee2f0b..a6774e30b0c 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,840 @@ +2013-09-26 Barry O'Reilly <gundaetiapo@gmail.com> + + Signal error when reading an empty byte-code object (Bug#15405) + * lread.c (read1): signal error + * alloc.c (make_byte_code): eassert header size + (sweep_vectors): change an int to size_t + +2013-09-24 Paul Eggert <eggert@cs.ucla.edu> + + * dispnew.c (clear_glyph_row, copy_row_except_pointers): Use enums + instead of ints, as it's the usual style for offsetof constants. See: + http://lists.gnu.org/archive/html/emacs-devel/2013-09/msg00478.html + + * data.c (POPCOUNT_STATIC_INLINE): New macro, as a hack for popcount. + This is ugly, but it should fix the performance problem for older + GCC versions in the short run. I'll look into integrating the + Gnulib module for popcount, as a better fix. + See the thread starting in: + http://lists.gnu.org/archive/html/emacs-devel/2013-09/msg00474.html + (popcount_size_t_generic) [NEED_GENERIC_POPCOUNT]: + (popcount_size_t_msc) [USE_MSC_POPCOUNT]: + (popcount_size_t_gcc) [USE_GCC_POPCOUNT]: + (popcount_size_t): Use it. + +2013-09-24 Daniel Colascione <dancol@dancol.org> + + * process.c (Fnetwork_interface_info): Fix build break due to + vector changes. + +2013-09-24 Paul Eggert <eggert@cs.ucla.edu> + + * dispnew.c (clear_glyph_row, copy_row_except_pointers): + Prefer signed to unsigned integers where either will do. + No need for 'const' on locals that do not escape. + Omit easserts with unnecessary and unportable assumptions about + alignment. Avoid unnecessary casts to char *. + +2013-09-24 Dmitry Antipov <dmantipov@yandex.ru> + + Use union for the payload of struct Lisp_Vector. + This helps to avoid a few glitches dictated by C's aliasing rules. + * lisp.h (struct Lisp_Vector): Use union for next and + contents member. Adjust comment. Change related users. + * alloc.c (next_in_free_list, set_next_in_free_list): Remove. + Related users changed. + * buffer.c, bytecode.c, ccl.c, character.h, chartab.c, composite.c: + * composite.h, disptab.h, fns.c, fontset.c, indent.c, keyboard.c: + * lread.c, msdos.c, process.c, w32menu.c, window.c, xdisp.c: + * xfaces.c, xfont.c, xmenu.c: Related users changed. + +2013-09-24 Dmitry Antipov <dmantipov@yandex.ru> + + Optimize glyph row clearing and copying routines. + * dispextern.h (struct glyph_row): Change layout of struct + glyph_row to help copy_row_except_pointers. Adjust comment. + * dispnew.c (null_row): Remove. + (clear_glyph_row): Use offsetof and memset to find and clear + just the members that need clearing. Adjust comment. + (copy_row_except_pointers): Likewise for copying. + +2013-09-24 Paul Eggert <eggert@cs.ucla.edu> + + Some minor cleanups of recently-added bool vector code. + * conf_post.h (assume): Always return void. Use lint version + only if GCC and MSC versions don't apply. + * conf_post.h (assume): + * data.c (USC_MSC_POPCOUNT, count_trailing_zero_bits): + Depend on _MSC_VER, not __MSC_VER, for consistency with + the rest of Emacs. + * data.c (bool_vector_spare_mask, popcount_size_t_generic) + (popcount_size_t_msc, popcount_size_t_gcc, popcount_size_t) + (bool_vector_binop_driver, count_trailing_zero_bits) + (size_t_to_host_endian): Now static, not static inline; + the latter isn't needed with modern compilers and doesn't + work with older compilers anyway. + + * alloc.c (valgrind_p): Use bool for boolean. + +2013-09-23 Dmitry Antipov <dmantipov@yandex.ru> + + * xdisp.c (noninteractive_need_newline, message_log_need_newline) + (overlay_arrow_seen, message_enable_multibyte, line_number_displayed) + (display_last_displayed_message_p, message_buf_print) + (message_cleared_p, help_echo_showing_p, hourglass_shown_p): + Use bool for boolean. + * dispextern.h (cancel_line, init_desired_glyphs): + Remove ancient leftover. + (help_echo_showing_p, hourglass_shown_p): + * lisp.h (noninteractive_need_newline): Adjust declaration. + +2013-09-23 Dmitry Antipov <dmantipov@yandex.ru> + + * dispnew.c (frame_garbaged, selected_frame, last_nonminibuf_frame): + Move to... + * frame.c (frame_garbaged, selected_frame, last_nonminibuf_frame): + ...this file and convert the latter to static. Adjust comment. + (make_initial_frame): + * window.c (init_window_once): Adjust user. + * frame.h (last_nonminibuf_frame): Remove declaration. + * lisp.h (selected_frame): Likewise. + * msdos.c (the_only_display_info): Adjust comment. + +2013-09-23 Eli Zaretskii <eliz@gnu.org> + + * xdisp.c (mouse_face_from_string_pos): Fix off-by-one error in + computing the end column of mouse-highlight that comes from + display or overlay strings. (Bug#15437) + (note_mouse_highlight): Adapt calculation of last argument to + mouse_face_from_string_pos to the above change. + + * conf_post.h (__has_builtin): Define to zero, if undefined, on + all platforms, not just for clang. + +2013-09-23 Jan Djärv <jan.h.d@swipnet.se> + + * filelock.c (lock_file_1): Rearrange to remove compiler warning + about excess arguments to snprintf. + + * conf_post.h(assume): Use __builtin_unreachable for clang. + +2013-09-23 Juanma Barranquero <lekktu@gmail.com> + + * w32console.c (initialize_w32_display): Remove unused variable hlinfo. + * w32term.c (w32_scroll_bar_handle_click): Remove unused variable f. + +2013-09-23 Daniel Colascione <dancol@dancol.org> + + * alloc.c (USE_VALGRIND): New macro; on by default + when ENABLE_CHECKING. + (mark_maybe_object,mark_maybe_pointer) + [USE_VALGRIND]: Mark conservatively-scanned regions valid for + valgrind purposes. + (valgrind_p) [USE_VALGRIND]: New variable. + (init_alloc) [USE_VALGRIND]: Initialize valgrind_p. + +2013-09-22 Jan Djärv <jan.h.d@swipnet.se> + + * process.c (wait_reading_process_output): Change int pnamelen to + socklen_t. + + * nsterm.m (setMarkedText:selectedRange:): + (deleteWorkingText): + * nsmenu.m (addDisplayItemWithImage:idx:tag:helpText:enabled:): + * nsfont.m (ns_get_covering_families, ns_findfonts): Cast NSLog + argument to unsigned long to avoid warning. + (nsfont_draw): Use 0.25 instead of Fix2X (kATSItalicQDSkew). + + * conf_post.h (assume): Fix compiler error: x shall be cond. + +2013-09-22 Daniel Colascione <dancol@dancol.org> + + * xfns.c (x_get_monitor_attributes): Suppress unused variable + warning when compiling without a window system. + +2013-09-22 Daniel Colascione <dancol@dancol.org> + + * data.c (Qbool_vector_p): New symbol. + (bool_vector_spare_mask,popcount_size_t_generic) + (popcount_size_t_msc,popcount_size_t_gcc) + (popcount_size_t) + (bool_vector_binop_driver) + (count_trailing_zero_bits,size_t_to_host_endian) + (Fbool_vector_exclusive_or) + (Fbool_vector_union) + (Fbool_vector_intersection,Fbool_vector_set_difference) + (Fbool_vector_subsetp,Fbool_vector_not) + (Fbool_vector_count_matches) + (Fbool_vector_count_matches_at): New functions. + (syms_of_data): Intern new symbol, functions. + * alloc.c (bool_vector_payload_bytes): New function. + (Fmake_bool_vector): Instead of calling Fmake_vector, + which performs redundant initialization and argument checking, + just call allocate_vector ourselves. Make sure we clear any + terminating padding to zero. + (vector_nbytes,sweep_vectors): Use bool_vector_payload_bytes + instead of open-coding the size calculation. + (vroundup_ct): New macro. + (vroundup): Assume argument >= 0; invoke vroundup_ct. + * casetab.c (shuffle,set_identity): Change lint_assume to assume. + * composite.c (composition_gstring_put_cache): Change + lint_assume to assume. + * conf_post.h (assume): New macro. + (lint_assume): Remove. + * dispnew.c (update_frame_1): Change lint_assume to assume. + * ftfont.c (ftfont_shape_by_flt): Change lint_assume + to assume. + * image.c (gif_load): Change lint_assume to assume. + * lisp.h (eassert_and_assume): New macro. + (Qbool_vector_p): Declare. + (CHECK_BOOL_VECTOR,ROUNDUP,BITS_PER_SIZE_T): New macros. + (swap16,swap32,swap64): New inline functions. + * macfont.c (macfont_shape): Change lint_assume to assume. + * ralloc.c: Rename ROUNDUP to PAGE_ROUNDUP throughout. + * xsettings.c (parse_settings): Use new swap16 and + swap32 from lisp.h instead of file-specific macros. + +2013-09-22 Eli Zaretskii <eliz@gnu.org> + + * xdisp.c (try_window_id): Don't abort if cursor row could not be + found (which can legitimately happen when the glyph row at the + window start is disabled in the current_matrix. (Bug#15365) + +2013-09-22 Paul Eggert <eggert@cs.ucla.edu> + + Fix syntax.h bug introduced by recent INLINE change. + syntax.h defined an extern inline function SYNTAX_ENTRY that was + conditionally compiled one way in some modules, and a different + way in others. This doesn't work with extern inline functions, + which must have the same definition in all modules, because the + defining code might be shared across modules, depending on the + implementation. Symptoms reported by Martin Rudalics in: + http://lists.gnu.org/archive/html/emacs-devel/2013-09/msg00414.html + * regex.c, syntax.c (SYNTAX_ENTRY_VIA_PROPERTY): Remove. + (SYNTAX, SYNTAX_ENTRY, SYNTAX_WITH_FLAGS): New macros, + overriding the corresponding functions in syntax.h. + * syntax.h (syntax_property_entry, syntax_property_with_flags) + (syntax_property): New inline functions. + (SYNTAX_ENTRY, SYNTAX_WITH_FLAGS, SYNTAX): + Rewrite in terms of these new functions. + +2013-09-21 Eli Zaretskii <eliz@gnu.org> + + * dired.c (directory_files_internal): Use multibyte_chars_in_text, + not chars_in_text, whose result depends on the multibyteness of + the current buffer. (Bug#15426) + +2013-09-20 Paul Eggert <eggert@cs.ucla.edu> + + Port recent change to hosts where pointers aren't 'long'. + * xterm.c (x_send_scroll_bar_event, x_scroll_bar_to_input_event): + Don't assume that pointers are the same width as 'long'. + Add a compile-time check that a pointer fits into two X slots. + + A simpler, centralized INLINE. + * conf_post.h (INLINE): Define only if not already defined. + This allows us to use a single INLINE, defined by one file + per executable. + * emacs.c (INLINE): Define it. + Also, include category.h, charset.h, composite.h, dispextern.h, + syntax.h, systime.h, so that their INLINE definitions are expanded + properly for Emacs. + * blockinput.h, keyboard.c (BLOCKINPUT_INLINE): + * buffer.h, buffer.c (BUFFER_INLINE): + * category.h, category.c (CATEGORY_INLINE): + * character.h, character.c (CHARACTER_INLINE): + * charset.h, charset.c (CHARSET_INLINE): + * composite.h, composite.c (COMPOSITE_INLINE): + * dispextern.h, dispnew.c (DISPEXTERN_INLINE): + * frame.h, frame.c (FRAME_INLINE): + * intervals.h, intervals.c (INTERVALS_INLINE): + * keyboard.h, keyboard.c (KEYBOARD_INLINE): + * lisp.h, alloc.c (LISP_INLINE): + * process.h, process.c (PROCESS_INLINE): + * syntax.h, syntax.c (SYNTAX_INLINE): + * systime.h, sysdep.c (SYSTIME_INLINE): + * termhooks.h, terminal.h (TERMHOOKS_INLINE): + * window.h, window.c (WINDOW_INLINE): + Remove. All uses replaced with INLINE. + +2013-09-20 Dmitry Antipov <dmantipov@yandex.ru> + + * xterm.c (handle_one_xevent): Revert part of 2013-09-17 change + to avoid Bug#15398. + +2013-09-19 Eli Zaretskii <eliz@gnu.org> + + * w32reg.c (w32_get_string_resource): Make the first 2 arguments + 'const char *' to avoid compiler warnings due to similar change in + the prototype of x_get_string_resource. + +2013-09-19 Dmitry Antipov <dmantipov@yandex.ru> + + * xterm.h (struct x_display_info): New members last_mouse_glyph_frame, + last_mouse_scroll_bar, last_mouse_glyph and last_mouse_movement_time, + going to replace static variables below. Adjust comments. + * xterm.c (last_mouse_glyph, last_mouse_glyph_frame) + (last_mouse_scroll_bar, last_mouse_movement_time): Remove. + (note_mouse_movement, XTmouse_position, x_scroll_bar_note_movement) + (x_scroll_bar_report_motion, handle_one_xevent, syms_of_xterm): + Related users changed. + * w32term.h (struct w32_display_info): New members last_mouse_glyph_frame, + last_mouse_scroll_bar, last_mouse_scroll_bar_pos, last_mouse_glyph and + last_mouse_movement_time, going to replace static variables below. + Adjust comments. + * w32term.c (last_mouse_glyph_frame, last_mouse_scroll_bar) + (last_mouse_scroll_bar_pos, last_mouse_glyph, last_mouse_movement_time): + Remove. + (note_mouse_movement, w32_mouse_position, w32_scroll_bar_handle_click) + (x_scroll_bar_report_motion, syms_of_w32term): Related users changed. + * nsterm.h (struct ns_display_info): New members last_mouse_glyph, + last_mouse_movement_time and last_mouse_scroll_bar, going to replace + static variables below. + * nsterm.m (last_mouse_glyph, last_mouse_movement_time) + (last_mouse_scroll_bar): Remove. + (note_mouse_movement, ns_mouse_position, mouseMoved, mouseEntered) + (mouseExited): Related users changed. + +2013-09-19 Dmitry Antipov <dmantipov@yandex.ru> + + Do not use external array to process X scroll bar messages. + * xterm.c (scroll_bar_windows, scroll_bar_windows_size): Remove. + (x_send_scroll_bar_event): Pack window pointer into two slots + of XClientMessageEvent if we're 64-bit. Adjust comment. + (x_scroll_bar_to_input_event): Unpack accordingly. + +2013-09-18 Dmitry Antipov <dmantipov@yandex.ru> + + Ifdef away recent changes which aren't relevant to NS port. + * dispextern.h (x_mouse_grabbed, x_redo_mouse_highlight) + [!HAVE_NS]: Declare as such. + * frame.c (x_mouse_grabbed, x_redo_mouse_highlight) + [!HAVE_NS]: Define as such. + +2013-09-18 Dmitry Antipov <dmantipov@yandex.ru> + + * frame.c (x_redo_mouse_highlight): New function + to factor out common code used in W32 and X ports. + * dispextern.h (x_redo_mouse_highlight): Add prototype. + * xterm.h (struct x_display_info): + * w32term.h (struct w32_display_info): + * nsterm.h (struct ns_display_info): New members + last_mouse_motion_frame, last_mouse_motion_x and + last_mouse_motion_y, going to replace static variables below. + * xterm.c (last_mouse_motion_event, last_mouse_motion_frame) + (redo_mouse_highlight): Remove. + (note_mouse_movement, syms_of_xterm): Adjust user. + (handle_one_xevent): Likewise. Use x_redo_mouse_highlight. + * w32term.c (last_mouse_motion_event, last_mouse_motion_frame) + (redo_mouse_highlight): Remove. + (note_mouse_movement, syms_of_w32term): Adjust user. + (w32_read_socket): Likewise. Use x_redo_mouse_highlight. + * nsterm.m (last_mouse_motion_position, last_mouse_motion_frame): + Remove. + (note_mouse_movement, mouseMoved, syms_of_nsterm): + * nsfns.m (compute_tip_xy): Adjust user. + +2013-09-18 Dmitry Antipov <dmantipov@yandex.ru> + + * frame.c (x_mouse_grabbed): New function. + * dispextern.h (x_mouse_grabbed): Add prototype. + (last_mouse_frame): Remove declaration. + * xterm.h (struct x_display_info): + * w32term.h (struct w32_display_info): + * nsterm.h (struct ns_display_info): New member + last_mouse_frame, going to replace... + * xdisp.c (last_mouse_frame): ...global variable. + (note_tool_bar_highlight): + * w32term.c (w32_mouse_position, w32_read_socket): + * xterm.c (XTmouse_position, handle_one_xevent): + Use x_mouse_grabbed. + * nsterm.m (ns_mouse_position, mouseDown): Adjust user. + +2013-09-17 Dmitry Antipov <dmantipov@yandex.ru> + + * w32term.c (w32_read_socket): Avoid temporary + variables in a call to x_real_positions. + * xterm.c (handle_one_xevent): Likewise. + +2013-09-17 Dmitry Antipov <dmantipov@yandex.ru> + + * frame.h (x_set_bitmap_icon) [!HAVE_NS]: New function. + (x_icon_type): Remove prototype. + (x_bitmap_icon) [!HAVE_NS]: Declare as such. + * frame.c (x_icon_type): Remove. + * w32term.c (x_make_frame_visible, x_iconify_frame): + * xterm.c (x_make_frame_visible, x_iconify_frame): + Use x_set_bitmap_icon to factor out common code. + +2013-09-17 Dmitry Antipov <dmantipov@yandex.ru> + + * dispextern.h (check_x_display_info, x_get_string_resource): + Declare here just once and unify the latter. + * frame.c (check_x_display_info, x_get_string_resource): + * nsterm.h (check_x_display_info): + * xrdb.c (x_get_string_resource): + * xterm.h (check_x_display_info): Remove prototypes. + * nsfns.m (x_get_string_resource): Likewise. Adjust definition. + * w32reg.c (x_get_string_resource): Likewise. + (w32_get_rdb_resource): Adjust user. + +2013-09-17 Dmitry Antipov <dmantipov@yandex.ru> + + * xterm.h (struct x_display_info): New member + x_pending_autoraise_frame, going to replace... + * xterm.c (pending_autoraise_frame): ...static variable. + (x_new_focus_frame, XTread_socket): Adjust users. + * w32term.h (struct w32_display_info): New member + w32_pending_autoraise_frame, going to replace... + * w32term.c (pending_autoraise_frame): ...global variable. + (x_new_focus_frame, w32_read_socket): Adjust users. + +2013-09-17 Glenn Morris <rgm@gnu.org> + + * xdisp.c (message_dolog): If we create *Messages*, + switch it to messages-buffer-mode. + +2013-09-17 Paul Eggert <eggert@cs.ucla.edu> + + Don't overuse 'const' in types of locals. + * bidi.c (bidi_count_bytes): + * gtkutil.c, gtkutil.h (xg_event_is_for_menubar) + (xg_event_is_for_scrollbar): + * xselect.c (x_handle_property_notify) + (x_handle_selection_notify, x_handle_dnd_message): + * xsettings.c, xsettings.h (xft_settings_event): + * xterm.c (x_handle_net_wm_state, handle_one_event) + (x_menubar_window_to_frame, x_detect_focus_change) + (construct_mouse_click, note_mouse_movement) + (x_scroll_bar_to_input_event, x_scroll_bar_expose) + (x_scroll_bar_handle_click, x_scroll_bar_note_movement) + (handle_one_xevent, x_handle_net_wm_state): + * xterm.h (x_handle_property_notify, x_handle_selection_notify) + (x_handle_dnd_message): + Avoid unnecessary 'const', typically the second 'const' in + 'const foo * const arg', a 'const' that does not affect the API + and doesn't significantly help the human reader. + +2013-09-17 Dmitry Antipov <dmantipov@yandex.ru> + + * image.c (fn_g_type_init) [WINDOWSNT]: Define and load + only if Glib < 2.36.0. + (fn_g_type_init) [!WINDOWSNT]: Define only if Glib < 2.36.0. + * xsettings.c (init_gconf, init_gsettings): Do not check + for g_type_init. + * xterm.c (handle_one_xevent): Do not call to x_clear_area + if GTK >= 2.7.0. + (toplevel) [USE_MOTIF]: Include xlwmenu.h to pacify GCC. + +2013-09-16 Jan Djärv <jan.h.d@swipnet.se> + + * xsettings.c (init_gconf, init_gsettings): Check for Glib 2.36.0 + before calling g_type_init. + + * font.c (syms_of_font): Move call to syms_of_(ns|mac)font ... + + * nsterm.m (syms_of_nsterm): ... to here. + +2013-09-16 Dmitry Antipov <dmantipov@yandex.ru> + + * xterm.c (toolkit_scroll_bar_interaction): Use bool for boolean. + (ignore_next_mouse_click_timeout): Use Time as X does. + (handle_one_xevent): Avoid cast and use unsigned comparison. + +2013-09-16 Dmitry Antipov <dmantipov@yandex.ru> + + Do not copy X event in handle_one_xevent except KeyPress case. + Wnen XEvent is processed, it is unlikely to be changed except + KeyPress case, so we can avoid copying and use const pointer to + const data to make sure that an event is not changed elsewhere. + * xterm.c (handle_one_xevent): Change 2nd arg to 'const XEvent * + const' and do not create local copy except for the KeyPress event. + Use casts to avoid a few glitches. Adjust formatting. Add comments. + (SET_SAVED_BUTTON_EVENT): Remove and move the code to the only user. + (x_handle_net_wm_state, x_menubar_window_to_frame) + (x_detect_focus_change, construct_mouse_click, note_mouse_movement) + (x_scroll_bar_to_input_event, x_scroll_bar_expose) + (x_scroll_bar_handle_click, x_scroll_bar_note_movement): + * gtkutil.c (xg_event_is_for_menubar, xg_event_is_for_scrollbar): + * xselect.c (x_handle_property_notify, x_handle_selection_notify) + (x_handle_dnd_message): + * xsettings.c (xft_settings_event): + Use 'const XEvent * const' where appropriate. + * xterm.h, gtkutil.h, xsettngs.h: Adjust related prototypes. + +2013-09-16 Dmitry Antipov <dmantipov@yandex.ru> + + Fix X event waiting to handle multiple frames. + * frame.h (struct frame) [HAVE_X_WINDOWS]: New member wait_event_type. + * xterm.c (pending_event_wait): Remove. Adjust users. + (x_detect_focus_change): Pass frame arg. + (handle_one_xevent): Find related frame early and clear per-frame + wait_event_type only if this is an event for the relevant frame. + (x_wait_for_event): Use per-frame wait_event_type. + +2013-09-15 Jan Djärv <jan.h.d@swipnet.se> + + * nsfns.m (Fx_create_frame): Fix font driver registration for + GNUStep. + + * font.c (syms_of_font): Check MAC_OS_X_VERSION_MAX_ALLOWED >= 1050 + for syms_of_macfont. + + * nsterm.m: Include macfont.h. + (ns_tmp_flags, ns_tmp_font): Remove. + (ns_compute_glyph_string_overhangs): Check for driver Qns. + (ns_draw_glyph_string): Use local variables instead of ns_tmp_flags, + ns_tmp_font. Call ns_draw_text_decoration here instead of nsfont.m. + (changeFont:): Fix code style. Check for font driver type when + getiing font. + + * nsterm.h (FONT_DESCENT, FONT_ASCENT): Define to (f)->ascent and + (f)->descent. + + * nsfont.m (ns_tmp_flags, ns_tmp_font): Remove. + (nsfont_open): Set font driver type. + Set font->ascent and font->descent. Figure out font instead of + ns_tmp_font, and flags instead of ns_tmp_flags. + Fix indentation. Remove call to ns_draw_text_decoration, + moved to nsterm. + + * nsfns.m: Include macfont.h. + (Fx_create_frame): Register macfont driver, make a better default font. + (Fns_popup_font_panel): Get font from macfont driver, if used. + + * macfont.m, macfont.h, maccuvs.h: New files. + + * font.h: Declare syms_of_macfont. + + * font.c (syms_of_font): Call syms_of_macfont. + + * Makefile.in (NS_OBJ, SOME_MACHINE_OBJECTS): Add macfont.o. + +2013-09-15 Dmitry Antipov <dmantipov@yandex.ru> + + Drop VERTICAL_SCROLL_BAR_WIDTH_TRIM. For X, it is zero since 1999, + and it is always zero for others, so I assume that this is an ancient + leftover which nobody will want to change any more. + * xterm.h, w32term.h, nsterm.h (VERTICAL_SCROLL_BAR_WIDTH_TRIM): Remove. + (VERTICAL_SCROLL_BAR_INSIDE_WIDTH): + * frame.c (x_set_scroll_bar_width): + * w32fns.c (w32_createscrollbar): + * w32term.c (w32_set_vertical_scroll_bar): + * xfns.c (x_set_scroll_bar_default_width): + * xterm.c (XTflash, x_scroll_bar_create, XTset_vertical_scroll_bar) + (x_scroll_bar_expose): Related users changed. + +2013-09-15 Dmitry Antipov <dmantipov@yandex.ru> + + * xterm.h (FRAME_X_SCREEN_NUMBER): Add comment. + (BLACK_PIX_DEFAULT, WHITE_PIX_DEFAULT): Use FRAME_X_SCREEN_NUMBER. + (SCROLL_BAR_X_WIDGET, SET_SCROLL_BAR_X_WIDGET) [USE_X_TOOLKIT]: + Define as such. + * frame.h (FRAME_SMALLEST_CHAR_WIDTH, FRAME_SMALLEST_FONT_HEIGHT): + Define once here... + * nsterm.h, w32term.h, xterm.h: ...and not here. + * w32term.h (SCROLL_BAR_X_WIDGET, SET_SCROLL_BAR_X_WIDGET): + Remove unused Xisms. + * xterm.c, xfns.c (toplevel): Remove #ifdef HAVE_X_WINDOWS because + these modules are never compiled otherwise. + +2013-09-14 Eli Zaretskii <eliz@gnu.org> + + * buffer.c (syms_of_buffer) <left-margin-width, right-margin-width>: + Doc fix. (Bug#15375) + +2013-09-13 Dmitry Antipov <dmantipov@yandex.ru> + + Unify Fx_focus_frame between all ports. + * frame.h (x_focus_frame): New prototype. + * xfns.c (Fx_focus_frame): Remove. + (syms_of_xfns): Do not defsubr it. + (x_focus_frame): X implementation. + * nsfns.m (Fx_focus_frame): Remove. + (syms_of_nsfns): Do not defsubr it. + (x_focus_frame): NS implementation. + * w32term.c (Fx_focus_frame): Remove. + (x_focus_on_frame): Rename to... + (x_focus_frame): W32 implementation. + * w32term.h (x_focus_on_frame): Remove prototype. + * w32fns.c (Fx_focus_frame): Remove. + (syms_of_w32fns): Do not defsubr it. + * frame.c (Fx_focus_frame): Define here. + (syms_of_frame): Defsubr here. + * gtkutil.c (xg_tool_bar_callback): Use x_focus_frame. + +2013-09-13 Dmitry Antipov <dmantipov@yandex.ru> + + Unify FRAME_window_system_DISPLAY_INFO macros between all ports. + All of them are replaced with FRAME_DISPLAY_INFO, defined in + each port to reference the port-specific window system data. + * msdos.h (FRAME_X_DISPLAY_INFO): Remove. + (FRAME_DISPLAY_INFO): Define. + * w32term.h (FRAME_W32_DISPLAY_INFO, FRAME_X_DISPLAY_INFO): Remove. + (FRAME_DISPLAY_INFO): Define. Adjust users. + * xterm.h (FRAME_X_DISPLAY_INFO): Remove. + (FRAME_DISPLAY_INFO): Define. Adjust users. + * frame.h (FRAME_RES_X, FRAME_RES_Y): Unify. + * font.c, frame.c, gtkutil.c, image.c, menu.c, msdos.c, nsfns.m: + * nsfont.m, nsterm.m, w32fns.c, w32font.c, w32menu.c, w32term.c: + * w32xfns.c, widget.c, xdisp.c, xfaces.c, xfns.c, xfont.c, xmenu.c: + * xselect.c, xterm.c: All related users changed. + +2013-09-13 Dmitry Antipov <dmantipov@yandex.ru> + + * xterm.h (x_window_to_frame, x_any_window_to_frame) + (x_menubar_window_to_frame): Remove prototypes. + * xfns.c (x_window_to_frame, x_any_window_to_frame) + (x_menubar_window_to_frame, x_top_window_to_frame): + Move from here... + * xterm.c (x_window_to_frame, x_any_window_to_frame) + (x_menubar_window_to_frame, x_top_window_to_frame): + ...to here and convert all but the last to static. + +2013-09-12 Eli Zaretskii <eliz@gnu.org> + + * lisp.mk (lisp): Add w32-common-fns.elc. + +2013-09-12 Xue Fuqiao <xfq.free@gmail.com> + + * charset.c (char_charset): Document an exception for char-charset. + +2013-09-12 Dmitry Antipov <dmantipov@yandex.ru> + + * xterm.h (x_display_info): New field last_user_time... + * xterm.c (toplevel): ...to replace static last_user_time. + (handle_one_xevent, x_ewmh_activate_frame): Adjust users. + +2013-09-12 Dmitry Antipov <dmantipov@yandex.ru> + + * xterm.c (x_set_scroll_bar_thumb) [USE_LUCID && !HAVE_XAW3D]: Clip + scroll bar values to prevent thumb from disappear and update comment. + +2013-09-11 Glenn Morris <rgm@gnu.org> + + * emacs.c (usage_message): Possessive apostrophe tweak. + +2013-09-11 Dmitry Antipov <dmantipov@yandex.ru> + + * nsterm.m (syms_of_nsterm): Use Qns. + * w32fns.c (Fx_open_connection): Remove old '#if 0' code. + * w32term.c (w32_create_terminal, syms_of_w32term): Use Qw32. + * xfns.c (x_display_info_for_name, Fx_open_connection): + Remove old '#if 0' code. + (syms_of_xfns): Use Qx. + * termhooks.h (fullscreen_hook): Remove the leftover. + (struct terminal): Fix typo in comment. + +2013-09-11 Dmitry Antipov <dmantipov@yandex.ru> + + Cleaning up a few X scroll bar bits. + * termhooks.h (enum scroll_bar_part): Add scroll_bar_nowhere member. + * xterm.h (struct scroll_bar) [USE_TOOLKIT_SCROLL_BARS && USE_LUCID]: + New member last_seen_part, going to replace... + * xterm.c [USE_TOOLKIT_SCROLL_BARS]: ...global last_scroll_bar_part. + (xt_action_hook) [USE_LUCID]: Adjust user. + (xm_scroll_callback, xg_scroll_callback): Do not bloat with + Lucid-specific scroll bar support. + (xaw_jump_callback, xaw_scroll_callback): Prefer enum scroll_par_part + to int and adjust to use last_seen_part member. + (x_set_toolkit_scroll_bar_thumb) [USE_LUCID]: Adjust user. + (x_scroll_bar_create) [USE_TOOLKIT_SCROLL_BARS && USE_LUCID]: + Initialize last_seen_part. + +2013-09-11 Stefan Monnier <monnier@iro.umontreal.ca> + + * insdel.c (insert_from_buffer_1): Don't mark buffer as modified when + insert-buffer-substring an empty string. + +2013-09-11 Paul Eggert <eggert@cs.ucla.edu> + + * xdisp.c (Ftool_bar_lines_needed): Declare as 'const' if ifdeffed out, + avoiding a GCC warning. + +2013-09-11 Dmitry Antipov <dmantipov@yandex.ru> + + Ifdef away frame tool bar code when it is not really used. + * frame.h (struct frame) [HAVE_WINDOW_SYSTEM && !USE_GTK && !HAVE_NS]: + Move tool_bar_window, desired_tool_bar_string, current_tool_bar_string + and minimize_tool_bar_window_p under the above. + (fset_current_tool_bar_string, fset_desired_tool_bar_string) + (fset_tool_bar_window): Likewise. + * dispnew.c (clear_current_matrices, clear_desired_matrices) + (adjust_frame_glyphs_for_window_redisplay, free_glyphs, update_frame) + (change_frame_size_1): + * window.c (window_from_coordinates, Frecenter): Adjust users. + * window.h (WINDOW_TOOL_BAR_P): Define to zero when frame tool bar + code is not really used. + * xdisp.c (build_desired_tool_bar_string, display_tool_bar_line) + (tool_bar_lines_needed, MAX_FRAME_TOOL_BAR_HEIGHT, tool_bar_item_info) + (get_tool_bar_item, handle_tool_bar_click, note_tool_bar_highlight) + [!USE_GTK && !HAVE_NS]: Define as such. + (Ftool_bar_lines_needed, redisplay_tool_bar, show_mouse_face) + (note_mouse_highlight, expose_frame): + * xfns.c (x_set_tool_bar_lines): + * xterm.c (handle_one_xevent): Adjust users. + +2013-09-11 Paul Eggert <eggert@cs.ucla.edu> + + Fix corruption with multiple emacsclient -t instances (Bug#15222). + This bug was introduced by my 2013-08-26 patch, which incorrectly + assumed that the terminfo implementation doesn't use termcap buffers. + * term.c (init_tty) [TERMINFO]: Remove optimization, as + these buffers apparently are used after all. + * termchar.h (TERMCAP_BUFFER_SIZE) [TERMINFO]: Define here too. + (struct tty_display_info): Define members termcap_term_buffer and + termcap_strings_buffer even if TERMINFO. + +2013-09-11 Dmitry Antipov <dmantipov@yandex.ru> + + Fix last change. + * data.c (Feqlsign, Flss, Fgtr, Fleq, Fgeq): Add convenient + 'usage' docstring entry to pacify make-docfile. + +2013-09-11 Barry O'Reilly <gundaetiapo@gmail.com> + + Change comparison functions =, <, >, <=, >= to take many arguments. + * data.c: Change comparison functions' interface and implementation. + * lisp.h: Make arithcompare available for efficient two arg + comparisons. + * bytecode.c: Use arithcompare. + * fileio.c: Use new interface. + +2013-09-11 Stefan Monnier <monnier@iro.umontreal.ca> + + * keyboard.c (read_char): Don't break immediate_echo (bug#15332). + +2013-09-10 Stefan Monnier <monnier@iro.umontreal.ca> + + * eval.c (Feval): Document the new use of `lexical'. + +2013-09-09 Dmitry Antipov <dmantipov@yandex.ru> + + Review and drop old frame resize hack. + * frame.h (struct frame): Remove force_flush_display_p. + * dispnew.c (update_frame): Adjust user and don't call + flush_frame here. The comment has said that there was an issues + with redisplaying fringes, but I don't see any differences with + and without this hack. Hopefully we can continue without it. + * xdisp.c (clear_garbaged_frames): Adjust user and do not clear + current frame matrices twice if resized_p is set. + +2013-09-09 Dmitry Antipov <dmantipov@yandex.ru> + + Do not populate pure Xism x_sync to other ports. + * frame.h (x_sync): Move under HAVE_X_WINDOWS. + * frame.c (other_visible_frames) [HAVE_X_WINDOWS]: Use as such. + * nsfns.m, w32xfns.c (x_sync): Remove no-op. + * w32term.h (x_sync): Remove prototype. + +2013-09-09 Dmitry Antipov <dmantipov@yandex.ru> + + Cleanup frame flushing. + * dispextern.h (struct redisplay_interface): + Drop flush_display_optional because flush_display is enough + for X and flushing via RIF is just a no-op for others. + * frame.h (flush_frame): New function. + * dispnew.c (update_frame): + * minibuf.c (read_minibuf): + * xdisp.c (echo_area_display, redisplay_preserve_echo_area): + Use it. + * keyboard.c (detect_input_pending_run_timers): Do not flush + all frames but selected one in redisplay_preserve_echo_area. + * nsterm.m (ns_flush): Remove no-op. + (ns_redisplay_interface): Adjust user. + * w32term.h (x_flush): Remove no-op. + (w32_redisplay_interface): Adjust user. + * xterm.c (x_flush): Simplify because we do not flush all + frames at once any more. Adjust comment. + (x_redisplay_interface): Adjust user. + +2013-09-07 Paul Eggert <eggert@cs.ucla.edu> + + Port --without-x --enable-gcc-warnings to Fedora 19. + * gfilenotify.c (globals_of_gfilenotify): + Call g_type_init only if using an older glib version that needs it. + +2013-09-06 Dmitry Antipov <dmantipov@yandex.ru> + + * lisp.h (last_glyphless_glyph_frame, last_glyphless_glyph_face_id) + (last_glyphless_glyph_merged_face_id): Remove declarations. + * dispextern.h (merge_glyphless_glyph_face): Add prototype. + * xdisp.c (last_glyphless_glyph_frame, last_glyphless_glyph_face_id) + (last_glyphless_glyph_merged_face_id): Now static. + (merge_escape_glyph_face): New function, refactored from... + (get_next_display_element): ...here. + (merge_glyphless_glyph_face): New function, refactored from... + (produce_glyphless_glyph): ...here... + * term.c (produce_glyphless_glyph): ...and here. + +2013-09-06 Stefan Monnier <monnier@iro.umontreal.ca> + + * eval.c (eval_sub): Only call Ffunction if necessary. + +2013-09-06 Dmitry Antipov <dmantipov@yandex.ru> + + Attempt to make redisplay more selective when changing cursor type. + * frame.h (struct frame): New bitfield cursor_type_changed. + * xdisp.c (cursor_type_changed): Remove. + (try_cursor_movement, redisplay_window, try_window_id) + (set_frame_cursor_types, try_window_reusing_current_matrix): + Adjust to use per-frame bitfield. + (redisplay_internal): Look for cursor type change on each visible + frame and consider all frames if cursor type has been changed on + the frame other than selected. If cursor type has been changed on + selected frame only, do not use fast update. + +2013-09-06 Dmitry Antipov <dmantipov@yandex.ru> + + Attempt to make redisplay more selective when changing fonts. + * frame.h (struct frame): New bitfield fonts_changed. + * dispextern.h (fonts_changed_p, adjust_glyphs): Remove declaration. + (adjust_frame_glyphs): Add prototype. + * dispnew.c (fonts_changed_p): Remove. + (adjust_glyphs): Remove because we do not + adjust matrices on all frames at once any more. + (adjust_frame_glyphs): Block and unblock input here. + (adjust_glyph_matrix): Use fonts_changed. + (change_frame_size_1): Use adjust_frame_glyphs. + * font.c (font_open_entity): Use fonts_changed. + * frame.c (set_menu_bar_lines, Fmake_terminal_frame): + * w32fns.c (x_set_menu_bar_lines, x_set_tool_bar_lines, Fx_show_tip): + * window.c (Fdelete_other_windows_internal, Fwindow_resize_apply) + (Fsplit_window_internal, Fdelete_window_internal, grow_mini_window) + (shrink_mini_window, Fresize_mini_window_internal) + (window_scroll_pixel_based, Fset_window_configuration) + (apply_window_adjustment, Fset_window_vscroll): + * xfns.c (x_set_menu_bar_lines, x_set_tool_bar_lines, Fx_show_tip): + Use adjust_frame_glyphs. + * xdisp.c (redisplay_tool_bar, redisplay_window, try_window) + (try_window_reusing_current_matrix, try_window_id, display_line) + (IT_EXPAND_MATRIX_WIDTH): Use fonts_changed. + (redisplay_internal): Consider fonts_changed and adjust frame + matrices for each frame only if the frame is visible. If font + has been changed on some frame during full redisplay, retry + only visible frames where the font has been actually changed. + +2013-09-05 Dmitry Antipov <dmantipov@yandex.ru> + + Cache current header and mode line height for each window. + * window.h (struct window): New fields mode_line_height + and header_line_height. + * window.c (make_window): Initialize them. + * dispextern.h (CURRENT_MODE_LINE_HEIGHT) + (CURRENT_HEADER_LINE_HEIGHT): Use them. Adjust comment. + (current_mode_line_height, current_header_line_height): + Remove declaration. + * xdisp.c (current_mode_line_height, current_header_line_height): + Remove. + (pos_visible_p, init_xdisp): Adjust user. + (redisplay_window): Invalidate mode_line_height and + header_line_height if current and desired matrices do not agree. + +2013-09-05 Dmitry Antipov <dmantipov@yandex.ru> + + * fontset.c, window.c, xdisp.c (toplevel): Use TERM_HEADER. + * xfaces.c (toplevel) [HAVE_X_WINDOWS]: Do not include xterm.h twice. + 2013-09-05 Dmitry Antipov <dmantipov@yandex.ru> Make --without-x compatible with --enable-gcc-warnings. diff --git a/src/Makefile.in b/src/Makefile.in index fe8d2d13ce0..254aa175d49 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -266,7 +266,7 @@ MSDOS_OBJ = MSDOS_X_OBJ = NS_OBJ=@NS_OBJ@ -## nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o if HAVE_NS. +## nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o macfont.o if HAVE_NS. NS_OBJC_OBJ=@NS_OBJC_OBJ@ ## Only set if NS_IMPL_GNUSTEP. GNU_OBJC_CFLAGS=@GNU_OBJC_CFLAGS@ @@ -388,7 +388,7 @@ obj = $(base_obj) $(NS_OBJC_OBJ) SOME_MACHINE_OBJECTS = dosfns.o msdos.o \ xterm.o xfns.o xmenu.o xselect.o xrdb.o xsmfns.o fringe.o image.o \ fontset.o dbusbind.o cygw32.o \ - nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o \ + nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o macfont.o \ w32.o w32console.o w32fns.o w32heap.o w32inevt.o w32notify.o \ w32menu.o w32proc.o w32reg.o w32select.o w32term.o w32xfns.o \ w16select.o widget.o xfont.o ftfont.o xftfont.o ftxfont.o gtkutil.o \ diff --git a/src/alloc.c b/src/alloc.c index a8cbee1cf36..621693fc096 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -20,8 +20,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> -#define LISP_INLINE EXTERN_INLINE - #include <stdio.h> #include <limits.h> /* For CHAR_BIT. */ @@ -47,6 +45,18 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <verify.h> +#if (defined ENABLE_CHECKING \ + && defined HAVE_VALGRIND_VALGRIND_H \ + && !defined USE_VALGRIND) +# define USE_VALGRIND 1 +#endif + +#if USE_VALGRIND +#include <valgrind/valgrind.h> +#include <valgrind/memcheck.h> +static bool valgrind_p; +#endif + /* GC_CHECK_MARKED_OBJECTS means do sanity checks on allocated objects. Doable only if GC_MARK_STACK. */ #if ! GC_MARK_STACK @@ -971,7 +981,7 @@ struct ablocks #define ABLOCKS_BASE(abase) (abase) #else #define ABLOCKS_BASE(abase) \ - (1 & (intptr_t) ABLOCKS_BUSY (abase) ? abase : ((void**)abase)[-1]) + (1 & (intptr_t) ABLOCKS_BUSY (abase) ? abase : ((void **)abase)[-1]) #endif /* The list of free ablock. */ @@ -1026,7 +1036,7 @@ lisp_align_malloc (size_t nbytes, enum mem_type type) aligned = (base == abase); if (!aligned) - ((void**)abase)[-1] = base; + ((void **) abase)[-1] = base; #ifdef DOUG_LEA_MALLOC /* Back to a reasonable maximum of mmap'ed areas. */ @@ -2003,6 +2013,34 @@ INIT must be an integer that represents a character. */) return val; } +verify (sizeof (size_t) * CHAR_BIT == BITS_PER_SIZE_T); +verify ((BITS_PER_SIZE_T & (BITS_PER_SIZE_T - 1)) == 0); + +static ptrdiff_t +bool_vector_payload_bytes (ptrdiff_t nr_bits, + ptrdiff_t *exact_needed_bytes_out) +{ + ptrdiff_t exact_needed_bytes; + ptrdiff_t needed_bytes; + + eassert_and_assume (nr_bits >= 0); + + exact_needed_bytes = ROUNDUP ((size_t) nr_bits, CHAR_BIT) / CHAR_BIT; + needed_bytes = ROUNDUP ((size_t) nr_bits, BITS_PER_SIZE_T) / CHAR_BIT; + + if (needed_bytes == 0) + { + /* Always allocate at least one machine word of payload so that + bool-vector operations in data.c don't need a special case + for empty vectors. */ + needed_bytes = sizeof (size_t); + } + + if (exact_needed_bytes_out != NULL) + *exact_needed_bytes_out = exact_needed_bytes; + + return needed_bytes; +} DEFUN ("make-bool-vector", Fmake_bool_vector, Smake_bool_vector, 2, 2, 0, doc: /* Return a new bool-vector of length LENGTH, using INIT for each element. @@ -2011,37 +2049,43 @@ LENGTH must be a number. INIT matters only in whether it is t or nil. */) { register Lisp_Object val; struct Lisp_Bool_Vector *p; - ptrdiff_t length_in_chars; - EMACS_INT length_in_elts; - int bits_per_value; - int extra_bool_elts = ((bool_header_size - header_size + word_size - 1) - / word_size); + ptrdiff_t exact_payload_bytes; + ptrdiff_t total_payload_bytes; + ptrdiff_t needed_elements; CHECK_NATNUM (length); + if (PTRDIFF_MAX < XFASTINT (length)) + memory_full (SIZE_MAX); - bits_per_value = sizeof (EMACS_INT) * BOOL_VECTOR_BITS_PER_CHAR; + total_payload_bytes = bool_vector_payload_bytes + (XFASTINT (length), &exact_payload_bytes); - length_in_elts = (XFASTINT (length) + bits_per_value - 1) / bits_per_value; + eassert_and_assume (exact_payload_bytes <= total_payload_bytes); + eassert_and_assume (0 <= exact_payload_bytes); - val = Fmake_vector (make_number (length_in_elts + extra_bool_elts), Qnil); + needed_elements = ROUNDUP ((size_t) ((bool_header_size - header_size) + + total_payload_bytes), + word_size) / word_size; - /* No Lisp_Object to trace in there. */ + p = (struct Lisp_Bool_Vector *) allocate_vector (needed_elements); + XSETVECTOR (val, p); XSETPVECTYPESIZE (XVECTOR (val), PVEC_BOOL_VECTOR, 0, 0); - p = XBOOL_VECTOR (val); p->size = XFASTINT (length); - - length_in_chars = ((XFASTINT (length) + BOOL_VECTOR_BITS_PER_CHAR - 1) - / BOOL_VECTOR_BITS_PER_CHAR); - if (length_in_chars) + if (exact_payload_bytes) { - memset (p->data, ! NILP (init) ? -1 : 0, length_in_chars); + memset (p->data, ! NILP (init) ? -1 : 0, exact_payload_bytes); /* Clear any extraneous bits in the last byte. */ - p->data[length_in_chars - 1] + p->data[exact_payload_bytes - 1] &= (1 << ((XFASTINT (length) - 1) % BOOL_VECTOR_BITS_PER_CHAR + 1)) - 1; } + /* Clear padding at the end. */ + memset (p->data + exact_payload_bytes, + 0, + total_payload_bytes - exact_payload_bytes); + return val; } @@ -2567,24 +2611,22 @@ enum roundup_size = COMMON_MULTIPLE (word_size, USE_LSB_TAG ? GCALIGNMENT : 1) }; -/* ROUNDUP_SIZE must be a power of 2. */ -verify ((roundup_size & (roundup_size - 1)) == 0); - /* Verify assumptions described above. */ verify ((VECTOR_BLOCK_SIZE % roundup_size) == 0); verify (VECTOR_BLOCK_SIZE <= (1 << PSEUDOVECTOR_SIZE_BITS)); -/* Round up X to nearest mult-of-ROUNDUP_SIZE. */ - -#define vroundup(x) (((x) + (roundup_size - 1)) & ~(roundup_size - 1)) +/* Round up X to nearest mult-of-ROUNDUP_SIZE --- use at compile time. */ +#define vroundup_ct(x) ROUNDUP ((size_t) (x), roundup_size) +/* Round up X to nearest mult-of-ROUNDUP_SIZE --- use at runtime. */ +#define vroundup(x) (assume ((x) >= 0), vroundup_ct (x)) /* Rounding helps to maintain alignment constraints if USE_LSB_TAG. */ -#define VECTOR_BLOCK_BYTES (VECTOR_BLOCK_SIZE - vroundup (sizeof (void *))) +#define VECTOR_BLOCK_BYTES (VECTOR_BLOCK_SIZE - vroundup_ct (sizeof (void *))) /* Size of the minimal vector allocated from block. */ -#define VBLOCK_BYTES_MIN vroundup (header_size + sizeof (Lisp_Object)) +#define VBLOCK_BYTES_MIN vroundup_ct (header_size + sizeof (Lisp_Object)) /* Size of the largest vector allocated from block. */ @@ -2605,22 +2647,6 @@ verify (VECTOR_BLOCK_SIZE <= (1 << PSEUDOVECTOR_SIZE_BITS)); #define VINDEX(nbytes) (((nbytes) - VBLOCK_BYTES_MIN) / roundup_size) -/* Get and set the next field in block-allocated vectorlike objects on - the free list. Doing it this way respects C's aliasing rules. - We could instead make 'contents' a union, but that would mean - changes everywhere that the code uses 'contents'. */ -static struct Lisp_Vector * -next_in_free_list (struct Lisp_Vector *v) -{ - intptr_t i = XLI (v->contents[0]); - return (struct Lisp_Vector *) i; -} -static void -set_next_in_free_list (struct Lisp_Vector *v, struct Lisp_Vector *next) -{ - v->contents[0] = XIL ((intptr_t) next); -} - /* Common shortcut to setup vector on a free list. */ #define SETUP_ON_FREE_LIST(v, nbytes, tmp) \ @@ -2630,7 +2656,7 @@ set_next_in_free_list (struct Lisp_Vector *v, struct Lisp_Vector *next) eassert ((nbytes) % roundup_size == 0); \ (tmp) = VINDEX (nbytes); \ eassert ((tmp) < VECTOR_MAX_FREE_LIST_INDEX); \ - set_next_in_free_list (v, vector_free_lists[tmp]); \ + v->u.next = vector_free_lists[tmp]; \ vector_free_lists[tmp] = (v); \ total_free_vector_slots += (nbytes) / word_size; \ } while (0) @@ -2644,7 +2670,7 @@ struct large_vector struct large_vector *vector; #if USE_LSB_TAG /* We need to maintain ROUNDUP_SIZE alignment for the vector member. */ - unsigned char c[vroundup (sizeof (struct large_vector *))]; + unsigned char c[vroundup_ct (sizeof (struct large_vector *))]; #endif } next; struct Lisp_Vector v; @@ -2727,7 +2753,7 @@ allocate_vector_from_block (size_t nbytes) if (vector_free_lists[index]) { vector = vector_free_lists[index]; - vector_free_lists[index] = next_in_free_list (vector); + vector_free_lists[index] = vector->u.next; total_free_vector_slots -= nbytes / word_size; return vector; } @@ -2741,7 +2767,7 @@ allocate_vector_from_block (size_t nbytes) { /* This vector is larger than requested. */ vector = vector_free_lists[index]; - vector_free_lists[index] = next_in_free_list (vector); + vector_free_lists[index] = vector->u.next; total_free_vector_slots -= nbytes / word_size; /* Excess bytes are used for the smaller vector, @@ -2785,10 +2811,14 @@ vector_nbytes (struct Lisp_Vector *v) if (size & PSEUDOVECTOR_FLAG) { if (PSEUDOVECTOR_TYPEP (&v->header, PVEC_BOOL_VECTOR)) - size = (bool_header_size - + (((struct Lisp_Bool_Vector *) v)->size - + BOOL_VECTOR_BITS_PER_CHAR - 1) - / BOOL_VECTOR_BITS_PER_CHAR); + { + struct Lisp_Bool_Vector *bv = (struct Lisp_Bool_Vector *) v; + ptrdiff_t payload_bytes = + bool_vector_payload_bytes (bv->size, NULL); + + eassert_and_assume (payload_bytes >= 0); + size = bool_header_size + ROUNDUP (payload_bytes, word_size); + } else size = (header_size + ((size & PSEUDOVECTOR_SIZE_MASK) @@ -2859,7 +2889,7 @@ sweep_vectors (void) free_this_block = 1; else { - int tmp; + size_t tmp; SETUP_ON_FREE_LIST (vector, total_bytes, tmp); } } @@ -2888,17 +2918,11 @@ sweep_vectors (void) total_vectors++; if (vector->header.size & PSEUDOVECTOR_FLAG) { - struct Lisp_Bool_Vector *b = (struct Lisp_Bool_Vector *) vector; - /* All non-bool pseudovectors are small enough to be allocated from vector blocks. This code should be redesigned if some pseudovector type grows beyond VBLOCK_BYTES_MAX. */ eassert (PSEUDOVECTOR_TYPEP (&vector->header, PVEC_BOOL_VECTOR)); - - total_vector_slots - += (bool_header_size - + ((b->size + BOOL_VECTOR_BITS_PER_CHAR - 1) - / BOOL_VECTOR_BITS_PER_CHAR)) / word_size; + total_vector_slots += vector_nbytes (vector) / word_size; } else total_vector_slots @@ -2941,7 +2965,7 @@ allocate_vectorlike (ptrdiff_t len) else { struct large_vector *lv - = lisp_malloc ((offsetof (struct large_vector, v.contents) + = lisp_malloc ((offsetof (struct large_vector, v.u.contents) + len * word_size), MEM_TYPE_VECTORLIKE); lv->next.vector = large_vectors; @@ -2995,7 +3019,7 @@ allocate_pseudovector (int memlen, int lisplen, enum pvec_type tag) /* Only the first lisplen slots will be traced normally by the GC. */ for (i = 0; i < lisplen; ++i) - v->contents[i] = Qnil; + v->u.contents[i] = Qnil; XSETPVECTYPESIZE (v, tag, lisplen, memlen - lisplen); return v; @@ -3083,7 +3107,7 @@ See also the function `vector'. */) p = allocate_vector (XFASTINT (length)); sizei = XFASTINT (length); for (i = 0; i < sizei; i++) - p->contents[i] = init; + p->u.contents[i] = init; XSETVECTOR (vector, p); return vector; @@ -3101,21 +3125,23 @@ usage: (vector &rest OBJECTS) */) register struct Lisp_Vector *p = XVECTOR (val); for (i = 0; i < nargs; i++) - p->contents[i] = args[i]; + p->u.contents[i] = args[i]; return val; } void make_byte_code (struct Lisp_Vector *v) { - if (v->header.size > 1 && STRINGP (v->contents[1]) - && STRING_MULTIBYTE (v->contents[1])) + /* Don't allow the global zero_vector to become a byte code object. */ + eassert(0 < v->header.size); + if (v->header.size > 1 && STRINGP (v->u.contents[1]) + && STRING_MULTIBYTE (v->u.contents[1])) /* BYTECODE-STRING must have been produced by Emacs 20.2 or the earlier because they produced a raw 8-bit string for byte-code and now such a byte-code string is loaded as multibyte while raw 8-bit characters converted to multibyte form. Thus, now we must convert them back to the original unibyte form. */ - v->contents[1] = Fstring_as_unibyte (v->contents[1]); + v->u.contents[1] = Fstring_as_unibyte (v->u.contents[1]); XSETPVECTYPE (v, PVEC_COMPILED); } @@ -3150,7 +3176,7 @@ usage: (make-byte-code ARGLIST BYTE-CODE CONSTANTS DEPTH &optional DOCSTRING INT to be setcar'd). */ for (i = 0; i < nargs; i++) - p->contents[i] = args[i]; + p->u.contents[i] = args[i]; make_byte_code (p); XSETCOMPILED (val, p); return val; @@ -4296,6 +4322,11 @@ mark_maybe_object (Lisp_Object obj) void *po; struct mem_node *m; +#if USE_VALGRIND + if (valgrind_p) + VALGRIND_MAKE_MEM_DEFINED (&obj, sizeof (obj)); +#endif + if (INTEGERP (obj)) return; @@ -4364,6 +4395,11 @@ mark_maybe_pointer (void *p) { struct mem_node *m; +#if USE_VALGRIND + if (valgrind_p) + VALGRIND_MAKE_MEM_DEFINED (&p, sizeof (p)); +#endif + /* Quickly rule out some values which can't point to Lisp data. USE_LSB_TAG needs Lisp data to be aligned on multiples of GCALIGNMENT. Otherwise, assume that Lisp data is aligned on even addresses. */ @@ -5131,7 +5167,7 @@ Does not copy symbols. Copies strings without text properties. */) size &= PSEUDOVECTOR_SIZE_MASK; vec = XVECTOR (make_pure_vector (size)); for (i = 0; i < size; i++) - vec->contents[i] = Fpurecopy (AREF (obj, i)); + vec->u.contents[i] = Fpurecopy (AREF (obj, i)); if (COMPILEDP (obj)) { XSETPVECTYPE (vec, PVEC_COMPILED); @@ -5622,7 +5658,7 @@ mark_vectorlike (struct Lisp_Vector *ptr) The distinction is used e.g. by Lisp_Process which places extra non-Lisp_Object fields at the end of the structure... */ for (i = 0; i < size; i++) /* ...and then mark its elements. */ - mark_object (ptr->contents[i]); + mark_object (ptr->u.contents[i]); } /* Like mark_vectorlike but optimized for char-tables (and @@ -5639,7 +5675,7 @@ mark_char_table (struct Lisp_Vector *ptr) VECTOR_MARK (ptr); for (i = 0; i < size; i++) { - Lisp_Object val = ptr->contents[i]; + Lisp_Object val = ptr->u.contents[i]; if (INTEGERP (val) || (SYMBOLP (val) && XSYMBOL (val)->gcmarkbit)) continue; @@ -5844,10 +5880,10 @@ mark_object (Lisp_Object arg) VECTOR_MARK (ptr); for (i = 0; i < size; i++) if (i != COMPILED_CONSTANTS) - mark_object (ptr->contents[i]); + mark_object (ptr->u.contents[i]); if (size > COMPILED_CONSTANTS) { - obj = ptr->contents[COMPILED_CONSTANTS]; + obj = ptr->u.contents[COMPILED_CONSTANTS]; goto loop; } } @@ -6612,6 +6648,10 @@ init_alloc (void) #endif Vgc_elapsed = make_float (0.0); gcs_done = 0; + +#if USE_VALGRIND + valgrind_p = RUNNING_ON_VALGRIND != 0; +#endif } void diff --git a/src/bidi.c b/src/bidi.c index 7d082a94997..dc905cd9e5f 100644 --- a/src/bidi.c +++ b/src/bidi.c @@ -870,8 +870,8 @@ bidi_line_init (struct bidi_it *bidi_it) are zero-based character positions in S, BEGBYTE is byte position corresponding to BEG. UNIBYTE means S is a unibyte string. */ static ptrdiff_t -bidi_count_bytes (const unsigned char *s, const ptrdiff_t beg, - const ptrdiff_t begbyte, const ptrdiff_t end, bool unibyte) +bidi_count_bytes (const unsigned char *s, ptrdiff_t beg, + ptrdiff_t begbyte, ptrdiff_t end, bool unibyte) { ptrdiff_t pos = beg; const unsigned char *p = s + begbyte, *start = p; diff --git a/src/blockinput.h b/src/blockinput.h index 6dc22c6f5dd..8f1b1e18985 100644 --- a/src/blockinput.h +++ b/src/blockinput.h @@ -20,9 +20,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #define EMACS_BLOCKINPUT_H INLINE_HEADER_BEGIN -#ifndef BLOCKINPUT_INLINE -# define BLOCKINPUT_INLINE INLINE -#endif /* Emacs should avoid doing anything hairy in a signal handler, because so many system functions are non-reentrant. For example, malloc @@ -52,7 +49,7 @@ extern volatile int interrupt_input_blocked; /* Begin critical section. */ -BLOCKINPUT_INLINE void +INLINE void block_input (void) { interrupt_input_blocked++; @@ -64,7 +61,7 @@ extern void unblock_input_to (int); /* In critical section ? */ -BLOCKINPUT_INLINE bool +INLINE bool input_blocked_p (void) { return interrupt_input_blocked > 0; diff --git a/src/buffer.c b/src/buffer.c index 0bcb608dbd3..1570f3831ac 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -20,8 +20,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> -#define BUFFER_INLINE EXTERN_INLINE - #include <sys/types.h> #include <sys/stat.h> #include <sys/param.h> @@ -4536,7 +4534,7 @@ report_overlay_modification (Lisp_Object start, Lisp_Object end, bool after, Lisp_Object *copy = alloca (size * sizeof *copy); ptrdiff_t i; - memcpy (copy, XVECTOR (last_overlay_modification_hooks)->contents, + memcpy (copy, XVECTOR (last_overlay_modification_hooks)->u.contents, size * word_size); gcpro1.var = copy; gcpro1.nvars = size; @@ -5900,7 +5898,7 @@ See also the functions `display-table-slot' and `set-display-table-slot'. */); DEFVAR_PER_BUFFER ("left-margin-width", &BVAR (current_buffer, left_margin_cols), Qintegerp, - doc: /* Width of left marginal area for display of a buffer. + doc: /* Width in columns of left marginal area for display of a buffer. A value of nil means no marginal area. Setting this variable does not take effect until a new buffer is displayed @@ -5908,7 +5906,7 @@ in a window. To make the change take effect, call `set-window-buffer'. */); DEFVAR_PER_BUFFER ("right-margin-width", &BVAR (current_buffer, right_margin_cols), Qintegerp, - doc: /* Width of right marginal area for display of a buffer. + doc: /* Width in columns of right marginal area for display of a buffer. A value of nil means no marginal area. Setting this variable does not take effect until a new buffer is displayed diff --git a/src/buffer.h b/src/buffer.h index 169a15c7d0f..a36c0d13c9e 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -22,9 +22,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <time.h> INLINE_HEADER_BEGIN -#ifndef BUFFER_INLINE -# define BUFFER_INLINE INLINE -#endif /* Accessing the parameters of the current buffer. */ @@ -875,97 +872,97 @@ struct buffer /* Most code should use these functions to set Lisp fields in struct buffer. */ -BUFFER_INLINE void +INLINE void bset_bidi_paragraph_direction (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (bidi_paragraph_direction) = val; } -BUFFER_INLINE void +INLINE void bset_case_canon_table (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (case_canon_table) = val; } -BUFFER_INLINE void +INLINE void bset_case_eqv_table (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (case_eqv_table) = val; } -BUFFER_INLINE void +INLINE void bset_directory (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (directory) = val; } -BUFFER_INLINE void +INLINE void bset_display_count (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (display_count) = val; } -BUFFER_INLINE void +INLINE void bset_display_time (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (display_time) = val; } -BUFFER_INLINE void +INLINE void bset_downcase_table (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (downcase_table) = val; } -BUFFER_INLINE void +INLINE void bset_enable_multibyte_characters (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (enable_multibyte_characters) = val; } -BUFFER_INLINE void +INLINE void bset_filename (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (filename) = val; } -BUFFER_INLINE void +INLINE void bset_keymap (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (keymap) = val; } -BUFFER_INLINE void +INLINE void bset_last_selected_window (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (last_selected_window) = val; } -BUFFER_INLINE void +INLINE void bset_local_var_alist (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (local_var_alist) = val; } -BUFFER_INLINE void +INLINE void bset_mark_active (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (mark_active) = val; } -BUFFER_INLINE void +INLINE void bset_point_before_scroll (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (point_before_scroll) = val; } -BUFFER_INLINE void +INLINE void bset_read_only (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (read_only) = val; } -BUFFER_INLINE void +INLINE void bset_truncate_lines (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (truncate_lines) = val; } -BUFFER_INLINE void +INLINE void bset_undo_list (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (undo_list) = val; } -BUFFER_INLINE void +INLINE void bset_upcase_table (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (upcase_table) = val; } -BUFFER_INLINE void +INLINE void bset_width_table (struct buffer *b, Lisp_Object val) { b->INTERNAL_FIELD (width_table) = val; @@ -1089,7 +1086,7 @@ extern void set_buffer_if_live (Lisp_Object); windows than the selected one requires a select_window at some time, and that increments windows_or_buffers_changed. */ -BUFFER_INLINE void +INLINE void set_buffer_internal (struct buffer *b) { if (current_buffer != b) @@ -1099,7 +1096,7 @@ set_buffer_internal (struct buffer *b) /* Arrange to go back to the original buffer after the next call to unbind_to if the original buffer is still alive. */ -BUFFER_INLINE void +INLINE void record_unwind_current_buffer (void) { record_unwind_protect (set_buffer_if_live, Fcurrent_buffer ()); @@ -1138,7 +1135,7 @@ extern Lisp_Object Qpriority, Qbefore_string, Qafter_string; /* Get text properties of B. */ -BUFFER_INLINE INTERVAL +INLINE INTERVAL buffer_intervals (struct buffer *b) { eassert (b->text != NULL); @@ -1147,7 +1144,7 @@ buffer_intervals (struct buffer *b) /* Set text properties of B to I. */ -BUFFER_INLINE void +INLINE void set_buffer_intervals (struct buffer *b, INTERVAL i) { eassert (b->text != NULL); @@ -1156,7 +1153,7 @@ set_buffer_intervals (struct buffer *b, INTERVAL i) /* Non-zero if current buffer has overlays. */ -BUFFER_INLINE bool +INLINE bool buffer_has_overlays (void) { return current_buffer->overlays_before || current_buffer->overlays_after; @@ -1176,7 +1173,7 @@ buffer_has_overlays (void) the buffer to the next character after fetching this one. Instead, use either FETCH_CHAR_ADVANCE or STRING_CHAR_AND_LENGTH. */ -BUFFER_INLINE int +INLINE int FETCH_MULTIBYTE_CHAR (ptrdiff_t pos) { unsigned char *p = ((pos >= GPT_BYTE ? GAP_SIZE : 0) @@ -1188,7 +1185,7 @@ FETCH_MULTIBYTE_CHAR (ptrdiff_t pos) If POS doesn't point the head of valid multi-byte form, only the byte at POS is returned. No range checking. */ -BUFFER_INLINE int +INLINE int BUF_FETCH_MULTIBYTE_CHAR (struct buffer *buf, ptrdiff_t pos) { unsigned char *p @@ -1199,7 +1196,7 @@ BUF_FETCH_MULTIBYTE_CHAR (struct buffer *buf, ptrdiff_t pos) /* Return number of windows showing B. */ -BUFFER_INLINE int +INLINE int buffer_window_count (struct buffer *b) { if (b->base_buffer) @@ -1306,13 +1303,13 @@ extern int last_per_buffer_idx; /* Functions to get and set default value of the per-buffer variable at offset OFFSET in the buffer structure. */ -BUFFER_INLINE Lisp_Object +INLINE Lisp_Object per_buffer_default (int offset) { return *(Lisp_Object *)(offset + (char *) &buffer_defaults); } -BUFFER_INLINE void +INLINE void set_per_buffer_default (int offset, Lisp_Object value) { *(Lisp_Object *)(offset + (char *) &buffer_defaults) = value; @@ -1321,20 +1318,20 @@ set_per_buffer_default (int offset, Lisp_Object value) /* Functions to get and set buffer-local value of the per-buffer variable at offset OFFSET in the buffer structure. */ -BUFFER_INLINE Lisp_Object +INLINE Lisp_Object per_buffer_value (struct buffer *b, int offset) { return *(Lisp_Object *)(offset + (char *) b); } -BUFFER_INLINE void +INLINE void set_per_buffer_value (struct buffer *b, int offset, Lisp_Object value) { *(Lisp_Object *)(offset + (char *) b) = value; } /* Downcase a character C, or make no change if that cannot be done. */ -BUFFER_INLINE int +INLINE int downcase (int c) { Lisp_Object downcase_table = BVAR (current_buffer, downcase_table); @@ -1343,10 +1340,10 @@ downcase (int c) } /* 1 if C is upper case. */ -BUFFER_INLINE bool uppercasep (int c) { return downcase (c) != c; } +INLINE bool uppercasep (int c) { return downcase (c) != c; } /* Upcase a character C known to be not upper case. */ -BUFFER_INLINE int +INLINE int upcase1 (int c) { Lisp_Object upcase_table = BVAR (current_buffer, upcase_table); @@ -1355,13 +1352,13 @@ upcase1 (int c) } /* 1 if C is lower case. */ -BUFFER_INLINE bool +INLINE bool lowercasep (int c) { return !uppercasep (c) && upcase1 (c) != c; } /* Upcase a character C, or make no change if that cannot be done. */ -BUFFER_INLINE int upcase (int c) { return uppercasep (c) ? c : upcase1 (c); } +INLINE int upcase (int c) { return uppercasep (c) ? c : upcase1 (c); } INLINE_HEADER_END diff --git a/src/bytecode.c b/src/bytecode.c index e0e7b22ea13..23e50826633 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -536,7 +536,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, #ifdef BYTE_CODE_SAFE bytestr_length = SBYTES (bytestr); #endif - vectorp = XVECTOR (vector)->contents; + vectorp = XVECTOR (vector)->u.contents; stack.byte_string = bytestr; stack.pc = stack.byte_string_start = SDATA (bytestr); @@ -1367,7 +1367,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, Lisp_Object v1; BEFORE_POTENTIAL_GC (); v1 = POP; - TOP = Fgtr (TOP, v1); + TOP = arithcompare (TOP, v1, ARITH_GRTR); AFTER_POTENTIAL_GC (); NEXT; } @@ -1377,7 +1377,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, Lisp_Object v1; BEFORE_POTENTIAL_GC (); v1 = POP; - TOP = Flss (TOP, v1); + TOP = arithcompare (TOP, v1, ARITH_LESS); AFTER_POTENTIAL_GC (); NEXT; } @@ -1387,7 +1387,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, Lisp_Object v1; BEFORE_POTENTIAL_GC (); v1 = POP; - TOP = Fleq (TOP, v1); + TOP = arithcompare (TOP, v1, ARITH_LESS_OR_EQUAL); AFTER_POTENTIAL_GC (); NEXT; } @@ -1397,7 +1397,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, Lisp_Object v1; BEFORE_POTENTIAL_GC (); v1 = POP; - TOP = Fgeq (TOP, v1); + TOP = arithcompare (TOP, v1, ARITH_GRTR_OR_EQUAL); AFTER_POTENTIAL_GC (); NEXT; } diff --git a/src/casetab.c b/src/casetab.c index b6b1c99c39f..69cd784f4cc 100644 --- a/src/casetab.c +++ b/src/casetab.c @@ -205,7 +205,7 @@ set_identity (Lisp_Object table, Lisp_Object c, Lisp_Object elt) from = to = XINT (c); to++; - lint_assume (to <= MAX_CHAR + 1); + assume (to <= MAX_CHAR + 1); for (; from < to; from++) CHAR_TABLE_SET (table, from, make_number (from)); } @@ -232,7 +232,7 @@ shuffle (Lisp_Object table, Lisp_Object c, Lisp_Object elt) from = to = XINT (c); to++; - lint_assume (to <= MAX_CHAR + 1); + assume (to <= MAX_CHAR + 1); for (; from < to; from++) { Lisp_Object tem = Faref (table, elt); diff --git a/src/category.c b/src/category.c index b28978fb721..da5e81e4709 100644 --- a/src/category.c +++ b/src/category.c @@ -30,8 +30,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> -#define CATEGORY_INLINE EXTERN_INLINE - #include "lisp.h" #include "character.h" #include "buffer.h" diff --git a/src/category.h b/src/category.h index 17cd203db45..828dcd1f325 100644 --- a/src/category.h +++ b/src/category.h @@ -54,9 +54,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ But, for the moment, we are not using this slot. */ INLINE_HEADER_BEGIN -#ifndef CATEGORY_INLINE -# define CATEGORY_INLINE INLINE -#endif #define CATEGORYP(x) RANGED_INTEGERP (0x20, x, 0x7E) @@ -84,7 +81,7 @@ INLINE_HEADER_BEGIN >> ((category) % 8)) & 1) /* Return true if category set of CH contains CATEGORY. */ -CATEGORY_INLINE bool +INLINE bool CHAR_HAS_CATEGORY (int ch, int category) { Lisp_Object category_set = CATEGORY_SET (ch); diff --git a/src/ccl.c b/src/ccl.c index 8fec18296a6..d1783c25718 100644 --- a/src/ccl.c +++ b/src/ccl.c @@ -1094,7 +1094,7 @@ ccl_driver (struct ccl_program *ccl, int *source, int *destination, int src_size ccl_prog_stack_struct[stack_idx].ic = ic; ccl_prog_stack_struct[stack_idx].eof_ic = eof_ic; stack_idx++; - ccl_prog = XVECTOR (AREF (slot, 1))->contents; + ccl_prog = XVECTOR (AREF (slot, 1))->u.contents; ic = CCL_HEADER_MAIN; eof_ic = XFASTINT (ccl_prog[CCL_HEADER_EOF]); } @@ -1936,9 +1936,9 @@ setup_ccl_program (struct ccl_program *ccl, Lisp_Object ccl_prog) return -1; vp = XVECTOR (ccl_prog); ccl->size = vp->header.size; - ccl->prog = vp->contents; - ccl->eof_ic = XINT (vp->contents[CCL_HEADER_EOF]); - ccl->buf_magnification = XINT (vp->contents[CCL_HEADER_BUF_MAG]); + ccl->prog = vp->u.contents; + ccl->eof_ic = XINT (vp->u.contents[CCL_HEADER_EOF]); + ccl->buf_magnification = XINT (vp->u.contents[CCL_HEADER_BUF_MAG]); if (ccl->idx >= 0) { Lisp_Object slot; diff --git a/src/character.c b/src/character.c index 6fefb6e8824..9807339a61e 100644 --- a/src/character.c +++ b/src/character.c @@ -29,8 +29,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> #endif -#define CHARACTER_INLINE EXTERN_INLINE - #include <stdio.h> #ifdef emacs diff --git a/src/character.h b/src/character.h index b2cdcb76699..d1b781caa53 100644 --- a/src/character.h +++ b/src/character.h @@ -26,9 +26,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <verify.h> INLINE_HEADER_BEGIN -#ifndef CHARACTER_INLINE -# define CHARACTER_INLINE INLINE -#endif /* character code 1st byte byte sequence -------------- -------- ------------- @@ -558,7 +555,7 @@ INLINE_HEADER_BEGIN #define SANE_TAB_WIDTH(buf) \ sanitize_tab_width (XFASTINT (BVAR (buf, tab_width))) -CHARACTER_INLINE int +INLINE int sanitize_tab_width (EMACS_INT width) { return 0 < width && width <= 1000 ? width : 8; @@ -579,7 +576,7 @@ sanitize_tab_width (EMACS_INT width) /* Return a non-outlandish value for a character width. */ -CHARACTER_INLINE int +INLINE int sanitize_char_width (EMACS_INT width) { return 0 <= width && width <= 1000 ? width : 1000; @@ -680,7 +677,7 @@ extern Lisp_Object string_escape_byte8 (Lisp_Object); /* Return a translation table of id number ID. */ #define GET_TRANSLATION_TABLE(id) \ - (XCDR(XVECTOR(Vtranslation_table_vector)->contents[(id)])) + (XCDR (XVECTOR (Vtranslation_table_vector)->u.contents[(id)])) INLINE_HEADER_END diff --git a/src/charset.c b/src/charset.c index eedf65faa6c..ef040a94605 100644 --- a/src/charset.c +++ b/src/charset.c @@ -26,8 +26,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> -#define CHARSET_INLINE EXTERN_INLINE - #include <errno.h> #include <stdio.h> #include <unistd.h> @@ -2053,6 +2051,8 @@ CH in the charset. */) DEFUN ("char-charset", Fchar_charset, Schar_charset, 1, 2, 0, doc: /* Return the charset of highest priority that contains CH. +ASCII characters are an exception: for them, this function always +returns `ascii'. If optional 2nd arg RESTRICTION is non-nil, it is a list of charsets from which to find the charset. It may also be a coding system. In that case, find the charset from what supported by that coding system. */) diff --git a/src/charset.h b/src/charset.h index d9a5662e520..6e6a8891b4a 100644 --- a/src/charset.h +++ b/src/charset.h @@ -30,9 +30,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <verify.h> INLINE_HEADER_BEGIN -#ifndef CHARSET_INLINE -# define CHARSET_INLINE INLINE -#endif /* Index to arguments of Fdefine_charset_internal. */ @@ -331,7 +328,7 @@ extern int emacs_mule_charset[256]; #define CHARSET_DEUNIFIER(charset) \ (CHARSET_ATTR_DEUNIFIER (CHARSET_ATTRIBUTES (charset))) -CHARSET_INLINE void +INLINE void set_charset_attr (struct charset *charset, enum charset_attr_index idx, Lisp_Object val) { diff --git a/src/chartab.c b/src/chartab.c index b7b9590a538..089c4254da6 100644 --- a/src/chartab.c +++ b/src/chartab.c @@ -1258,7 +1258,7 @@ uniprop_encode_value_character (Lisp_Object table, Lisp_Object value) static Lisp_Object uniprop_encode_value_run_length (Lisp_Object table, Lisp_Object value) { - Lisp_Object *value_table = XVECTOR (XCHAR_TABLE (table)->extras[4])->contents; + Lisp_Object *value_table = XVECTOR (XCHAR_TABLE (table)->extras[4])->u.contents; int i, size = ASIZE (XCHAR_TABLE (table)->extras[4]); for (i = 0; i < size; i++) @@ -1276,7 +1276,7 @@ uniprop_encode_value_run_length (Lisp_Object table, Lisp_Object value) static Lisp_Object uniprop_encode_value_numeric (Lisp_Object table, Lisp_Object value) { - Lisp_Object *value_table = XVECTOR (XCHAR_TABLE (table)->extras[4])->contents; + Lisp_Object *value_table = XVECTOR (XCHAR_TABLE (table)->extras[4])->u.contents; int i, size = ASIZE (XCHAR_TABLE (table)->extras[4]); CHECK_NUMBER (value); diff --git a/src/composite.c b/src/composite.c index 28942fe4f74..4f125522e38 100644 --- a/src/composite.c +++ b/src/composite.c @@ -24,8 +24,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> -#define COMPOSITE_INLINE EXTERN_INLINE - #include "lisp.h" #include "character.h" #include "buffer.h" @@ -268,7 +266,7 @@ get_composition_id (ptrdiff_t charpos, ptrdiff_t bytepos, ptrdiff_t nchars, composition_table = xpalloc (composition_table, &composition_table_size, 1, -1, sizeof *composition_table); - key_contents = XVECTOR (key)->contents; + key_contents = XVECTOR (key)->u.contents; /* Check if the contents of COMPONENTS are valid if COMPONENTS is a vector or a list. It should be a sequence of: @@ -676,7 +674,7 @@ composition_gstring_put_cache (Lisp_Object gstring, ptrdiff_t len) len = j; } - lint_assume (len <= TYPE_MAXIMUM (ptrdiff_t) - 2); + assume (len <= TYPE_MAXIMUM (ptrdiff_t) - 2); copy = Fmake_vector (make_number (len + 2), Qnil); LGSTRING_SET_HEADER (copy, Fcopy_sequence (header)); for (i = 0; i < len; i++) diff --git a/src/composite.h b/src/composite.h index df170093797..b3ea5cd1ed8 100644 --- a/src/composite.h +++ b/src/composite.h @@ -28,9 +28,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "font.h" INLINE_HEADER_BEGIN -#ifndef COMPOSITE_INLINE -# define COMPOSITE_INLINE INLINE -#endif /* Methods to display a sequence of components of a composition. */ enum composition_method { @@ -59,7 +56,7 @@ enum composition_method { They don't check validity of PROP. */ /* Return true if PROP is already registered. */ -COMPOSITE_INLINE bool +INLINE bool composition_registered_p (Lisp_Object prop) { return INTEGERP (XCAR (prop)); @@ -91,8 +88,8 @@ composition_registered_p (Lisp_Object prop) #define COMPOSITION_GLYPH(cmp, n) \ XINT (XVECTOR (XVECTOR (XHASH_TABLE (composition_hash_table) \ ->key_and_value) \ - ->contents[cmp->hash_index * 2]) \ - ->contents[cmp->method == COMPOSITION_WITH_RULE_ALTCHARS \ + ->u.contents[cmp->hash_index * 2]) \ + ->u.contents[cmp->method == COMPOSITION_WITH_RULE_ALTCHARS \ ? (n) * 2 : (n)]) /* Return the encoded composition rule to compose the Nth glyph of @@ -101,8 +98,8 @@ composition_registered_p (Lisp_Object prop) #define COMPOSITION_RULE(cmp, n) \ XINT (XVECTOR (XVECTOR (XHASH_TABLE (composition_hash_table) \ ->key_and_value) \ - ->contents[cmp->hash_index * 2]) \ - ->contents[(n) * 2 - 1]) + ->u.contents[cmp->hash_index * 2]) \ + ->u.contents[(n) * 2 - 1]) /* Decode encoded composition rule RULE_CODE into GREF (global reference point code), NREF (new ref. point code). Don't check RULE_CODE; @@ -207,7 +204,7 @@ extern void compose_text (ptrdiff_t, ptrdiff_t, Lisp_Object, Lisp_Object, /* Return the method of a composition with property PROP. */ -COMPOSITE_INLINE enum composition_method +INLINE enum composition_method composition_method (Lisp_Object prop) { if (composition_registered_p (prop)) @@ -226,7 +223,7 @@ composition_method (Lisp_Object prop) /* Given offsets START and END, return true if PROP is a valid composition property with length END - START. */ -COMPOSITE_INLINE bool +INLINE bool composition_valid_p (ptrdiff_t start, ptrdiff_t end, Lisp_Object prop) { return (CONSP (prop) @@ -262,7 +259,7 @@ composition_valid_p (ptrdiff_t start, ptrdiff_t end, Lisp_Object prop) #define LGSTRING_GLYPH_LEN(lgs) (ASIZE ((lgs)) - 2) #define LGSTRING_GLYPH(lgs, idx) AREF ((lgs), (idx) + 2) #define LGSTRING_SET_GLYPH(lgs, idx, val) ASET ((lgs), (idx) + 2, (val)) -COMPOSITE_INLINE Lisp_Object * +INLINE Lisp_Object * lgstring_glyph_addr (Lisp_Object lgs, ptrdiff_t idx) { return aref_addr (lgs, idx + 2); diff --git a/src/conf_post.h b/src/conf_post.h index 16714076f6f..0786bdfeb33 100644 --- a/src/conf_post.h +++ b/src/conf_post.h @@ -208,11 +208,8 @@ extern void _DebPrint (const char *fmt, ...); [#include any other .h files first.] ... INLINE_HEADER_BEGIN - #ifndef FOO_INLINE - # define FOO_INLINE INLINE - #endif ... - FOO_INLINE int + INLINE int incr (int i) { return i + 1; @@ -220,19 +217,22 @@ extern void _DebPrint (const char *fmt, ...); ... INLINE_HEADER_END - The corresponding foo.c file should do this: + For every executable, exactly one file that includes the header + should do this: - #define FOO_INLINE EXTERN_INLINE + #define INLINE EXTERN_INLINE - before including any .h file other than config.h. - Other .c files should not define FOO_INLINE. + before including config.h or any other .h file. + Other .c files should not define INLINE. C99 compilers compile functions like 'incr' as C99-style extern inline functions. Pre-C99 GCCs do something similar with GNU-specific keywords. Pre-C99 non-GCC compilers use static functions, which bloats the code but is good enough. */ -#define INLINE _GL_INLINE +#ifndef INLINE +# define INLINE _GL_INLINE +#endif #define EXTERN_INLINE _GL_EXTERN_INLINE #define INLINE_HEADER_BEGIN _GL_INLINE_HEADER_BEGIN #define INLINE_HEADER_END _GL_INLINE_HEADER_END @@ -248,16 +248,29 @@ extern void _DebPrint (const char *fmt, ...); # define FLEXIBLE_ARRAY_MEMBER 1 #endif +#ifndef __has_builtin +# define __has_builtin(x) 0 +#endif + +/* Tell the compiler (and lint) that COND will always hold, and that + it should optimize (or check) accordingly. */ +#if (__has_builtin (__builtin_unreachable) \ + || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) || __GNUC__ > 4) +# define assume(cond) ((cond) ? (void) 0 : __builtin_unreachable ()) +#elif defined _MSC_VER +# define assume(cond) __assume (cond) +#elif defined lint +# define assume(cond) ((cond) ? (void) 0 : abort ()) +#else +# define assume(cond) ((void) (0 && (cond))) +#endif + /* Use this to suppress gcc's `...may be used before initialized' warnings. */ #ifdef lint /* Use CODE only if lint checking is in effect. */ # define IF_LINT(Code) Code -/* Assume that the expression COND is true. This differs in intent - from 'assert', as it is a message from the programmer to the compiler. */ -# define lint_assume(cond) ((cond) ? (void) 0 : abort ()) #else # define IF_LINT(Code) /* empty */ -# define lint_assume(cond) ((void) (0 && (cond))) #endif /* conf_post.h ends here */ diff --git a/src/data.c b/src/data.c index 9f4bd1f1c02..79679bae444 100644 --- a/src/data.c +++ b/src/data.c @@ -54,6 +54,7 @@ Lisp_Object Qintegerp, Qwholenump, Qsymbolp, Qlistp, Qconsp; static Lisp_Object Qnatnump; Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp; Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp; +Lisp_Object Qbool_vector_p; Lisp_Object Qbuffer_or_string_p; static Lisp_Object Qkeywordp, Qboundp; Lisp_Object Qfboundp; @@ -616,7 +617,7 @@ global value outside of any lexical scope. */) struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym); if (blv->fwd) /* In set_internal, we un-forward vars when their value is - set to Qunbound. */ + set to Qunbound. */ return Qt; else { @@ -627,7 +628,7 @@ global value outside of any lexical scope. */) } case SYMBOL_FORWARDED: /* In set_internal, we un-forward vars when their value is - set to Qunbound. */ + set to Qunbound. */ return Qt; default: emacs_abort (); } @@ -1995,7 +1996,7 @@ If the current binding is global (the default), the value is nil. */) } /* This code is disabled now that we use the selected frame to return - keyboard-local-values. */ + keyboard-local-values. */ #if 0 extern struct terminal *get_terminal (Lisp_Object display, int); @@ -2255,10 +2256,8 @@ bool-vector. IDX starts at 0. */) /* Arithmetic functions */ -enum comparison { equal, notequal, less, grtr, less_or_equal, grtr_or_equal }; - -static Lisp_Object -arithcompare (Lisp_Object num1, Lisp_Object num2, enum comparison comparison) +Lisp_Object +arithcompare (Lisp_Object num1, Lisp_Object num2, enum Arith_Comparison comparison) { double f1 = 0, f2 = 0; bool floatp = 0; @@ -2275,32 +2274,32 @@ arithcompare (Lisp_Object num1, Lisp_Object num2, enum comparison comparison) switch (comparison) { - case equal: + case ARITH_EQUAL: if (floatp ? f1 == f2 : XINT (num1) == XINT (num2)) return Qt; return Qnil; - case notequal: + case ARITH_NOTEQUAL: if (floatp ? f1 != f2 : XINT (num1) != XINT (num2)) return Qt; return Qnil; - case less: + case ARITH_LESS: if (floatp ? f1 < f2 : XINT (num1) < XINT (num2)) return Qt; return Qnil; - case less_or_equal: + case ARITH_LESS_OR_EQUAL: if (floatp ? f1 <= f2 : XINT (num1) <= XINT (num2)) return Qt; return Qnil; - case grtr: + case ARITH_GRTR: if (floatp ? f1 > f2 : XINT (num1) > XINT (num2)) return Qt; return Qnil; - case grtr_or_equal: + case ARITH_GRTR_OR_EQUAL: if (floatp ? f1 >= f2 : XINT (num1) >= XINT (num2)) return Qt; return Qnil; @@ -2310,48 +2309,65 @@ arithcompare (Lisp_Object num1, Lisp_Object num2, enum comparison comparison) } } -DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0, - doc: /* Return t if two args, both numbers or markers, are equal. */) - (register Lisp_Object num1, Lisp_Object num2) +static Lisp_Object +arithcompare_driver (ptrdiff_t nargs, Lisp_Object *args, + enum Arith_Comparison comparison) { - return arithcompare (num1, num2, equal); + for (ptrdiff_t argnum = 1; argnum < nargs; ++argnum) + { + if (EQ (Qnil, arithcompare (args[argnum-1], args[argnum], comparison))) + return Qnil; + } + return Qt; } -DEFUN ("<", Flss, Slss, 2, 2, 0, - doc: /* Return t if first arg is less than second arg. Both must be numbers or markers. */) - (register Lisp_Object num1, Lisp_Object num2) +DEFUN ("=", Feqlsign, Seqlsign, 1, MANY, 0, + doc: /* Return t if args, all numbers or markers, are equal. +usage: (= NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */) + (ptrdiff_t nargs, Lisp_Object *args) { - return arithcompare (num1, num2, less); + return arithcompare_driver (nargs, args, ARITH_EQUAL); } -DEFUN (">", Fgtr, Sgtr, 2, 2, 0, - doc: /* Return t if first arg is greater than second arg. Both must be numbers or markers. */) - (register Lisp_Object num1, Lisp_Object num2) +DEFUN ("<", Flss, Slss, 1, MANY, 0, + doc: /* Return t if each arg is less than the next arg. All must be numbers or markers. +usage: (< NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */) + (ptrdiff_t nargs, Lisp_Object *args) { - return arithcompare (num1, num2, grtr); + return arithcompare_driver (nargs, args, ARITH_LESS); } -DEFUN ("<=", Fleq, Sleq, 2, 2, 0, - doc: /* Return t if first arg is less than or equal to second arg. -Both must be numbers or markers. */) - (register Lisp_Object num1, Lisp_Object num2) +DEFUN (">", Fgtr, Sgtr, 1, MANY, 0, + doc: /* Return t if each arg is greater than the next arg. All must be numbers or markers. +usage: (> NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */) + (ptrdiff_t nargs, Lisp_Object *args) { - return arithcompare (num1, num2, less_or_equal); + return arithcompare_driver (nargs, args, ARITH_GRTR); } -DEFUN (">=", Fgeq, Sgeq, 2, 2, 0, - doc: /* Return t if first arg is greater than or equal to second arg. -Both must be numbers or markers. */) - (register Lisp_Object num1, Lisp_Object num2) +DEFUN ("<=", Fleq, Sleq, 1, MANY, 0, + doc: /* Return t if each arg is less than or equal to the next arg. +All must be numbers or markers. +usage: (<= NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */) + (ptrdiff_t nargs, Lisp_Object *args) +{ + return arithcompare_driver (nargs, args, ARITH_LESS_OR_EQUAL); +} + +DEFUN (">=", Fgeq, Sgeq, 1, MANY, 0, + doc: /* Return t if each arg is greater than or equal to the next arg. +All must be numbers or markers. +usage: (= NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */) + (ptrdiff_t nargs, Lisp_Object *args) { - return arithcompare (num1, num2, grtr_or_equal); + return arithcompare_driver (nargs, args, ARITH_GRTR_OR_EQUAL); } DEFUN ("/=", Fneq, Sneq, 2, 2, 0, doc: /* Return t if first arg is not equal to second arg. Both must be numbers or markers. */) (register Lisp_Object num1, Lisp_Object num2) { - return arithcompare (num1, num2, notequal); + return arithcompare (num1, num2, ARITH_NOTEQUAL); } DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0, @@ -2941,6 +2957,453 @@ lowercase l) for small endian machines. */) return make_number (order); } +/* Because we round up the bool vector allocate size to word_size + units, we can safely read past the "end" of the vector in the + operations below. These extra bits are always zero. Also, we + always allocate bool vectors with at least one size_t of storage so + that we don't have to special-case empty bit vectors. */ + +static size_t +bool_vector_spare_mask (ptrdiff_t nr_bits) +{ + eassert_and_assume (nr_bits > 0); + return (((size_t) 1) << (nr_bits % BITS_PER_SIZE_T)) - 1; +} + +#if _MSC_VER >= 1500 && (defined _M_IX86 || defined _M_X64) +# define USE_MSC_POPCOUNT +# define POPCOUNT_STATIC_INLINE static inline +#elif __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# define USE_GCC_POPCOUNT +# if 199901L <= __STDC_VERSION__ || !__STRICT_ANSI__ +# define POPCOUNT_STATIC_INLINE static inline +# endif +#else +# define NEED_GENERIC_POPCOUNT +#endif +#ifndef POPCOUNT_STATIC_INLINE +# define POPCOUNT_STATIC_INLINE static +#endif + +#ifdef USE_MSC_POPCOUNT +# define NEED_GENERIC_POPCOUNT +#endif + +#ifdef NEED_GENERIC_POPCOUNT +POPCOUNT_STATIC_INLINE unsigned int +popcount_size_t_generic (size_t val) +{ + unsigned short j; + unsigned int count = 0; + + for (j = 0; j < BITS_PER_SIZE_T; ++j) + count += !!((((size_t) 1) << j) & val); + + return count; +} +#endif + +#ifdef USE_MSC_POPCOUNT +POPCOUNT_STATIC_INLINE unsigned int +popcount_size_t_msc (size_t val) +{ + unsigned int count; + +#pragma intrinsic __cpuid + /* While gcc falls back to its own generic code if the machine on + which it's running doesn't support popcount, we need to perform the + detection and fallback ourselves when compiling with Microsoft's + compiler. */ + + static enum { + popcount_unknown_support, + popcount_use_generic, + popcount_use_intrinsic + } popcount_state; + + if (popcount_state == popcount_unknown_support) + { + int cpu_info[4]; + __cpuid (cpu_info, 1); + if (cpu_info[2] & (1<<23)) /* See MSDN. */ + popcount_state = popcount_use_intrinsic; + else + popcount_state = popcount_use_generic; + } + + if (popcount_state == popcount_use_intrinsic) + { +# if BITS_PER_SIZE_T == 64 +# pragma intrinsic __popcnt64 + count = __popcnt64 (val); +# else +# pragma intrinsic __popcnt + count = __popcnt (val); +# endif + } + else + count = popcount_size_t_generic (val); + + return count; +} +#endif /* USE_MSC_POPCOUNT */ + +#ifdef USE_GCC_POPCOUNT +POPCOUNT_STATIC_INLINE unsigned int +popcount_size_t_gcc (size_t val) +{ +# if BITS_PER_SIZE_T == 64 + return __builtin_popcountll (val); +# else + return __builtin_popcount (val); +# endif +} +#endif /* USE_GCC_POPCOUNT */ + +POPCOUNT_STATIC_INLINE unsigned int +popcount_size_t (size_t val) +{ +#if defined USE_MSC_POPCOUNT + return popcount_size_t_msc (val); +#elif defined USE_GCC_POPCOUNT + return popcount_size_t_gcc (val); +#else + return popcount_size_t_generic (val); +#endif +} + +enum bool_vector_op { bool_vector_exclusive_or, + bool_vector_union, + bool_vector_intersection, + bool_vector_set_difference, + bool_vector_subsetp }; + +static Lisp_Object +bool_vector_binop_driver (Lisp_Object op1, + Lisp_Object op2, + Lisp_Object dest, + enum bool_vector_op op) +{ + EMACS_INT nr_bits; + size_t *adata, *bdata, *cdata; + ptrdiff_t i; + size_t changed = 0; + size_t mword; + ptrdiff_t nr_words; + + CHECK_BOOL_VECTOR (op1); + CHECK_BOOL_VECTOR (op2); + + nr_bits = min (XBOOL_VECTOR (op1)->size, + XBOOL_VECTOR (op2)->size); + + if (NILP (dest)) + { + dest = Fmake_bool_vector (make_number (nr_bits), Qnil); + changed = 1; + } + else + { + CHECK_BOOL_VECTOR (dest); + nr_bits = min (nr_bits, XBOOL_VECTOR (dest)->size); + } + + eassert_and_assume (nr_bits >= 0); + nr_words = ROUNDUP (nr_bits, BITS_PER_SIZE_T) / BITS_PER_SIZE_T; + + adata = (size_t *) XBOOL_VECTOR (dest)->data; + bdata = (size_t *) XBOOL_VECTOR (op1)->data; + cdata = (size_t *) XBOOL_VECTOR (op2)->data; + i = 0; + do + { + if (op == bool_vector_exclusive_or) + mword = bdata[i] ^ cdata[i]; + else if (op == bool_vector_union || op == bool_vector_subsetp) + mword = bdata[i] | cdata[i]; + else if (op == bool_vector_intersection) + mword = bdata[i] & cdata[i]; + else if (op == bool_vector_set_difference) + mword = bdata[i] &~ cdata[i]; + else + abort (); + + changed |= adata[i] ^ mword; + + if (op != bool_vector_subsetp) + adata[i] = mword; + + i++; + } + while (i < nr_words); + + return changed ? dest : Qnil; +} + +/* Compute the number of trailing zero bits in val. If val is zero, + return the number of bits in val. */ +static unsigned int +count_trailing_zero_bits (size_t val) +{ + if (val == 0) + return CHAR_BIT * sizeof (val); + +#if defined USE_GCC_POPCOUNT && BITS_PER_SIZE_T == 64 + return __builtin_ctzll (val); +#elif defined USE_GCC_POPCOUNT && BITS_PER_SIZE_T == 32 + return __builtin_ctz (val); +#elif _MSC_VER && BITS_PER_SIZE_T == 64 +# pragma intrinsic _BitScanForward64 + { + /* No support test needed: support since 386. */ + unsigned long result; + _BitScanForward64 (&result, val); + return (unsigned int) result; + } +#elif _MSC_VER && BITS_PER_SIZE_T == 32 +# pragma intrinsic _BitScanForward + { + /* No support test needed: support since 386. */ + unsigned long result; + _BitScanForward (&result, val); + return (unsigned int) result; + } +#else + { + unsigned int count; + count = 0; + for (val = ~val; val & 1; val >>= 1) + ++count; + + return count; + } +#endif +} + +static size_t +size_t_to_host_endian (size_t val) +{ +#ifdef WORDS_BIGENDIAN +# if BITS_PER_SIZE_T == 64 + return swap64 (val); +# else + return swap32 (val); +# endif +#else + return val; +#endif +} + +DEFUN ("bool-vector-exclusive-or", Fbool_vector_exclusive_or, + Sbool_vector_exclusive_or, 2, 3, 0, + doc: /* Compute C = A ^ B, bitwise exclusive or. +A, B, and C must be bool vectors. If C is nil, allocate a new bool +vector in which to store the result. Return the destination vector if +it changed or nil otherwise. */ + ) + (Lisp_Object a, Lisp_Object b, Lisp_Object c) +{ + return bool_vector_binop_driver (a, b, c, bool_vector_exclusive_or); +} + +DEFUN ("bool-vector-union", Fbool_vector_union, + Sbool_vector_union, 2, 3, 0, + doc: /* Compute C = A | B, bitwise or. +A, B, and C must be bool vectors. If C is nil, allocate a new bool +vector in which to store the result. Return the destination vector if +it changed or nil otherwise. */) + (Lisp_Object a, Lisp_Object b, Lisp_Object c) +{ + return bool_vector_binop_driver (a, b, c, bool_vector_union); +} + +DEFUN ("bool-vector-intersection", Fbool_vector_intersection, + Sbool_vector_intersection, 2, 3, 0, + doc: /* Compute C = A & B, bitwise and. +A, B, and C must be bool vectors. If C is nil, allocate a new bool +vector in which to store the result. Return the destination vector if +it changed or nil otherwise. */) + (Lisp_Object a, Lisp_Object b, Lisp_Object c) +{ + return bool_vector_binop_driver (a, b, c, bool_vector_intersection); +} + +DEFUN ("bool-vector-set-difference", Fbool_vector_set_difference, + Sbool_vector_set_difference, 2, 3, 0, + doc: /* Compute C = A &~ B, set difference. +A, B, and C must be bool vectors. If C is nil, allocate a new bool +vector in which to store the result. Return the destination vector if +it changed or nil otherwise. */) + (Lisp_Object a, Lisp_Object b, Lisp_Object c) +{ + return bool_vector_binop_driver (a, b, c, bool_vector_set_difference); +} + +DEFUN ("bool-vector-subsetp", Fbool_vector_subsetp, + Sbool_vector_subsetp, 2, 2, 0, + doc: ) + (Lisp_Object a, Lisp_Object b) +{ + /* Like bool_vector_union, but doesn't modify b. */ + return bool_vector_binop_driver (b, a, b, bool_vector_subsetp); +} + +DEFUN ("bool-vector-not", Fbool_vector_not, + Sbool_vector_not, 1, 2, 0, + doc: /* Compute B = ~A. +B must be a bool vector. A must be a bool vector or nil. +If A is nil, allocate a new bool vector in which to store the result. +Return the destination vector. */) + (Lisp_Object a, Lisp_Object b) +{ + EMACS_INT nr_bits; + size_t *bdata, *adata; + ptrdiff_t i; + size_t mword; + + CHECK_BOOL_VECTOR (a); + nr_bits = XBOOL_VECTOR (a)->size; + + if (NILP (b)) + b = Fmake_bool_vector (make_number (nr_bits), Qnil); + else + { + CHECK_BOOL_VECTOR (b); + nr_bits = min (nr_bits, XBOOL_VECTOR (b)->size); + } + + bdata = (size_t *) XBOOL_VECTOR (b)->data; + adata = (size_t *) XBOOL_VECTOR (a)->data; + + eassert_and_assume (nr_bits >= 0); + + for (i = 0; i < nr_bits / BITS_PER_SIZE_T; i++) + bdata[i] = ~adata[i]; + + if (nr_bits % BITS_PER_SIZE_T) + { + mword = size_t_to_host_endian (adata[i]); + mword = ~mword; + mword &= bool_vector_spare_mask (nr_bits); + bdata[i] = size_t_to_host_endian (mword); + } + + return b; +} + +DEFUN ("bool-vector-count-matches", Fbool_vector_count_matches, + Sbool_vector_count_matches, 2, 2, 0, + doc: /* Count how many elements in A equal B. +A must be a bool vector. B is a generalized bool. */) + (Lisp_Object a, Lisp_Object b) +{ + ptrdiff_t count; + EMACS_INT nr_bits; + size_t *adata; + size_t match; + ptrdiff_t i; + + CHECK_BOOL_VECTOR (a); + + nr_bits = XBOOL_VECTOR (a)->size; + count = 0; + match = NILP (b) ? (size_t) -1 : 0; + adata = (size_t *) XBOOL_VECTOR (a)->data; + + eassert_and_assume (nr_bits >= 0); + + for (i = 0; i < nr_bits / BITS_PER_SIZE_T; ++i) + count += popcount_size_t (adata[i] ^ match); + + /* Mask out trailing parts of final mword. */ + if (nr_bits % BITS_PER_SIZE_T) + { + size_t mword = adata[i] ^ match; + mword = size_t_to_host_endian (mword); + count += popcount_size_t (mword & bool_vector_spare_mask (nr_bits)); + } + + return make_number (count); +} + +DEFUN ("bool-vector-count-matches-at", + Fbool_vector_count_matches_at, + Sbool_vector_count_matches_at, 3, 3, 0, + doc: /* Count how many consecutive elements in A equal B at i. +A must be a bool vector. B is a generalized boolean. i is an +index into the vector. */) + (Lisp_Object a, Lisp_Object b, Lisp_Object i) +{ + ptrdiff_t count; + EMACS_INT nr_bits; + ptrdiff_t offset; + size_t *adata; + size_t twiddle; + size_t mword; /* Machine word. */ + ptrdiff_t pos; + ptrdiff_t nr_words; + + CHECK_BOOL_VECTOR (a); + CHECK_NATNUM (i); + + nr_bits = XBOOL_VECTOR (a)->size; + if (XFASTINT (i) > nr_bits) /* Allow one past the end for convenience */ + args_out_of_range (a, i); + + adata = (size_t *) XBOOL_VECTOR (a)->data; + + assume (nr_bits >= 0); + nr_words = ROUNDUP (nr_bits, BITS_PER_SIZE_T) / BITS_PER_SIZE_T; + + pos = XFASTINT (i) / BITS_PER_SIZE_T; + offset = XFASTINT (i) % BITS_PER_SIZE_T; + count = 0; + + /* By XORing with twiddle, we transform the problem of "count + consecutive equal values" into "count the zero bits". The latter + operation usually has hardware support. */ + twiddle = NILP (b) ? 0 : (size_t) -1; + + /* Scan the remainder of the mword at the current offset. */ + if (pos < nr_words && offset != 0) + { + mword = size_t_to_host_endian (adata[pos]); + mword ^= twiddle; + mword >>= offset; + count = count_trailing_zero_bits (mword); + count = min (count, BITS_PER_SIZE_T - offset); + pos++; + if (count + offset < BITS_PER_SIZE_T) + return make_number (count); + } + + /* Scan whole words until we either reach the end of the vector or + find an mword that doesn't completely match. twiddle is + endian-independent. */ + while (pos < nr_words && adata[pos] == twiddle) + { + count += BITS_PER_SIZE_T; + ++pos; + } + + if (pos < nr_words) + { + /* If we stopped because of a mismatch, see how many bits match + in the current mword. */ + mword = size_t_to_host_endian (adata[pos]); + mword ^= twiddle; + count += count_trailing_zero_bits (mword); + } + else if (nr_bits % BITS_PER_SIZE_T != 0) + { + /* If we hit the end, we might have overshot our count. Reduce + the total by the number of spare bits at the end of the + vector. */ + count -= BITS_PER_SIZE_T - nr_bits % BITS_PER_SIZE_T; + } + + return make_number (count); +} void @@ -2990,6 +3453,7 @@ syms_of_data (void) DEFSYM (Qsequencep, "sequencep"); DEFSYM (Qbufferp, "bufferp"); DEFSYM (Qvectorp, "vectorp"); + DEFSYM (Qbool_vector_p, "bool-vector-p"); DEFSYM (Qchar_or_string_p, "char-or-string-p"); DEFSYM (Qmarkerp, "markerp"); DEFSYM (Qbuffer_or_string_p, "buffer-or-string-p"); @@ -3207,6 +3671,15 @@ syms_of_data (void) defsubr (&Ssubr_arity); defsubr (&Ssubr_name); + defsubr (&Sbool_vector_exclusive_or); + defsubr (&Sbool_vector_union); + defsubr (&Sbool_vector_intersection); + defsubr (&Sbool_vector_set_difference); + defsubr (&Sbool_vector_not); + defsubr (&Sbool_vector_subsetp); + defsubr (&Sbool_vector_count_matches); + defsubr (&Sbool_vector_count_matches_at); + set_symbol_function (Qwholenump, XSYMBOL (Qnatnump)->function); DEFVAR_LISP ("most-positive-fixnum", Vmost_positive_fixnum, diff --git a/src/dired.c b/src/dired.c index 2b79b54f2a4..1bdb171c4d0 100644 --- a/src/dired.c +++ b/src/dired.c @@ -278,7 +278,7 @@ directory_files_internal (Lisp_Object directory, Lisp_Object full, memcpy (SDATA (fullname) + directory_nbytes + needsep, SDATA (name), len); - nchars = chars_in_text (SDATA (fullname), nbytes); + nchars = multibyte_chars_in_text (SDATA (fullname), nbytes); /* Some bug somewhere. */ if (nchars > nbytes) diff --git a/src/dispextern.h b/src/dispextern.h index f70b1f8092e..af9efe660d9 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -49,18 +49,16 @@ typedef struct { #endif INLINE_HEADER_BEGIN -#ifndef DISPEXTERN_INLINE -# define DISPEXTERN_INLINE INLINE -#endif #include <c-strcase.h> -DISPEXTERN_INLINE int +INLINE int xstrcasecmp (char const *a, char const *b) { return c_strcasecmp (a, b); } #ifdef HAVE_X_WINDOWS +#include <X11/Xresource.h> /* for XrmDatabase */ typedef struct x_display_info Display_Info; typedef XImage * XImagePtr; typedef XImagePtr XImagePtr_or_DC; @@ -288,10 +286,10 @@ typedef struct { } GLYPH; /* Return a glyph's character code. */ -DISPEXTERN_INLINE int GLYPH_CHAR (GLYPH glyph) { return glyph.ch; } +INLINE int GLYPH_CHAR (GLYPH glyph) { return glyph.ch; } /* Return a glyph's face ID. */ -DISPEXTERN_INLINE int GLYPH_FACE (GLYPH glyph) { return glyph.face_id; } +INLINE int GLYPH_FACE (GLYPH glyph) { return glyph.face_id; } #define SET_GLYPH_CHAR(glyph, char) ((glyph).ch = (char)) #define SET_GLYPH_FACE(glyph, face) ((glyph).face_id = (face)) @@ -300,7 +298,7 @@ DISPEXTERN_INLINE int GLYPH_FACE (GLYPH glyph) { return glyph.face_id; } /* The following are valid only if GLYPH_CODE_P (gc). */ -DISPEXTERN_INLINE int +INLINE int GLYPH_CODE_CHAR (Lisp_Object gc) { return (CONSP (gc) @@ -308,7 +306,7 @@ GLYPH_CODE_CHAR (Lisp_Object gc) : XINT (gc) & MAX_CHAR); } -DISPEXTERN_INLINE int +INLINE int GLYPH_CODE_FACE (Lisp_Object gc) { return CONSP (gc) ? XINT (XCDR (gc)) : XINT (gc) >> CHARACTERBITS; @@ -794,7 +792,10 @@ enum glyph_row_area Rows in window matrices on frames having no frame matrices point to glyphs allocated from the heap via xmalloc; glyphs[LEFT_MARGIN_AREA] is the start address of the allocated - glyph structure array. */ + glyph structure array. + + NOTE: layout of first four members of this structure is important, + see clear_glyph_row and copy_row_except_pointers to check why. */ struct glyph_row { @@ -814,8 +815,13 @@ struct glyph_row removed some day, so don't use it in new code. */ struct glyph *glyphs[1 + LAST_AREA]; - /* Number of glyphs actually filled in areas. */ - short used[LAST_AREA]; + /* Number of glyphs actually filled in areas. This could have size + LAST_AREA, but it's 1 + LAST_AREA to simplify offset calculations. */ + short used[1 + LAST_AREA]; + + /* Hash code. This hash code is available as soon as the row + is constructed, i.e. after a call to display_line. */ + unsigned hash; /* Window-relative x and y-position of the top-left corner of this row. If y < 0, this means that eabs (y) pixels of the row are @@ -848,10 +854,6 @@ struct glyph_row in last row when checking if row is fully visible. */ int extra_line_spacing; - /* Hash code. This hash code is available as soon as the row - is constructed, i.e. after a call to display_line. */ - unsigned hash; - /* First position in this row. This is the text position, including overlay position information etc, where the display of this row started, and can thus be less than the position of the first @@ -1195,12 +1197,6 @@ struct glyph_row *matrix_row (struct glyph_matrix *, int); ((ROW)->phys_height - (ROW)->phys_ascent \ > (ROW)->height - (ROW)->ascent) -/* True means that fonts have been loaded since the last glyph - matrix adjustments. The function redisplay_internal adjusts glyph - matrices when this flag is true. */ - -extern bool fonts_changed_p; - /* A glyph for a space. */ extern struct glyph space_glyph; @@ -1428,31 +1424,31 @@ struct glyph_string #define CURRENT_MODE_LINE_FACE_ID(W) \ (CURRENT_MODE_LINE_FACE_ID_3((W), XWINDOW (selected_window), (W))) -/* Return the current height of the mode line of window W. If not - known from current_mode_line_height, look at W's current glyph - matrix, or return a default based on the height of the font of the - face `mode-line'. */ +/* Return the current height of the mode line of window W. If not known + from W->mode_line_height, look at W's current glyph matrix, or return + a default based on the height of the font of the face `mode-line'. */ -#define CURRENT_MODE_LINE_HEIGHT(W) \ - (current_mode_line_height >= 0 \ - ? current_mode_line_height \ - : (MATRIX_MODE_LINE_HEIGHT ((W)->current_matrix) \ - ? MATRIX_MODE_LINE_HEIGHT ((W)->current_matrix) \ - : estimate_mode_line_height (XFRAME ((W)->frame), \ - CURRENT_MODE_LINE_FACE_ID (W)))) +#define CURRENT_MODE_LINE_HEIGHT(W) \ + (W->mode_line_height >= 0 \ + ? W->mode_line_height \ + : (W->mode_line_height \ + = (MATRIX_MODE_LINE_HEIGHT (W->current_matrix) \ + ? MATRIX_MODE_LINE_HEIGHT (W->current_matrix) \ + : estimate_mode_line_height \ + (XFRAME (W->frame), CURRENT_MODE_LINE_FACE_ID (W))))) -/* Return the current height of the header line of window W. If not - known from current_header_line_height, look at W's current glyph - matrix, or return an estimation based on the height of the font of - the face `header-line'. */ +/* Return the current height of the header line of window W. If not known + from W->header_line_height, look at W's current glyph matrix, or return + an estimation based on the height of the font of the face `header-line'. */ #define CURRENT_HEADER_LINE_HEIGHT(W) \ - (current_header_line_height >= 0 \ - ? current_header_line_height \ - : (MATRIX_HEADER_LINE_HEIGHT ((W)->current_matrix) \ - ? MATRIX_HEADER_LINE_HEIGHT ((W)->current_matrix) \ - : estimate_mode_line_height (XFRAME ((W)->frame), \ - HEADER_LINE_FACE_ID))) + (W->header_line_height >= 0 \ + ? W->header_line_height \ + : (W->header_line_height \ + = (MATRIX_HEADER_LINE_HEIGHT (W->current_matrix) \ + ? MATRIX_HEADER_LINE_HEIGHT (W->current_matrix) \ + : estimate_mode_line_height \ + (XFRAME (W->frame), HEADER_LINE_FACE_ID)))) /* Return the height of the desired mode line of window W. */ @@ -1829,7 +1825,7 @@ struct face_cache #endif /* not HAVE_WINDOW_SYSTEM */ /* Return true if G contains a valid character code. */ -DISPEXTERN_INLINE bool +INLINE bool GLYPH_CHAR_VALID_P (GLYPH g) { return CHAR_VALID_P (GLYPH_CHAR (g)); @@ -1839,7 +1835,7 @@ GLYPH_CHAR_VALID_P (GLYPH g) encodes a char code in the lower CHARACTERBITS bits and a (very small) face-id in the upper bits, or it may be a cons (CHAR . FACE-ID). */ -DISPEXTERN_INLINE bool +INLINE bool GLYPH_CODE_P (Lisp_Object gc) { return (CONSP (gc) @@ -2710,7 +2706,7 @@ typedef struct { unsigned mouse_face_hidden : 1; } Mouse_HLInfo; -DISPEXTERN_INLINE void +INLINE void reset_mouse_highlight (Mouse_HLInfo *hlinfo) { @@ -2802,11 +2798,6 @@ struct redisplay_interface /* Flush the display of frame F. For X, this is XFlush. */ void (*flush_display) (struct frame *f); - /* Flush the display of frame F if non-NULL. This is called - during redisplay, and should be NULL on systems which flush - automatically before reading input. */ - void (*flush_display_optional) (struct frame *f); - /* Clear the mouse highlight in window W, if there is any. */ void (*clear_window_mouse_face) (struct window *w); @@ -3200,12 +3191,10 @@ int in_display_vector_p (struct it *); int frame_mode_line_height (struct frame *); extern Lisp_Object Qtool_bar; extern bool redisplaying_p; -extern int help_echo_showing_p; -extern int current_mode_line_height, current_header_line_height; +extern bool help_echo_showing_p; extern Lisp_Object help_echo_string, help_echo_window; extern Lisp_Object help_echo_object, previous_help_echo_string; extern ptrdiff_t help_echo_pos; -extern struct frame *last_mouse_frame; extern int last_tool_bar_item; extern void reseat_at_previous_visible_line_start (struct it *); extern Lisp_Object lookup_glyphless_char_display (int, struct it *); @@ -3215,6 +3204,7 @@ extern ptrdiff_t compute_display_string_pos (struct text_pos *, extern ptrdiff_t compute_display_string_end (ptrdiff_t, struct bidi_string_data *); extern void produce_stretch_glyph (struct it *); +extern int merge_glyphless_glyph_face (struct it *); #ifdef HAVE_WINDOW_SYSTEM @@ -3404,7 +3394,7 @@ extern frame_parm_handler x_frame_parm_handlers[]; extern void start_hourglass (void); extern void cancel_hourglass (void); -extern int hourglass_shown_p; +extern bool hourglass_shown_p; /* If non-null, an asynchronous timer that, when it expires, displays an hourglass cursor on all frames. */ extern struct atimer *hourglass_atimer; @@ -3454,13 +3444,10 @@ extern Lisp_Object marginal_area_string (struct window *, enum window_part, Lisp_Object *, int *, int *, int *, int *); extern void redraw_frame (struct frame *); -extern void cancel_line (int, struct frame *); -extern void init_desired_glyphs (struct frame *); extern bool update_frame (struct frame *, bool, bool); extern void update_frame_with_menu (struct frame *); extern void bitch_at_user (void); -void adjust_glyphs (struct frame *); -struct glyph_matrix *save_current_matrix (struct frame *); +extern void adjust_frame_glyphs (struct frame *); void free_glyphs (struct frame *); void free_window_matrices (struct window *); void check_glyph_memory (void); @@ -3546,6 +3533,7 @@ enum resource_types RES_TYPE_BOOLEAN_NUMBER }; +extern Display_Info *check_x_display_info (Lisp_Object); extern Lisp_Object x_get_arg (Display_Info *, Lisp_Object, Lisp_Object, const char *, const char *class, enum resource_types); @@ -3557,6 +3545,13 @@ extern Lisp_Object x_default_parameter (struct frame *, Lisp_Object, Lisp_Object, Lisp_Object, const char *, const char *, enum resource_types); +extern char *x_get_string_resource (XrmDatabase, const char *, + const char *); + +#ifndef HAVE_NS /* These both used on W32 and X only. */ +extern bool x_mouse_grabbed (Display_Info *); +extern void x_redo_mouse_highlight (Display_Info *); +#endif /* HAVE_NS */ #endif /* HAVE_WINDOW_SYSTEM */ diff --git a/src/dispnew.c b/src/dispnew.c index 0a9ce116ebb..b1384a6feb3 100644 --- a/src/dispnew.c +++ b/src/dispnew.c @@ -20,8 +20,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> -#define DISPEXTERN_INLINE EXTERN_INLINE - #include "sysstdio.h" #include <unistd.h> @@ -77,7 +75,6 @@ struct dim static void update_frame_line (struct frame *, int); static int required_matrix_height (struct window *); static int required_matrix_width (struct window *); -static void adjust_frame_glyphs (struct frame *); static void change_frame_size_1 (struct frame *, int, int, bool, bool, bool); static void increment_row_positions (struct glyph_row *, ptrdiff_t, ptrdiff_t); static void fill_up_frame_row_with_spaces (struct glyph_row *, int); @@ -105,30 +102,12 @@ static void set_window_cursor_after_update (struct window *); static void adjust_frame_glyphs_for_window_redisplay (struct frame *); static void adjust_frame_glyphs_for_frame_redisplay (struct frame *); -/* True upon entry to redisplay means do not assume anything about - current contents of actual terminal frame; clear and redraw it. */ - -bool frame_garbaged; - /* True means last display completed. False means it was preempted. */ bool display_completed; Lisp_Object Qdisplay_table, Qredisplay_dont_pause; - -/* The currently selected frame. In a single-frame version, this - variable always equals the_only_frame. */ - -Lisp_Object selected_frame; - -/* A frame which is not just a mini-buffer, or 0 if there are no such - frames. This is usually the most recent such frame that was - selected. In a single-frame version, this variable always holds - the address of the_only_frame. */ - -struct frame *last_nonminibuf_frame; - /* True means SIGWINCH happened when not safe. */ static bool delayed_size_change; @@ -152,16 +131,6 @@ static int glyph_pool_count; static struct frame *frame_matrix_frame; -/* True means that fonts have been loaded since the last glyph - matrix adjustments. Redisplay must stop, and glyph matrices must - be adjusted when this flag becomes true during display. The - reason fonts can be loaded so late is that fonts of fontsets are - loaded on demand. Another reason is that a line contains many - characters displayed by zero width or very narrow glyphs of - variable-width fonts. */ - -bool fonts_changed_p; - /* Convert vpos and hpos from frame to window and vice versa. This may only be used for terminal frames. */ @@ -433,7 +402,7 @@ adjust_glyph_matrix (struct window *w, struct glyph_matrix *matrix, int x, int y || right != matrix->right_margin_glyphs); if (!marginal_areas_changed_p - && !fonts_changed_p + && !XFRAME (w->frame)->fonts_changed && !header_line_changed_p && matrix->window_left_col == WINDOW_LEFT_EDGE_COL (w) && matrix->window_top_line == WINDOW_TOP_EDGE_LINE (w) @@ -794,9 +763,11 @@ clear_current_matrices (register struct frame *f) clear_glyph_matrix (XWINDOW (f->menu_bar_window)->current_matrix); #endif +#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS) /* Clear the matrix of the tool-bar window, if any. */ if (WINDOWP (f->tool_bar_window)) clear_glyph_matrix (XWINDOW (f->tool_bar_window)->current_matrix); +#endif /* Clear current window matrices. */ eassert (WINDOWP (FRAME_ROOT_WINDOW (f))); @@ -817,8 +788,10 @@ clear_desired_matrices (register struct frame *f) clear_glyph_matrix (XWINDOW (f->menu_bar_window)->desired_matrix); #endif +#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS) if (WINDOWP (f->tool_bar_window)) clear_glyph_matrix (XWINDOW (f->tool_bar_window)->desired_matrix); +#endif /* Do it for window matrices. */ eassert (WINDOWP (FRAME_ROOT_WINDOW (f))); @@ -859,41 +832,16 @@ clear_window_matrices (struct window *w, bool desired_p) See dispextern.h for an overall explanation of glyph rows. ***********************************************************************/ -/* Clear glyph row ROW. Do it in a way that makes it robust against - changes in the glyph_row structure, i.e. addition or removal of - structure members. */ - -static struct glyph_row null_row; +/* Clear glyph row ROW. NOTE: this code relies on the current + layout of `glyphs' and `used' fields of `struct glyph_row'. */ void clear_glyph_row (struct glyph_row *row) { - struct glyph *p[1 + LAST_AREA]; - - /* Save pointers. */ - p[LEFT_MARGIN_AREA] = row->glyphs[LEFT_MARGIN_AREA]; - p[TEXT_AREA] = row->glyphs[TEXT_AREA]; - p[RIGHT_MARGIN_AREA] = row->glyphs[RIGHT_MARGIN_AREA]; - p[LAST_AREA] = row->glyphs[LAST_AREA]; - - /* Clear. */ - *row = null_row; - - /* Restore pointers. */ - row->glyphs[LEFT_MARGIN_AREA] = p[LEFT_MARGIN_AREA]; - row->glyphs[TEXT_AREA] = p[TEXT_AREA]; - row->glyphs[RIGHT_MARGIN_AREA] = p[RIGHT_MARGIN_AREA]; - row->glyphs[LAST_AREA] = p[LAST_AREA]; - -#if 0 /* At some point, some bit-fields of struct glyph were not set, - which made glyphs unequal when compared with GLYPH_EQUAL_P. - Redisplay outputs such glyphs, and flickering effects were - the result. This also depended on the contents of memory - returned by xmalloc. If flickering happens again, activate - the code below. If the flickering is gone with that, chances - are that the flickering has the same reason as here. */ - memset (p[0], 0, (char *) p[LAST_AREA] - (char *) p[0]); -#endif + enum { off = offsetof (struct glyph_row, used) }; + + /* Zero everything except pointers in `glyphs'. */ + memset (row->used, 0, sizeof *row - off); } @@ -1032,29 +980,17 @@ swap_glyph_pointers (struct glyph_row *a, struct glyph_row *b) } -/* Copy glyph row structure FROM to glyph row structure TO, except - that glyph pointers, the `used' counts, and the hash values in the - structures are left unchanged. */ +/* Copy glyph row structure FROM to glyph row structure TO, except that + glyph pointers, the `used' counts, and the hash values in the structures + are left unchanged. NOTE: this code relies on the current layout of + `glyphs', `used', `hash' and `x' fields of `struct glyph_row'. */ static void copy_row_except_pointers (struct glyph_row *to, struct glyph_row *from) { - struct glyph *pointers[1 + LAST_AREA]; - short used[LAST_AREA]; - unsigned hashval; - - /* Save glyph pointers of TO. */ - memcpy (pointers, to->glyphs, sizeof to->glyphs); - memcpy (used, to->used, sizeof to->used); - hashval = to->hash; - - /* Do a structure assignment. */ - *to = *from; - - /* Restore original pointers of TO. */ - memcpy (to->glyphs, pointers, sizeof to->glyphs); - memcpy (to->used, used, sizeof to->used); - to->hash = hashval; + enum { off = offsetof (struct glyph_row, x) }; + + memcpy (&to->x, &from->x, sizeof *to - off); } @@ -1799,37 +1735,17 @@ allocate_matrices_for_window_redisplay (struct window *w) } } - -/* Re-allocate/ re-compute glyph matrices on frame F. If F is null, - do it for all frames; otherwise do it just for the given frame. - This function must be called when a new frame is created, its size - changes, or its window configuration changes. */ +/* Allocate/reallocate glyph matrices of a single frame F. + This function must be called when a new frame is created, + its size changes, or its window configuration changes. */ void -adjust_glyphs (struct frame *f) +adjust_frame_glyphs (struct frame *f) { /* Block input so that expose events and other events that access glyph matrices are not processed while we are changing them. */ block_input (); - if (f) - adjust_frame_glyphs (f); - else - { - Lisp_Object tail, lisp_frame; - - FOR_EACH_FRAME (tail, lisp_frame) - adjust_frame_glyphs (XFRAME (lisp_frame)); - } - - unblock_input (); -} - -/* Allocate/reallocate glyph matrices of a single frame F. */ - -static void -adjust_frame_glyphs (struct frame *f) -{ if (FRAME_WINDOW_P (f)) adjust_frame_glyphs_for_window_redisplay (f); else @@ -1839,6 +1755,8 @@ adjust_frame_glyphs (struct frame *f) adjust_decode_mode_spec_buffer (f); f->glyphs_initialized_p = 1; + + unblock_input (); } /* Return true if any window in the tree has nonzero window margins. See @@ -1913,7 +1831,7 @@ fake_current_matrices (Lisp_Object window) /* Save away the contents of frame F's current frame matrix. Value is a glyph matrix holding the contents of F's current frame matrix. */ -struct glyph_matrix * +static struct glyph_matrix * save_current_matrix (struct frame *f) { int i; @@ -2110,10 +2028,9 @@ adjust_frame_glyphs_for_window_redisplay (struct frame *f) /* Allocate/reallocate window matrices. */ allocate_matrices_for_window_redisplay (XWINDOW (FRAME_ROOT_WINDOW (f))); -#ifdef HAVE_X_WINDOWS +#if defined (HAVE_X_WINDOWS) && ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) /* Allocate/ reallocate matrices of the dummy window used to display the menu bar under X when no X toolkit support is available. */ -#if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) { /* Allocate a dummy window if not already done. */ struct window *w; @@ -2137,10 +2054,9 @@ adjust_frame_glyphs_for_window_redisplay (struct frame *f) w->total_cols = FRAME_TOTAL_COLS (f); allocate_matrices_for_window_redisplay (w); } -#endif /* not USE_X_TOOLKIT && not USE_GTK */ -#endif /* HAVE_X_WINDOWS */ +#endif -#ifndef USE_GTK +#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS) { /* Allocate/ reallocate matrices of the tool bar window. If we don't have a tool bar window yet, make one. */ @@ -2214,6 +2130,7 @@ free_glyphs (struct frame *f) } #endif +#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS) /* Free the tool bar window and its glyph matrices. */ if (!NILP (f->tool_bar_window)) { @@ -2223,6 +2140,7 @@ free_glyphs (struct frame *f) w->desired_matrix = w->current_matrix = NULL; fset_tool_bar_window (f, Qnil); } +#endif /* Release frame glyph matrices. Reset fields to zero in case we are called a second time. */ @@ -3105,6 +3023,7 @@ update_frame (struct frame *f, bool force_p, bool inhibit_hairy_id_p) update_window (XWINDOW (f->menu_bar_window), 1); #endif +#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS) /* Update the tool-bar window, if present. */ if (WINDOWP (f->tool_bar_window)) { @@ -3125,21 +3044,11 @@ update_frame (struct frame *f, bool force_p, bool inhibit_hairy_id_p) fset_desired_tool_bar_string (f, tem); } } - +#endif /* Update windows. */ paused_p = update_window_tree (root_window, force_p); update_end (f); - - /* This flush is a performance bottleneck under X, - and it doesn't seem to be necessary anyway (in general). - It is necessary when resizing the window with the mouse, or - at least the fringes are not redrawn in a timely manner. ++kfs */ - if (f->force_flush_display_p) - { - FRAME_RIF (f)->flush_display (f); - f->force_flush_display_p = 0; - } } else { @@ -4568,7 +4477,7 @@ update_frame_1 (struct frame *f, bool force_p, bool inhibit_id_p) } } - lint_assume (0 <= FRAME_LINES (f)); + assume (0 <= FRAME_LINES (f)); pause_p = 0 < i && i < FRAME_LINES (f) - 1; /* Now just clean up termcap drivers and set cursor, etc. */ @@ -5608,8 +5517,10 @@ change_frame_size_1 (struct frame *f, int newheight, int newwidth, if ((FRAME_TERMCAP_P (f) && !pretend) || FRAME_MSDOS_P (f)) FrameCols (FRAME_TTY (f)) = newwidth; +#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS) if (WINDOWP (f->tool_bar_window)) XWINDOW (f->tool_bar_window)->total_cols = newwidth; +#endif } FRAME_LINES (f) = newheight; @@ -5627,7 +5538,7 @@ change_frame_size_1 (struct frame *f, int newheight, int newwidth, w->cursor.vpos = w->cursor.y = 0; } - adjust_glyphs (f); + adjust_frame_glyphs (f); calculate_costs (f); SET_FRAME_GARBAGED (f); f->resized_p = 1; diff --git a/src/disptab.h b/src/disptab.h index e02bab04bbc..87dc5a22a68 100644 --- a/src/disptab.h +++ b/src/disptab.h @@ -59,7 +59,7 @@ extern Lisp_Object Qdisplay_table; /* Return the current base (for indexing) of the GLYPH table, or 0 if the table isn't currently valid. */ #define GLYPH_TABLE_BASE \ - ((VECTORP (Vglyph_table)) ? XVECTOR (Vglyph_table)->contents : 0) + ((VECTORP (Vglyph_table)) ? XVECTOR (Vglyph_table)->u.contents : 0) /* Given BASE and LEN returned by the two previous macros, return nonzero if the GLYPH code G should be output as a single diff --git a/src/emacs.c b/src/emacs.c index 05384145330..79f759cd5b5 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -1,7 +1,7 @@ /* Fully extensible Emacs, running on Unix, intended for GNU. -Copyright (C) 1985-1987, 1993-1995, 1997-1999, 2001-2013 Free Software -Foundation, Inc. +Copyright (C) 1985-1987, 1993-1995, 1997-1999, 2001-2013 + Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -18,8 +18,9 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ - +#define INLINE EXTERN_INLINE #include <config.h> + #include <errno.h> #include <stdio.h> @@ -72,6 +73,12 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "termhooks.h" #include "keyboard.h" #include "keymap.h" +#include "category.h" +#include "charset.h" +#include "composite.h" +#include "dispextern.h" +#include "syntax.h" +#include "systime.h" #ifdef HAVE_GNUTLS #include "gnutls.h" @@ -310,7 +317,7 @@ example, -batch as well as --batch. You can use any unambiguous\n\ abbreviation for a --option.\n\ \n\ Various environment variables and window system resources also affect\n\ -Emacs' operation. See the main documentation.\n\ +the operation of Emacs. See the main documentation.\n\ \n\ Report bugs to bug-gnu-emacs@gnu.org. First, please see the Bugs\n\ section of the Emacs manual or the file BUGS.\n" diff --git a/src/eval.c b/src/eval.c index 1ce14ae94a6..6e964f6604b 100644 --- a/src/eval.c +++ b/src/eval.c @@ -2033,7 +2033,9 @@ it is defines a macro. */) DEFUN ("eval", Feval, Seval, 1, 2, 0, doc: /* Evaluate FORM and return its value. -If LEXICAL is t, evaluate using lexical scoping. */) +If LEXICAL is t, evaluate using lexical scoping. +LEXICAL can also be an actual lexical environment, in the form of an +alist mapping symbols to their value. */) (Lisp_Object form, Lisp_Object lexical) { ptrdiff_t count = SPECPDL_INDEX (); @@ -2146,11 +2148,10 @@ eval_sub (Lisp_Object form) /* Optimize for no indirection. */ fun = original_fun; - if (SYMBOLP (fun) && !NILP (fun) - && (fun = XSYMBOL (fun)->function, SYMBOLP (fun))) - fun = indirect_function (fun); - else + if (!SYMBOLP (fun)) fun = Ffunction (Fcons (fun, Qnil)); + else if (!NILP (fun) && (fun = XSYMBOL (fun)->function, SYMBOLP (fun))) + fun = indirect_function (fun); if (SUBRP (fun)) { diff --git a/src/fileio.c b/src/fileio.c index 0e6113f349d..1a2bdfa237c 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -5121,7 +5121,8 @@ DEFUN ("car-less-than-car", Fcar_less_than_car, Scar_less_than_car, 2, 2, 0, doc: /* Return t if (car A) is numerically less than (car B). */) (Lisp_Object a, Lisp_Object b) { - return Flss (Fcar (a), Fcar (b)); + Lisp_Object args[2] = { Fcar (a), Fcar (b), }; + return Flss (2, args); } /* Build the complete list of annotations appropriate for writing out diff --git a/src/filelock.c b/src/filelock.c index df72eff5950..2f53047f526 100644 --- a/src/filelock.c +++ b/src/filelock.c @@ -459,10 +459,18 @@ lock_file_1 (char *lfname, bool force) char lock_info_str[MAX_LFINFO + 1]; printmax_t pid = getpid (); - if (sizeof lock_info_str - <= snprintf (lock_info_str, sizeof lock_info_str, - boot ? "%s@%s.%"pMd":%"pMd : "%s@%s.%"pMd, - user_name, host_name, pid, boot)) + if (boot) + { + if (sizeof lock_info_str + <= snprintf (lock_info_str, sizeof lock_info_str, + "%s@%s.%"pMd":%"pMd, + user_name, host_name, pid, boot)) + return ENAMETOOLONG; + } + else if (sizeof lock_info_str + <= snprintf (lock_info_str, sizeof lock_info_str, + "%s@%s.%"pMd, + user_name, host_name, pid)) return ENAMETOOLONG; return create_lock_file (lfname, lock_info_str, force); diff --git a/src/fns.c b/src/fns.c index de90fd731fb..e4618919640 100644 --- a/src/fns.c +++ b/src/fns.c @@ -1604,7 +1604,7 @@ changing the value of a sequence `foo'. */) for (i = n = 0; i < ASIZE (seq); ++i) if (NILP (Fequal (AREF (seq, i), elt))) - p->contents[n++] = AREF (seq, i); + p->u.contents[n++] = AREF (seq, i); XSETVECTOR (seq, p); } @@ -3450,7 +3450,7 @@ larger_vector (Lisp_Object vec, ptrdiff_t incr_min, ptrdiff_t nitems_max) { struct Lisp_Vector *v; ptrdiff_t i, incr, incr_max, old_size, new_size; - ptrdiff_t C_language_max = min (PTRDIFF_MAX, SIZE_MAX) / sizeof *v->contents; + ptrdiff_t C_language_max = min (PTRDIFF_MAX, SIZE_MAX) / sizeof *v->u.contents; ptrdiff_t n_max = (0 <= nitems_max && nitems_max < C_language_max ? nitems_max : C_language_max); eassert (VECTORP (vec)); @@ -3462,9 +3462,9 @@ larger_vector (Lisp_Object vec, ptrdiff_t incr_min, ptrdiff_t nitems_max) memory_full (SIZE_MAX); new_size = old_size + incr; v = allocate_vector (new_size); - memcpy (v->contents, XVECTOR (vec)->contents, old_size * sizeof *v->contents); + memcpy (v->u.contents, XVECTOR (vec)->u.contents, old_size * sizeof *v->u.contents); for (i = old_size; i < new_size; ++i) - v->contents[i] = Qnil; + v->u.contents[i] = Qnil; XSETVECTOR (vec, v); return vec; } diff --git a/src/font.c b/src/font.c index 49398e1b876..68db9f2ef2d 100644 --- a/src/font.c +++ b/src/font.c @@ -2861,19 +2861,19 @@ font_open_entity (struct frame *f, Lisp_Object entity, int pixel_size) : 1); height = (font->height ? font->height : 1); #ifdef HAVE_WINDOW_SYSTEM - FRAME_X_DISPLAY_INFO (f)->n_fonts++; - if (FRAME_X_DISPLAY_INFO (f)->n_fonts == 1) + FRAME_DISPLAY_INFO (f)->n_fonts++; + if (FRAME_DISPLAY_INFO (f)->n_fonts == 1) { FRAME_SMALLEST_CHAR_WIDTH (f) = min_width; FRAME_SMALLEST_FONT_HEIGHT (f) = height; - fonts_changed_p = 1; + f->fonts_changed = 1; } else { if (FRAME_SMALLEST_CHAR_WIDTH (f) > min_width) - FRAME_SMALLEST_CHAR_WIDTH (f) = min_width, fonts_changed_p = 1; + FRAME_SMALLEST_CHAR_WIDTH (f) = min_width, f->fonts_changed = 1; if (FRAME_SMALLEST_FONT_HEIGHT (f) > height) - FRAME_SMALLEST_FONT_HEIGHT (f) = height, fonts_changed_p = 1; + FRAME_SMALLEST_FONT_HEIGHT (f) = height, f->fonts_changed = 1; } #endif @@ -2894,8 +2894,8 @@ font_close_object (struct frame *f, Lisp_Object font_object) FONT_ADD_LOG ("close", font_object, Qnil); font->driver->close (f, font); #ifdef HAVE_WINDOW_SYSTEM - eassert (FRAME_X_DISPLAY_INFO (f)->n_fonts); - FRAME_X_DISPLAY_INFO (f)->n_fonts--; + eassert (FRAME_DISPLAY_INFO (f)->n_fonts); + FRAME_DISPLAY_INFO (f)->n_fonts--; #endif } @@ -5197,9 +5197,6 @@ EMACS_FONT_LOG is set. Otherwise, it is set to t. */); #ifdef HAVE_NTGUI syms_of_w32font (); #endif /* HAVE_NTGUI */ -#ifdef HAVE_NS - syms_of_nsfont (); -#endif /* HAVE_NS */ #endif /* HAVE_WINDOW_SYSTEM */ } diff --git a/src/font.h b/src/font.h index 3e0d97baaac..0ec56590916 100644 --- a/src/font.h +++ b/src/font.h @@ -825,6 +825,7 @@ extern void syms_of_w32font (void); extern Lisp_Object Qfontsize; extern struct font_driver nsfont_driver; extern void syms_of_nsfont (void); +extern void syms_of_macfont (void); #endif /* HAVE_NS */ #ifndef FONT_DEBUG diff --git a/src/fontset.c b/src/fontset.c index a6277b050d5..15fdf9f41a0 100644 --- a/src/fontset.c +++ b/src/fontset.c @@ -39,17 +39,10 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "intervals.h" #include "fontset.h" #include "window.h" -#ifdef HAVE_X_WINDOWS -#include "xterm.h" -#endif -#ifdef HAVE_NTGUI -#include "w32term.h" -#endif -#ifdef HAVE_NS -#include "nsterm.h" -#endif +#ifdef HAVE_WINDOW_SYSTEM +#include TERM_HEADER +#endif /* HAVE_WINDOW_SYSTEM */ #include "termhooks.h" - #include "font.h" /* FONTSET @@ -460,7 +453,7 @@ reorder_font_vector (Lisp_Object font_group, struct font *font) } if (score_changed) - qsort (XVECTOR (vec)->contents, size, word_size, + qsort (XVECTOR (vec)->u.contents, size, word_size, fontset_compare_rfontdef); XSETCAR (font_group, make_number (charset_ordered_list_tick)); } diff --git a/src/frame.c b/src/frame.c index b4638ed53c8..2e90713b6c3 100644 --- a/src/frame.c +++ b/src/frame.c @@ -19,8 +19,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> -#define FRAME_INLINE EXTERN_INLINE - #include <stdio.h> #include <errno.h> #include <limits.h> @@ -115,6 +113,19 @@ static Lisp_Object Qdelete_frame_functions; static Lisp_Object Qgeometry, Qworkarea, Qmm_size, Qframes, Qsource; +/* The currently selected frame. */ + +Lisp_Object selected_frame; + +/* A frame which is not just a mini-buffer, or NULL if there are no such + frames. This is usually the most recent such frame that was selected. */ + +static struct frame *last_nonminibuf_frame; + +/* Nonzero means there is at least one garbaged frame. */ + +bool frame_garbaged; + #ifdef HAVE_WINDOW_SYSTEM static void x_report_frame_params (struct frame *, Lisp_Object *); #endif @@ -224,7 +235,7 @@ set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) FRAME_WINDOW_SIZES_CHANGED (f) = 1; FRAME_MENU_BAR_LINES (f) = nlines; set_menu_bar_lines_1 (f->root_window, nlines - olines); - adjust_glyphs (f); + adjust_frame_glyphs (f); } } @@ -548,6 +559,8 @@ make_initial_frame (void) if (!noninteractive) init_frame_faces (f); + last_nonminibuf_frame = f; + return f; } @@ -712,7 +725,7 @@ affects all frames on the same terminal device. */) change_frame_size (f, height, width, 0, 0, 0); } - adjust_glyphs (f); + adjust_frame_glyphs (f); calculate_costs (f); XSETFRAME (frame, f); @@ -1108,7 +1121,7 @@ other_visible_frames (struct frame *f) /* Verify that we can still talk to the frame's X window, and note any recent change in visibility. */ -#ifdef HAVE_WINDOW_SYSTEM +#ifdef HAVE_X_WINDOWS if (FRAME_WINDOW_P (XFRAME (this))) x_sync (XFRAME (this)); #endif @@ -1901,6 +1914,17 @@ See `redirect-frame-focus'. */) return FRAME_FOCUS_FRAME (decode_live_frame (frame)); } +DEFUN ("x-focus-frame", Fx_focus_frame, Sx_focus_frame, 1, 1, 0, + doc: /* Set the input focus to FRAME. +FRAME nil means use the selected frame. +If there is no window system support, this function does nothing. */) + (Lisp_Object frame) +{ +#ifdef HAVE_WINDOW_SYSTEM + x_focus_frame (decode_window_system_frame (frame)); +#endif + return Qnil; +} /* Return the value of frame parameter PROP in frame FRAME. */ @@ -2207,7 +2231,7 @@ If FRAME is nil, describe the currently selected frame. */) value = f->name; #ifdef HAVE_X_WINDOWS else if (EQ (parameter, Qdisplay) && FRAME_X_P (f)) - value = XCAR (FRAME_X_DISPLAY_INFO (f)->name_list_element); + value = XCAR (FRAME_DISPLAY_INFO (f)->name_list_element); #endif /* HAVE_X_WINDOWS */ else if (EQ (parameter, Qbackground_color) || EQ (parameter, Qforeground_color)) @@ -2598,7 +2622,7 @@ x_fullscreen_adjust (struct frame *f, int *width, int *height, int *top_pos, int { int newwidth = FRAME_COLS (f); int newheight = FRAME_LINES (f); - Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); *top_pos = f->top_pos; *left_pos = f->left_pos; @@ -2973,9 +2997,9 @@ x_report_frame_params (struct frame *f, Lisp_Object *alistptr) (FRAME_VISIBLE_P (f) ? Qt : FRAME_ICONIFIED_P (f) ? Qicon : Qnil)); store_in_alist (alistptr, Qdisplay, - XCAR (FRAME_X_DISPLAY_INFO (f)->name_list_element)); + XCAR (FRAME_DISPLAY_INFO (f)->name_list_element)); - if (FRAME_X_OUTPUT (f)->parent_desc == FRAME_X_DISPLAY_INFO (f)->root_window) + if (FRAME_X_OUTPUT (f)->parent_desc == FRAME_DISPLAY_INFO (f)->root_window) tem = Qnil; else tem = make_natnum ((uintptr_t) FRAME_X_OUTPUT (f)->parent_desc); @@ -3358,9 +3382,6 @@ x_set_scroll_bar_width (struct frame *f, Lisp_Object arg, Lisp_Object oldval) else if (RANGED_INTEGERP (1, arg, INT_MAX) && XFASTINT (arg) != FRAME_CONFIG_SCROLL_BAR_WIDTH (f)) { - if (XFASTINT (arg) <= 2 * VERTICAL_SCROLL_BAR_WIDTH_TRIM) - XSETINT (arg, 2 * VERTICAL_SCROLL_BAR_WIDTH_TRIM + 1); - FRAME_CONFIG_SCROLL_BAR_WIDTH (f) = XFASTINT (arg); FRAME_CONFIG_SCROLL_BAR_COLS (f) = (XFASTINT (arg) + wid-1) / wid; if (FRAME_X_WINDOW (f)) @@ -3373,22 +3394,6 @@ x_set_scroll_bar_width (struct frame *f, Lisp_Object arg, Lisp_Object oldval) XWINDOW (FRAME_SELECTED_WINDOW (f))->cursor.x = 0; } - - -/* Return non-nil if frame F wants a bitmap icon. */ - -Lisp_Object -x_icon_type (struct frame *f) -{ - Lisp_Object tem; - - tem = assq_no_quit (Qicon_type, f->param_alist); - if (CONSP (tem)) - return XCDR (tem); - else - return Qnil; -} - void x_set_alpha (struct frame *f, Lisp_Object arg, Lisp_Object oldval) { @@ -3440,7 +3445,33 @@ x_set_alpha (struct frame *f, Lisp_Object arg, Lisp_Object oldval) return; } - +#ifndef HAVE_NS + +/* Non-zero if mouse is grabbed on DPYINFO + and we know the frame where it is. */ + +bool x_mouse_grabbed (Display_Info *dpyinfo) +{ + return (dpyinfo->grabbed + && dpyinfo->last_mouse_frame + && FRAME_LIVE_P (dpyinfo->last_mouse_frame)); +} + +/* Re-highlight something with mouse-face properties + on DPYINFO using saved frame and mouse position. */ + +void +x_redo_mouse_highlight (Display_Info *dpyinfo) +{ + if (dpyinfo->last_mouse_motion_frame + && FRAME_LIVE_P (dpyinfo->last_mouse_motion_frame)) + note_mouse_highlight (dpyinfo->last_mouse_motion_frame, + dpyinfo->last_mouse_motion_x, + dpyinfo->last_mouse_motion_y); +} + +#endif /* HAVE_NS */ + /* Subroutines of creating an X frame. */ /* Make sure that Vx_resource_name is set to a reasonable value. @@ -3512,11 +3543,6 @@ validate_x_resource_name (void) } } - -extern char *x_get_string_resource (XrmDatabase, const char *, const char *); -extern Display_Info *check_x_display_info (Lisp_Object); - - /* Get specified attribute from resource database RDB. See Fx_get_resource below for other parameters. */ @@ -3631,7 +3657,7 @@ x_get_resource_string (const char *attribute, const char *class) esprintf (name_key, "%s.%s", SSDATA (Vinvocation_name), attribute); sprintf (class_key, "%s.%s", EMACS_CLASS, class); - result = x_get_string_resource (FRAME_X_DISPLAY_INFO (sf)->xrdb, + result = x_get_string_resource (FRAME_DISPLAY_INFO (sf)->xrdb, name_key, class_key); SAFE_FREE (); return result; @@ -3753,7 +3779,7 @@ x_frame_get_arg (struct frame *f, Lisp_Object alist, Lisp_Object param, const char *attribute, const char *class, enum resource_types type) { - return x_get_arg (FRAME_X_DISPLAY_INFO (f), + return x_get_arg (FRAME_DISPLAY_INFO (f), alist, param, attribute, class, type); } @@ -3767,7 +3793,7 @@ x_frame_get_and_record_arg (struct frame *f, Lisp_Object alist, { Lisp_Object value; - value = x_get_arg (FRAME_X_DISPLAY_INFO (f), alist, param, + value = x_get_arg (FRAME_DISPLAY_INFO (f), alist, param, attribute, class, type); if (! NILP (value) && ! EQ (value, Qunbound)) store_frame_param (f, param, value); @@ -3971,7 +3997,7 @@ x_figure_window_size (struct frame *f, Lisp_Object parms, bool toolbar_p) { register Lisp_Object tem0, tem1, tem2; long window_prompting = 0; - Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); /* Default values if we fall through. Actually, if that happens we should get @@ -4524,6 +4550,7 @@ automatically. See also `mouse-autoselect-window'. */); defsubr (&Svisible_frame_list); defsubr (&Sraise_frame); defsubr (&Slower_frame); + defsubr (&Sx_focus_frame); defsubr (&Sredirect_frame_focus); defsubr (&Sframe_focus); defsubr (&Sframe_parameters); diff --git a/src/frame.h b/src/frame.h index 17b6089120a..09e4112d3a2 100644 --- a/src/frame.h +++ b/src/frame.h @@ -27,9 +27,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "termhooks.h" INLINE_HEADER_BEGIN -#ifndef FRAME_INLINE -# define FRAME_INLINE INLINE -#endif enum vertical_scroll_bar_type { @@ -145,9 +142,15 @@ struct frame Lisp_Object menu_bar_window; #endif +#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS) /* A window used to display the tool-bar of a frame. */ Lisp_Object tool_bar_window; + /* Desired and current contents displayed in that window. */ + Lisp_Object desired_tool_bar_string; + Lisp_Object current_tool_bar_string; +#endif + /* Desired and current tool-bar items. */ Lisp_Object tool_bar_items; @@ -155,10 +158,6 @@ struct frame tool bar only supports top. */ Lisp_Object tool_bar_position; - /* Desired and current contents displayed in tool_bar_window. */ - Lisp_Object desired_tool_bar_string; - Lisp_Object current_tool_bar_string; - /* Beyond here, there should be no more Lisp_Object components. */ /* Cache of realized faces. */ @@ -185,10 +184,6 @@ struct frame Clear the frame in clear_garbaged_frames if set. */ unsigned resized_p : 1; - /* Set to non-zero in when we want for force a flush_display in - update_frame, usually after resizing the frame. */ - unsigned force_flush_display_p : 1; - /* Set to non-zero if the default face for the frame has been realized. Reset to zero whenever the default face changes. Used to see the difference between a font change and face change. */ @@ -201,15 +196,24 @@ struct frame /* Set to non-zero when current redisplay has updated frame. */ unsigned updated_p : 1; +#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS) /* Set to non-zero to minimize tool-bar height even when auto-resize-tool-bar is set to grow-only. */ unsigned minimize_tool_bar_window_p : 1; +#endif #if defined (USE_GTK) || defined (HAVE_NS) /* Nonzero means using a tool bar that comes from the toolkit. */ unsigned external_tool_bar : 1; #endif + /* Nonzero means that fonts have been loaded since the last glyph + matrix adjustments. */ + unsigned fonts_changed : 1; + + /* Nonzero means that cursor type has been changed. */ + unsigned cursor_type_changed : 1; + /* Margin at the top of the frame. Used to display the tool-bar. */ int tool_bar_lines; @@ -321,6 +325,11 @@ struct frame unsigned int external_menu_bar : 1; #endif +#if defined (HAVE_X_WINDOWS) + /* Used by x_wait_for_event when watching for an X event on this frame. */ + int wait_event_type; +#endif + /* Next two bitfields are mutually exclusive. They might both be zero if the frame has been made invisible without an icon. */ @@ -436,112 +445,114 @@ struct frame /* Most code should use these functions to set Lisp fields in struct frame. */ -FRAME_INLINE void +INLINE void fset_buffer_list (struct frame *f, Lisp_Object val) { f->buffer_list = val; } -FRAME_INLINE void +INLINE void fset_buried_buffer_list (struct frame *f, Lisp_Object val) { f->buried_buffer_list = val; } -FRAME_INLINE void +INLINE void fset_condemned_scroll_bars (struct frame *f, Lisp_Object val) { f->condemned_scroll_bars = val; } -FRAME_INLINE void -fset_current_tool_bar_string (struct frame *f, Lisp_Object val) -{ - f->current_tool_bar_string = val; -} -FRAME_INLINE void -fset_desired_tool_bar_string (struct frame *f, Lisp_Object val) -{ - f->desired_tool_bar_string = val; -} -FRAME_INLINE void +INLINE void fset_face_alist (struct frame *f, Lisp_Object val) { f->face_alist = val; } -FRAME_INLINE void +INLINE void fset_focus_frame (struct frame *f, Lisp_Object val) { f->focus_frame = val; } -FRAME_INLINE void +INLINE void fset_icon_name (struct frame *f, Lisp_Object val) { f->icon_name = val; } -FRAME_INLINE void +INLINE void fset_menu_bar_items (struct frame *f, Lisp_Object val) { f->menu_bar_items = val; } -FRAME_INLINE void +INLINE void fset_menu_bar_vector (struct frame *f, Lisp_Object val) { f->menu_bar_vector = val; } #if defined (HAVE_X_WINDOWS) && ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) -FRAME_INLINE void +INLINE void fset_menu_bar_window (struct frame *f, Lisp_Object val) { f->menu_bar_window = val; } #endif -FRAME_INLINE void +INLINE void fset_name (struct frame *f, Lisp_Object val) { f->name = val; } -FRAME_INLINE void +INLINE void fset_param_alist (struct frame *f, Lisp_Object val) { f->param_alist = val; } -FRAME_INLINE void +INLINE void fset_root_window (struct frame *f, Lisp_Object val) { f->root_window = val; } -FRAME_INLINE void +INLINE void fset_scroll_bars (struct frame *f, Lisp_Object val) { f->scroll_bars = val; } -FRAME_INLINE void +INLINE void fset_selected_window (struct frame *f, Lisp_Object val) { f->selected_window = val; } -FRAME_INLINE void +INLINE void fset_title (struct frame *f, Lisp_Object val) { f->title = val; } -FRAME_INLINE void +INLINE void fset_tool_bar_items (struct frame *f, Lisp_Object val) { f->tool_bar_items = val; } -FRAME_INLINE void +INLINE void fset_tool_bar_position (struct frame *f, Lisp_Object val) { f->tool_bar_position = val; } -FRAME_INLINE void +#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS) +INLINE void fset_tool_bar_window (struct frame *f, Lisp_Object val) { f->tool_bar_window = val; } +INLINE void +fset_current_tool_bar_string (struct frame *f, Lisp_Object val) +{ + f->current_tool_bar_string = val; +} +INLINE void +fset_desired_tool_bar_string (struct frame *f, Lisp_Object val) +{ + f->desired_tool_bar_string = val; +} +#endif /* HAVE_WINDOW_SYSTEM && !USE_GTK && !HAVE_NS */ #define NUMVAL(X) ((INTEGERP (X) || FLOATP (X)) ? XFLOATINT (X) : -1) -FRAME_INLINE double +INLINE double default_pixels_per_inch_x (void) { Lisp_Object v = (CONSP (Vdisplay_pixels_per_inch) @@ -550,7 +561,7 @@ default_pixels_per_inch_x (void) return NUMVAL (v) > 0 ? NUMVAL (v) : 72.0; } -FRAME_INLINE double +INLINE double default_pixels_per_inch_y (void) { Lisp_Object v = (CONSP (Vdisplay_pixels_per_inch) @@ -591,36 +602,6 @@ default_pixels_per_inch_y (void) #define FRAME_NS_P(f) ((f)->output_method == output_ns) #endif -/* Dots per inch of the screen the frame F is on. */ - -#ifdef HAVE_X_WINDOWS -#define FRAME_RES_X(f) \ - (eassert (FRAME_X_P (f)), FRAME_X_DISPLAY_INFO (f)->resx) -#define FRAME_RES_Y(f) \ - (eassert (FRAME_X_P (f)), FRAME_X_DISPLAY_INFO (f)->resy) -#endif - -#ifdef HAVE_NTGUI -#define FRAME_RES_X(f) \ - (eassert (FRAME_W32_P (f)), FRAME_W32_DISPLAY_INFO (f)->resx) -#define FRAME_RES_Y(f) \ - (eassert (FRAME_W32_P (f)), FRAME_W32_DISPLAY_INFO (f)->resy) -#endif - -#ifdef HAVE_NS -#define FRAME_RES_X(f) \ - (eassert (FRAME_NS_P (f)), FRAME_NS_DISPLAY_INFO (f)->resx) -#define FRAME_RES_Y(f) \ - (eassert (FRAME_NS_P (f)), FRAME_NS_DISPLAY_INFO (f)->resy) -#endif - -/* Defaults when no window system available. */ - -#ifndef FRAME_RES_X -#define FRAME_RES_X(f) default_pixels_per_inch_x () -#define FRAME_RES_Y(f) default_pixels_per_inch_y () -#endif - /* FRAME_WINDOW_P tests whether the frame is a window, and is defined to be the predicate for the window system being used. */ @@ -637,14 +618,32 @@ default_pixels_per_inch_y (void) #define FRAME_WINDOW_P(f) ((void) (f), 0) #endif +/* Dots per inch of the screen the frame F is on. */ + +#ifdef HAVE_WINDOW_SYSTEM + +#define FRAME_RES_X(f) \ + (eassert (FRAME_WINDOW_P (f)), FRAME_DISPLAY_INFO (f)->resx) +#define FRAME_RES_Y(f) \ + (eassert (FRAME_WINDOW_P (f)), FRAME_DISPLAY_INFO (f)->resy) + +#else /* !HAVE_WINDOW_SYSTEM */ + +/* Defaults when no window system available. */ + +#define FRAME_RES_X(f) default_pixels_per_inch_x () +#define FRAME_RES_Y(f) default_pixels_per_inch_y () + +#endif /* HAVE_WINDOW_SYSTEM */ + /* Return a pointer to the structure holding information about the region of text, if any, that is currently shown in mouse-face on frame F. We need to define two versions because a TTY-only build - does not have FRAME_X_DISPLAY_INFO. */ + does not have FRAME_DISPLAY_INFO. */ #ifdef HAVE_WINDOW_SYSTEM # define MOUSE_HL_INFO(F) \ (FRAME_WINDOW_P(F) \ - ? &FRAME_X_DISPLAY_INFO(F)->mouse_highlight \ + ? &FRAME_DISPLAY_INFO(F)->mouse_highlight \ : &(F)->output_data.tty->display_info->mouse_highlight) #else # define MOUSE_HL_INFO(F) \ @@ -926,6 +925,7 @@ default_pixels_per_inch_y (void) #define SET_FRAME_ICONIFIED(f, i) \ (f)->iconified = (eassert (0 <= (i) && (i) <= 1), (i)) +extern Lisp_Object selected_frame; extern Lisp_Object Qframep, Qframe_live_p; extern Lisp_Object Qtty, Qtty_type; extern Lisp_Object Qtty_color_mode; @@ -935,8 +935,6 @@ extern Lisp_Object Qnoelisp; /* Nonzero means there is at least one garbaged frame. */ extern bool frame_garbaged; -extern struct frame *last_nonminibuf_frame; - extern void set_menu_bar_lines (struct frame *, Lisp_Object, Lisp_Object); extern struct frame *decode_window_system_frame (Lisp_Object); extern struct frame *decode_live_frame (Lisp_Object); @@ -956,10 +954,6 @@ extern void frame_make_pointer_visible (void); extern Lisp_Object delete_frame (Lisp_Object, Lisp_Object); extern Lisp_Object Vframe_list; - -/* The currently selected frame. */ - -extern Lisp_Object selected_frame; /* Value is a pointer to the selected frame. If the selected frame isn't live, abort. */ @@ -1134,6 +1128,15 @@ extern Lisp_Object selected_frame; (FRAME_PIXEL_Y_TO_LINE (f, ((height) \ - FRAME_INTERNAL_BORDER_WIDTH (f)))) +/* Value is the smallest width of any character in any font on frame F. */ + +#define FRAME_SMALLEST_CHAR_WIDTH(f) \ + FRAME_DISPLAY_INFO (f)->smallest_char_width + +/* Value is the smallest height of any font on frame F. */ + +#define FRAME_SMALLEST_FONT_HEIGHT(f) \ + FRAME_DISPLAY_INFO (f)->smallest_font_height /*********************************************************************** Frame Parameters @@ -1219,8 +1222,6 @@ extern void x_set_vertical_scroll_bars (struct frame *, Lisp_Object, extern void x_set_scroll_bar_width (struct frame *, Lisp_Object, Lisp_Object); -extern Lisp_Object x_icon_type (struct frame *); - extern long x_figure_window_size (struct frame *, Lisp_Object, bool); extern void x_set_alpha (struct frame *, Lisp_Object, Lisp_Object); @@ -1236,7 +1237,6 @@ extern Lisp_Object display_x_get_resource (Display_Info *, extern void set_frame_menubar (struct frame *f, bool first_time, bool deep_p); extern void x_set_window_size (struct frame *f, int change_grav, int cols, int rows); -extern void x_sync (struct frame *); extern Lisp_Object x_get_focus_frame (struct frame *); extern void x_set_mouse_position (struct frame *f, int h, int v); extern void x_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y); @@ -1250,7 +1250,6 @@ extern void x_set_tool_bar_lines (struct frame *f, Lisp_Object oldval); extern void x_activate_menubar (struct frame *); extern void x_real_positions (struct frame *, int *, int *); -extern int x_bitmap_icon (struct frame *, Lisp_Object); extern void x_set_menu_bar_lines (struct frame *, Lisp_Object, Lisp_Object); @@ -1262,13 +1261,41 @@ extern void x_wm_set_icon_position (struct frame *, int, int); #if !defined USE_X_TOOLKIT extern char *x_get_resource_string (const char *, const char *); #endif -#endif +extern void x_sync (struct frame *); +#endif /* HAVE_X_WINDOWS */ extern void x_query_colors (struct frame *f, XColor *, int); extern void x_query_color (struct frame *f, XColor *); +extern void x_focus_frame (struct frame *); + +#ifndef HAVE_NS + +extern int x_bitmap_icon (struct frame *, Lisp_Object); + +/* Set F's bitmap icon, if specified among F's parameters. */ + +INLINE void +x_set_bitmap_icon (struct frame *f) +{ + Lisp_Object obj = assq_no_quit (Qicon_type, f->param_alist); + + if (CONSP (obj)) + x_bitmap_icon (f, XCDR (obj)); +} + +#endif /* !HAVE_NS */ #endif /* HAVE_WINDOW_SYSTEM */ - + +INLINE void +flush_frame (struct frame *f) +{ + struct redisplay_interface *rif = FRAME_RIF (f); + + if (rif && rif->flush_display) + rif->flush_display (f); +} + /*********************************************************************** Multimonitor data ***********************************************************************/ diff --git a/src/ftfont.c b/src/ftfont.c index 3636f86f5c4..4e58d83fd64 100644 --- a/src/ftfont.c +++ b/src/ftfont.c @@ -2425,7 +2425,7 @@ ftfont_shape_by_flt (Lisp_Object lgstring, struct font *font, } len = i; - lint_assume (len <= STRING_BYTES_BOUND); + assume (len <= STRING_BYTES_BOUND); if (with_variation_selector) { diff --git a/src/gfilenotify.c b/src/gfilenotify.c index 8f13c72df81..7415c3a2413 100644 --- a/src/gfilenotify.c +++ b/src/gfilenotify.c @@ -249,7 +249,9 @@ WATCH-DESCRIPTOR should be an object returned by `gfile-add-watch'. */) void globals_of_gfilenotify (void) { +#if ! GLIB_CHECK_VERSION (2, 36, 0) g_type_init (); +#endif watch_list = Qnil; } diff --git a/src/gtkutil.c b/src/gtkutil.c index 6228f2150f5..e20d01521f0 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -2737,7 +2737,7 @@ xg_create_widget (const char *type, const char *name, struct frame *f, { /* Must realize so the GdkWindow inside the widget is created. */ gtk_widget_realize (w); - xg_set_cursor (w, FRAME_X_DISPLAY_INFO (f)->xg_cursor); + xg_set_cursor (w, FRAME_DISPLAY_INFO (f)->xg_cursor); } } else @@ -3409,7 +3409,7 @@ free_frame_menubar (struct frame *f) } bool -xg_event_is_for_menubar (struct frame *f, XEvent *event) +xg_event_is_for_menubar (struct frame *f, const XEvent *event) { struct x_output *x = f->output_data.x; GList *iter; @@ -3676,7 +3676,7 @@ xg_create_scroll_bar (struct frame *f, /* Set the cursor to an arrow. */ - xg_set_cursor (webox, FRAME_X_DISPLAY_INFO (f)->xg_cursor); + xg_set_cursor (webox, FRAME_DISPLAY_INFO (f)->xg_cursor); bar->x_window = scroll_id; } @@ -3861,7 +3861,7 @@ xg_set_toolkit_scroll_bar_thumb (struct scroll_bar *bar, frame. This function does additional checks. */ bool -xg_event_is_for_scrollbar (struct frame *f, XEvent *event) +xg_event_is_for_scrollbar (struct frame *f, const XEvent *event) { bool retval = 0; @@ -3972,12 +3972,12 @@ xg_tool_bar_callback (GtkWidget *w, gpointer client_data) /* Convert between the modifier bits GDK uses and the modifier bits Emacs uses. This assumes GDK and X masks are the same, which they are when this is written. */ - event.modifiers = x_x_to_emacs_modifiers (FRAME_X_DISPLAY_INFO (f), mod); + event.modifiers = x_x_to_emacs_modifiers (FRAME_DISPLAY_INFO (f), mod); kbd_buffer_store_event (&event); - /* Return focus to the frame after we have clicked on a detached - tool bar button. */ - Fx_focus_frame (frame); + /* Return focus to the frame after we have clicked on a detached + tool bar button. */ + x_focus_frame (f); } /* Callback function invoked when a tool bar item is pressed in a detached diff --git a/src/gtkutil.h b/src/gtkutil.h index fc959862fd3..1c26d2aa44b 100644 --- a/src/gtkutil.h +++ b/src/gtkutil.h @@ -105,7 +105,7 @@ extern void xg_modify_menubar_widgets (GtkWidget *menubar, extern void xg_update_frame_menubar (struct frame *f); -extern bool xg_event_is_for_menubar (struct frame *f, XEvent *event); +extern bool xg_event_is_for_menubar (struct frame *, const XEvent *); extern bool xg_have_tear_offs (void); @@ -129,7 +129,7 @@ extern void xg_set_toolkit_scroll_bar_thumb (struct scroll_bar *bar, int portion, int position, int whole); -extern bool xg_event_is_for_scrollbar (struct frame *f, XEvent *event); +extern bool xg_event_is_for_scrollbar (struct frame *, const XEvent *); extern int xg_get_default_scrollbar_width (void); extern void update_frame_tool_bar (struct frame *f); diff --git a/src/image.c b/src/image.c index 1271376bcab..e429830cc96 100644 --- a/src/image.c +++ b/src/image.c @@ -161,13 +161,13 @@ XPutPixel (XImagePtr ximage, int x, int y, unsigned long pixel) int x_bitmap_height (struct frame *f, ptrdiff_t id) { - return FRAME_X_DISPLAY_INFO (f)->bitmaps[id - 1].height; + return FRAME_DISPLAY_INFO (f)->bitmaps[id - 1].height; } int x_bitmap_width (struct frame *f, ptrdiff_t id) { - return FRAME_X_DISPLAY_INFO (f)->bitmaps[id - 1].width; + return FRAME_DISPLAY_INFO (f)->bitmaps[id - 1].width; } #if defined (HAVE_X_WINDOWS) || defined (HAVE_NTGUI) @@ -175,7 +175,7 @@ ptrdiff_t x_bitmap_pixmap (struct frame *f, ptrdiff_t id) { /* HAVE_NTGUI needs the explicit cast here. */ - return (ptrdiff_t) FRAME_X_DISPLAY_INFO (f)->bitmaps[id - 1].pixmap; + return (ptrdiff_t) FRAME_DISPLAY_INFO (f)->bitmaps[id - 1].pixmap; } #endif @@ -183,7 +183,7 @@ x_bitmap_pixmap (struct frame *f, ptrdiff_t id) int x_bitmap_mask (struct frame *f, ptrdiff_t id) { - return FRAME_X_DISPLAY_INFO (f)->bitmaps[id - 1].mask; + return FRAME_DISPLAY_INFO (f)->bitmaps[id - 1].mask; } #endif @@ -192,7 +192,7 @@ x_bitmap_mask (struct frame *f, ptrdiff_t id) static ptrdiff_t x_allocate_bitmap_record (struct frame *f) { - Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); ptrdiff_t i; if (dpyinfo->bitmaps_last < dpyinfo->bitmaps_size) @@ -213,7 +213,7 @@ x_allocate_bitmap_record (struct frame *f) void x_reference_bitmap (struct frame *f, ptrdiff_t id) { - ++FRAME_X_DISPLAY_INFO (f)->bitmaps[id - 1].refcount; + ++FRAME_DISPLAY_INFO (f)->bitmaps[id - 1].refcount; } /* Create a bitmap for frame F from a HEIGHT x WIDTH array of bits at BITS. */ @@ -221,7 +221,7 @@ x_reference_bitmap (struct frame *f, ptrdiff_t id) ptrdiff_t x_create_bitmap_from_data (struct frame *f, char *bits, unsigned int width, unsigned int height) { - Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); ptrdiff_t id; #ifdef HAVE_X_WINDOWS @@ -235,8 +235,8 @@ x_create_bitmap_from_data (struct frame *f, char *bits, unsigned int width, unsi #ifdef HAVE_NTGUI Pixmap bitmap; bitmap = CreateBitmap (width, height, - FRAME_X_DISPLAY_INFO (XFRAME (frame))->n_planes, - FRAME_X_DISPLAY_INFO (XFRAME (frame))->n_cbits, + FRAME_DISPLAY_INFO (XFRAME (frame))->n_planes, + FRAME_DISPLAY_INFO (XFRAME (frame))->n_cbits, bits); if (! bitmap) return -1; @@ -280,7 +280,7 @@ x_create_bitmap_from_data (struct frame *f, char *bits, unsigned int width, unsi ptrdiff_t x_create_bitmap_from_file (struct frame *f, Lisp_Object file) { - Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); #ifdef HAVE_NTGUI return -1; /* W32_TODO : bitmap support */ @@ -379,7 +379,7 @@ free_bitmap_record (Display_Info *dpyinfo, Bitmap_Record *bm) void x_destroy_bitmap (struct frame *f, ptrdiff_t id) { - Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); if (id > 0) { @@ -454,7 +454,7 @@ x_create_bitmap_mask (struct frame *f, ptrdiff_t id) unsigned long x, y, xp, xm, yp, ym; GC gc; - Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); if (!(id > 0)) return; @@ -3421,7 +3421,7 @@ xpm_image_p (Lisp_Object object) ptrdiff_t x_create_bitmap_from_xpm_data (struct frame *f, const char **bits) { - Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); ptrdiff_t id; int rc; XpmAttributes attrs; @@ -4325,7 +4325,7 @@ lookup_rgb_color (struct frame *f, int r, int g, int b) two orders of magnitude. Freeing colors on TrueColor visuals is a nop, and pixel colors specify RGB values directly. See also the Xlib spec, chapter 3.1. */ - dpyinfo = FRAME_X_DISPLAY_INFO (f); + dpyinfo = FRAME_DISPLAY_INFO (f); if (dpyinfo->red_bits > 0) { unsigned long pr, pg, pb; @@ -4820,7 +4820,7 @@ x_edge_detection (struct frame *f, struct image *img, Lisp_Object matrix, static void x_disable_image (struct frame *f, struct image *img) { - Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); #ifdef HAVE_NTGUI int n_planes = dpyinfo->n_planes * dpyinfo->n_cbits; #else @@ -7523,7 +7523,7 @@ gif_load (struct frame *f, struct image *img) { while (subimg_height <= row) { - lint_assume (pass < 3); + assume (pass < 3); row = interlace_start[++pass]; } @@ -8590,7 +8590,9 @@ DEF_IMGLIB_FN (int, gdk_pixbuf_get_n_channels, (const GdkPixbuf *)); DEF_IMGLIB_FN (gboolean, gdk_pixbuf_get_has_alpha, (const GdkPixbuf *)); DEF_IMGLIB_FN (int, gdk_pixbuf_get_bits_per_sample, (const GdkPixbuf *)); +#if ! GLIB_CHECK_VERSION (2, 36, 0) DEF_IMGLIB_FN (void, g_type_init, (void)); +#endif DEF_IMGLIB_FN (void, g_object_unref, (gpointer)); DEF_IMGLIB_FN (void, g_error_free, (GError *)); @@ -8622,7 +8624,9 @@ init_svg_functions (void) LOAD_IMGLIB_FN (gdklib, gdk_pixbuf_get_has_alpha); LOAD_IMGLIB_FN (gdklib, gdk_pixbuf_get_bits_per_sample); +#if ! GLIB_CHECK_VERSION (2, 36, 0) LOAD_IMGLIB_FN (gobject, g_type_init); +#endif LOAD_IMGLIB_FN (gobject, g_object_unref); LOAD_IMGLIB_FN (glib, g_error_free); @@ -8647,7 +8651,9 @@ init_svg_functions (void) #define fn_gdk_pixbuf_get_has_alpha gdk_pixbuf_get_has_alpha #define fn_gdk_pixbuf_get_bits_per_sample gdk_pixbuf_get_bits_per_sample +#if ! GLIB_CHECK_VERSION (2, 36, 0) #define fn_g_type_init g_type_init +#endif #define fn_g_object_unref g_object_unref #define fn_g_error_free g_error_free #endif /* !WINDOWSNT */ @@ -8732,9 +8738,12 @@ svg_load_image (struct frame *f, /* Pointer to emacs frame structure. * int x; int y; - /* g_type_init is a glib function that must be called prior to using - gnome type library functions. */ +#if ! GLIB_CHECK_VERSION (2, 36, 0) + /* g_type_init is a glib function that must be called prior to + using gnome type library functions (obsolete since 2.36.0). */ fn_g_type_init (); +#endif + /* Make a handle to a new rsvg object. */ rsvg_handle = fn_rsvg_handle_new (); diff --git a/src/indent.c b/src/indent.c index 891b42788ed..d956e627ba9 100644 --- a/src/indent.c +++ b/src/indent.c @@ -118,7 +118,7 @@ disptab_matches_widthtab (struct Lisp_Char_Table *disptab, struct Lisp_Vector *w for (i = 0; i < 256; i++) if (character_width (i, disptab) - != XFASTINT (widthtab->contents[i])) + != XFASTINT (widthtab->u.contents[i])) return 0; return 1; @@ -138,7 +138,7 @@ recompute_width_table (struct buffer *buf, struct Lisp_Char_Table *disptab) eassert (widthtab->header.size == 256); for (i = 0; i < 256; i++) - XSETFASTINT (widthtab->contents[i], character_width (i, disptab)); + XSETFASTINT (widthtab->u.contents[i], character_width (i, disptab)); } /* Allocate or free the width run cache, as requested by the @@ -1136,7 +1136,7 @@ compute_motion (ptrdiff_t from, ptrdiff_t frombyte, EMACS_INT fromvpos, width_run_cache_on_off (); if (dp == buffer_display_table ()) width_table = (VECTORP (BVAR (current_buffer, width_table)) - ? XVECTOR (BVAR (current_buffer, width_table))->contents + ? XVECTOR (BVAR (current_buffer, width_table))->u.contents : 0); else /* If the window has its own display table, we can't use the width diff --git a/src/insdel.c b/src/insdel.c index f746fd34330..ebd096a2927 100644 --- a/src/insdel.c +++ b/src/insdel.c @@ -1057,6 +1057,9 @@ insert_from_buffer_1 (struct buffer *buf, ptrdiff_t outgoing_nbytes = incoming_nbytes; INTERVAL intervals; + if (nchars == 0) + return; + /* Make OUTGOING_NBYTES describe the text as it will be inserted in this buffer. */ diff --git a/src/intervals.c b/src/intervals.c index ded536ca3c8..69a33867283 100644 --- a/src/intervals.c +++ b/src/intervals.c @@ -40,8 +40,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> -#define INTERVALS_INLINE EXTERN_INLINE - #include <intprops.h> #include "lisp.h" #include "intervals.h" @@ -1407,7 +1405,7 @@ offset_intervals (struct buffer *buffer, ptrdiff_t start, ptrdiff_t length) start, length); else { - lint_assume (- TYPE_MAXIMUM (ptrdiff_t) <= length); + assume (- TYPE_MAXIMUM (ptrdiff_t) <= length); adjust_intervals_for_deletion (buffer, start, -length); } } diff --git a/src/intervals.h b/src/intervals.h index a38e83cf10e..51dfa09c5c4 100644 --- a/src/intervals.h +++ b/src/intervals.h @@ -19,9 +19,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "dispextern.h" INLINE_HEADER_BEGIN -#ifndef INTERVALS_INLINE -# define INTERVALS_INLINE INLINE -#endif /* Basic data type for use of intervals. */ @@ -136,14 +133,14 @@ struct interval /* Use these functions to set Lisp_Object or pointer slots of struct interval. */ -INTERVALS_INLINE void +INLINE void set_interval_parent (INTERVAL i, INTERVAL parent) { i->up_obj = 0; i->up.interval = parent; } -INTERVALS_INLINE void +INLINE void set_interval_plist (INTERVAL i, Lisp_Object plist) { i->plist = plist; diff --git a/src/keyboard.c b/src/keyboard.c index fad04920e2e..a595742ace8 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -20,9 +20,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> -#define BLOCKINPUT_INLINE EXTERN_INLINE -#define KEYBOARD_INLINE EXTERN_INLINE - #include "sysstdio.h" #include "lisp.h" @@ -2624,10 +2621,8 @@ read_char (int commandflag, Lisp_Object map, if (/* There currently is something in the echo area. */ !NILP (echo_area_buffer[0]) - && (/* And it's either not from echoing. */ - !EQ (echo_area_buffer[0], echo_message_buffer) - /* Or it's an echo from a different kboard. */ - || echo_kboard != current_kboard + && (/* It's an echo from a different kboard. */ + echo_kboard != current_kboard /* Or we explicitly allow overwriting whatever there is. */ || ok_to_echo_at_next_pause == NULL)) cancel_echoing (); @@ -4389,7 +4384,7 @@ decode_timer (Lisp_Object timer, struct timespec *result) if (! (VECTORP (timer) && ASIZE (timer) == 9)) return 0; - vector = XVECTOR (timer)->contents; + vector = XVECTOR (timer)->u.contents; if (! NILP (vector[0])) return 0; @@ -8046,7 +8041,7 @@ process_tool_bar_item (Lisp_Object key, Lisp_Object def, Lisp_Object data, void discard any previously made item. */ for (i = 0; i < ntool_bar_items; i += TOOL_BAR_ITEM_NSLOTS) { - Lisp_Object *v = XVECTOR (tool_bar_items_vector)->contents + i; + Lisp_Object *v = XVECTOR (tool_bar_items_vector)->u.contents + i; if (EQ (key, v[TOOL_BAR_ITEM_KEY])) { @@ -8370,7 +8365,7 @@ append_tool_bar_item (void) /* Append entries from tool_bar_item_properties to the end of tool_bar_items_vector. */ vcopy (tool_bar_items_vector, ntool_bar_items, - XVECTOR (tool_bar_item_properties)->contents, TOOL_BAR_ITEM_NSLOTS); + XVECTOR (tool_bar_item_properties)->u.contents, TOOL_BAR_ITEM_NSLOTS); ntool_bar_items += TOOL_BAR_ITEM_NSLOTS; } @@ -9921,20 +9916,7 @@ detect_input_pending_run_timers (bool do_display) get_input_pending (READABLE_EVENTS_DO_TIMERS_NOW); if (old_timers_run != timers_run && do_display) - { - redisplay_preserve_echo_area (8); - /* The following fixes a bug when using lazy-lock with - lazy-lock-defer-on-the-fly set to t, i.e. when fontifying - from an idle timer function. The symptom of the bug is that - the cursor sometimes doesn't become visible until the next X - event is processed. --gerd. */ - { - Lisp_Object tail, frame; - FOR_EACH_FRAME (tail, frame) - if (FRAME_RIF (XFRAME (frame))) - FRAME_RIF (XFRAME (frame))->flush_display (XFRAME (frame)); - } - } + redisplay_preserve_echo_area (8); return input_pending; } @@ -9985,7 +9967,7 @@ DEFUN ("recent-keys", Frecent_keys, Srecent_keys, 0, 0, 0, doc: /* Return vector of last 300 events, not counting those from keyboard macros. */) (void) { - Lisp_Object *keys = XVECTOR (recent_keys)->contents; + Lisp_Object *keys = XVECTOR (recent_keys)->u.contents; Lisp_Object val; if (total_keys < NUM_RECENT_KEYS) @@ -10011,7 +9993,7 @@ See also `this-command-keys-vector'. */) (void) { return make_event_array (this_command_key_count, - XVECTOR (this_command_keys)->contents); + XVECTOR (this_command_keys)->u.contents); } DEFUN ("this-command-keys-vector", Fthis_command_keys_vector, Sthis_command_keys_vector, 0, 0, 0, @@ -10023,7 +10005,7 @@ See also `this-command-keys'. */) (void) { return Fvector (this_command_key_count, - XVECTOR (this_command_keys)->contents); + XVECTOR (this_command_keys)->u.contents); } DEFUN ("this-single-command-keys", Fthis_single_command_keys, @@ -10038,7 +10020,7 @@ The value is always a vector. */) { return Fvector (this_command_key_count - this_single_command_key_start, - (XVECTOR (this_command_keys)->contents + (XVECTOR (this_command_keys)->u.contents + this_single_command_key_start)); } @@ -10052,8 +10034,7 @@ shows the events before all translations (except for input methods). The value is always a vector. */) (void) { - return Fvector (raw_keybuf_count, - (XVECTOR (raw_keybuf)->contents)); + return Fvector (raw_keybuf_count, XVECTOR (raw_keybuf)->u.contents); } DEFUN ("reset-this-command-lengths", Freset_this_command_lengths, diff --git a/src/keyboard.h b/src/keyboard.h index b015f3fe4d3..8a8505e406b 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -22,9 +22,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "termhooks.h" INLINE_HEADER_BEGIN -#ifndef KEYBOARD_INLINE -# define KEYBOARD_INLINE INLINE -#endif /* Most code should use this macro to access Lisp fields in struct kboard. */ @@ -179,42 +176,42 @@ struct kboard ptrdiff_t echo_after_prompt; }; -KEYBOARD_INLINE void +INLINE void kset_default_minibuffer_frame (struct kboard *kb, Lisp_Object val) { kb->INTERNAL_FIELD (Vdefault_minibuffer_frame) = val; } -KEYBOARD_INLINE void +INLINE void kset_defining_kbd_macro (struct kboard *kb, Lisp_Object val) { kb->INTERNAL_FIELD (defining_kbd_macro) = val; } -KEYBOARD_INLINE void +INLINE void kset_input_decode_map (struct kboard *kb, Lisp_Object val) { kb->INTERNAL_FIELD (Vinput_decode_map) = val; } -KEYBOARD_INLINE void +INLINE void kset_last_command (struct kboard *kb, Lisp_Object val) { kb->INTERNAL_FIELD (Vlast_command) = val; } -KEYBOARD_INLINE void +INLINE void kset_last_kbd_macro (struct kboard *kb, Lisp_Object val) { kb->INTERNAL_FIELD (Vlast_kbd_macro) = val; } -KEYBOARD_INLINE void +INLINE void kset_prefix_arg (struct kboard *kb, Lisp_Object val) { kb->INTERNAL_FIELD (Vprefix_arg) = val; } -KEYBOARD_INLINE void +INLINE void kset_system_key_alist (struct kboard *kb, Lisp_Object val) { kb->INTERNAL_FIELD (Vsystem_key_alist) = val; } -KEYBOARD_INLINE void +INLINE void kset_window_system (struct kboard *kb, Lisp_Object val) { kb->INTERNAL_FIELD (Vwindow_system) = val; diff --git a/src/lisp.h b/src/lisp.h index 27359ffeb3f..63597e86be6 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -33,9 +33,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <intprops.h> INLINE_HEADER_BEGIN -#ifndef LISP_INLINE -# define LISP_INLINE INLINE -#endif /* The ubiquitous max and min macros. */ #undef min @@ -134,6 +131,13 @@ extern bool suppress_checking EXTERNALLY_VISIBLE; ? (void) 0 \ : die (# cond, __FILE__, __LINE__)) #endif /* ENABLE_CHECKING */ + +/* When checking is enabled, identical to eassert. When checking is + * disabled, instruct the compiler (when the compiler has such + * capability) to assume that cond is true and optimize + * accordingly. */ +#define eassert_and_assume(cond) (eassert (cond), assume (cond)) + /* Use the configure flag --enable-check-lisp-object-type to make Lisp_Object use a struct type instead of the default int. The flag @@ -345,11 +349,11 @@ enum enum_USE_LSB_TAG { USE_LSB_TAG = 0 }; ARGS should be parenthesized. Implement the function by calling lisp_h_NAME ARGS. */ #define LISP_MACRO_DEFUN(name, type, argdecls, args) \ - LISP_INLINE type (name) argdecls { return lisp_h_##name args; } + INLINE type (name) argdecls { return lisp_h_##name args; } /* like LISP_MACRO_DEFUN, except NAME returns void. */ #define LISP_MACRO_DEFUN_VOID(name, argdecls, args) \ - LISP_INLINE void (name) argdecls { lisp_h_##name args; } + INLINE void (name) argdecls { lisp_h_##name args; } /* Define the fundamental Lisp data structures. */ @@ -610,14 +614,14 @@ LISP_MACRO_DEFUN (XUNTAG, void *, (Lisp_Object a, int type), (a, type)) /* Make a Lisp integer representing the value of the low order bits of N. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object make_number (EMACS_INT n) { return XIL (USE_LSB_TAG ? n << INTTYPEBITS : n & INTMASK); } /* Extract A's value as a signed integer. */ -LISP_INLINE EMACS_INT +INLINE EMACS_INT XINT (Lisp_Object a) { EMACS_INT i = XLI (a); @@ -627,7 +631,7 @@ XINT (Lisp_Object a) /* Like XINT (A), but may be faster. A must be nonnegative. If ! USE_LSB_TAG, this takes advantage of the fact that Lisp integers have zero-bits in their tags. */ -LISP_INLINE EMACS_INT +INLINE EMACS_INT XFASTINT (Lisp_Object a) { EMACS_INT n = USE_LSB_TAG ? XINT (a) : XLI (a); @@ -636,7 +640,7 @@ XFASTINT (Lisp_Object a) } /* Extract A's type. */ -LISP_INLINE enum Lisp_Type +INLINE enum Lisp_Type XTYPE (Lisp_Object a) { EMACS_UINT i = XLI (a); @@ -644,7 +648,7 @@ XTYPE (Lisp_Object a) } /* Extract A's pointer value, assuming A's type is TYPE. */ -LISP_INLINE void * +INLINE void * XUNTAG (Lisp_Object a, int type) { if (USE_LSB_TAG) @@ -658,7 +662,7 @@ XUNTAG (Lisp_Object a, int type) #endif /* ! USE_LSB_TAG */ /* Extract A's value as an unsigned integer. */ -LISP_INLINE EMACS_UINT +INLINE EMACS_UINT XUINT (Lisp_Object a) { EMACS_UINT i = XLI (a); @@ -671,7 +675,7 @@ XUINT (Lisp_Object a) LISP_MACRO_DEFUN (XHASH, EMACS_INT, (Lisp_Object a), (a)) /* Like make_number (N), but may be faster. N must be in nonnegative range. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object make_natnum (EMACS_INT n) { eassert (0 <= n && n <= MOST_POSITIVE_FIXNUM); @@ -688,7 +692,7 @@ LISP_MACRO_DEFUN (EQ, bool, (Lisp_Object x, Lisp_Object y), (x, y)) #define FIXNUM_OVERFLOW_P(i) \ (! ((0 <= (i) || MOST_NEGATIVE_FIXNUM <= (i)) && (i) <= MOST_POSITIVE_FIXNUM)) -LISP_INLINE ptrdiff_t +INLINE ptrdiff_t clip_to_bounds (ptrdiff_t lower, EMACS_INT num, ptrdiff_t upper) { return num < lower ? lower : num <= upper ? num : upper; @@ -698,31 +702,31 @@ clip_to_bounds (ptrdiff_t lower, EMACS_INT num, ptrdiff_t upper) /* Defined in this file. */ union Lisp_Fwd; -LISP_INLINE bool BOOL_VECTOR_P (Lisp_Object); -LISP_INLINE bool BUFFER_OBJFWDP (union Lisp_Fwd *); -LISP_INLINE bool BUFFERP (Lisp_Object); -LISP_INLINE bool CHAR_TABLE_P (Lisp_Object); -LISP_INLINE Lisp_Object CHAR_TABLE_REF_ASCII (Lisp_Object, ptrdiff_t); -LISP_INLINE bool (CONSP) (Lisp_Object); -LISP_INLINE bool (FLOATP) (Lisp_Object); -LISP_INLINE bool functionp (Lisp_Object); -LISP_INLINE bool (INTEGERP) (Lisp_Object); -LISP_INLINE bool (MARKERP) (Lisp_Object); -LISP_INLINE bool (MISCP) (Lisp_Object); -LISP_INLINE bool (NILP) (Lisp_Object); -LISP_INLINE bool OVERLAYP (Lisp_Object); -LISP_INLINE bool PROCESSP (Lisp_Object); -LISP_INLINE bool PSEUDOVECTORP (Lisp_Object, int); -LISP_INLINE bool SAVE_VALUEP (Lisp_Object); -LISP_INLINE void set_sub_char_table_contents (Lisp_Object, ptrdiff_t, +INLINE bool BOOL_VECTOR_P (Lisp_Object); +INLINE bool BUFFER_OBJFWDP (union Lisp_Fwd *); +INLINE bool BUFFERP (Lisp_Object); +INLINE bool CHAR_TABLE_P (Lisp_Object); +INLINE Lisp_Object CHAR_TABLE_REF_ASCII (Lisp_Object, ptrdiff_t); +INLINE bool (CONSP) (Lisp_Object); +INLINE bool (FLOATP) (Lisp_Object); +INLINE bool functionp (Lisp_Object); +INLINE bool (INTEGERP) (Lisp_Object); +INLINE bool (MARKERP) (Lisp_Object); +INLINE bool (MISCP) (Lisp_Object); +INLINE bool (NILP) (Lisp_Object); +INLINE bool OVERLAYP (Lisp_Object); +INLINE bool PROCESSP (Lisp_Object); +INLINE bool PSEUDOVECTORP (Lisp_Object, int); +INLINE bool SAVE_VALUEP (Lisp_Object); +INLINE void set_sub_char_table_contents (Lisp_Object, ptrdiff_t, Lisp_Object); -LISP_INLINE bool STRINGP (Lisp_Object); -LISP_INLINE bool SUB_CHAR_TABLE_P (Lisp_Object); -LISP_INLINE bool SUBRP (Lisp_Object); -LISP_INLINE bool (SYMBOLP) (Lisp_Object); -LISP_INLINE bool (VECTORLIKEP) (Lisp_Object); -LISP_INLINE bool WINDOWP (Lisp_Object); -LISP_INLINE struct Lisp_Save_Value *XSAVE_VALUE (Lisp_Object); +INLINE bool STRINGP (Lisp_Object); +INLINE bool SUB_CHAR_TABLE_P (Lisp_Object); +INLINE bool SUBRP (Lisp_Object); +INLINE bool (SYMBOLP) (Lisp_Object); +INLINE bool (VECTORLIKEP) (Lisp_Object); +INLINE bool WINDOWP (Lisp_Object); +INLINE struct Lisp_Save_Value *XSAVE_VALUE (Lisp_Object); /* Defined in chartab.c. */ extern Lisp_Object char_table_ref (Lisp_Object, int); @@ -733,6 +737,7 @@ extern int char_table_translate (Lisp_Object, int); extern Lisp_Object Qarrayp, Qbufferp, Qbuffer_or_string_p, Qchar_table_p; extern Lisp_Object Qconsp, Qfloatp, Qintegerp, Qlambda, Qlistp, Qmarkerp, Qnil; extern Lisp_Object Qnumberp, Qstringp, Qsymbolp, Qvectorp; +extern Lisp_Object Qbool_vector_p; extern Lisp_Object Qvector_or_char_table_p, Qwholenump; extern Lisp_Object Qwindow; extern Lisp_Object Ffboundp (Lisp_Object); @@ -761,14 +766,14 @@ extern Lisp_Object Qimage; LISP_MACRO_DEFUN (XCONS, struct Lisp_Cons *, (Lisp_Object a), (a)) -LISP_INLINE struct Lisp_Vector * +INLINE struct Lisp_Vector * XVECTOR (Lisp_Object a) { eassert (VECTORLIKEP (a)); return XUNTAG (a, Lisp_Vectorlike); } -LISP_INLINE struct Lisp_String * +INLINE struct Lisp_String * XSTRING (Lisp_Object a) { eassert (STRINGP (a)); @@ -777,7 +782,7 @@ XSTRING (Lisp_Object a) LISP_MACRO_DEFUN (XSYMBOL, struct Lisp_Symbol *, (Lisp_Object a), (a)) -LISP_INLINE struct Lisp_Float * +INLINE struct Lisp_Float * XFLOAT (Lisp_Object a) { eassert (FLOATP (a)); @@ -786,55 +791,55 @@ XFLOAT (Lisp_Object a) /* Pseudovector types. */ -LISP_INLINE struct Lisp_Process * +INLINE struct Lisp_Process * XPROCESS (Lisp_Object a) { eassert (PROCESSP (a)); return XUNTAG (a, Lisp_Vectorlike); } -LISP_INLINE struct window * +INLINE struct window * XWINDOW (Lisp_Object a) { eassert (WINDOWP (a)); return XUNTAG (a, Lisp_Vectorlike); } -LISP_INLINE struct terminal * +INLINE struct terminal * XTERMINAL (Lisp_Object a) { return XUNTAG (a, Lisp_Vectorlike); } -LISP_INLINE struct Lisp_Subr * +INLINE struct Lisp_Subr * XSUBR (Lisp_Object a) { eassert (SUBRP (a)); return XUNTAG (a, Lisp_Vectorlike); } -LISP_INLINE struct buffer * +INLINE struct buffer * XBUFFER (Lisp_Object a) { eassert (BUFFERP (a)); return XUNTAG (a, Lisp_Vectorlike); } -LISP_INLINE struct Lisp_Char_Table * +INLINE struct Lisp_Char_Table * XCHAR_TABLE (Lisp_Object a) { eassert (CHAR_TABLE_P (a)); return XUNTAG (a, Lisp_Vectorlike); } -LISP_INLINE struct Lisp_Sub_Char_Table * +INLINE struct Lisp_Sub_Char_Table * XSUB_CHAR_TABLE (Lisp_Object a) { eassert (SUB_CHAR_TABLE_P (a)); return XUNTAG (a, Lisp_Vectorlike); } -LISP_INLINE struct Lisp_Bool_Vector * +INLINE struct Lisp_Bool_Vector * XBOOL_VECTOR (Lisp_Object a) { eassert (BOOL_VECTOR_P (a)); @@ -843,7 +848,7 @@ XBOOL_VECTOR (Lisp_Object a) /* Construct a Lisp_Object from a value or address. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object make_lisp_ptr (void *ptr, enum Lisp_Type type) { EMACS_UINT utype = type; @@ -853,7 +858,7 @@ make_lisp_ptr (void *ptr, enum Lisp_Type type) return a; } -LISP_INLINE Lisp_Object +INLINE Lisp_Object make_lisp_proc (struct Lisp_Process *p) { return make_lisp_ptr (p, Lisp_Vectorlike); @@ -937,12 +942,12 @@ struct Lisp_Cons fields are not accessible. (What if we want to switch to a copying collector someday? Cached cons cell field addresses may be invalidated at arbitrary points.) */ -LISP_INLINE Lisp_Object * +INLINE Lisp_Object * xcar_addr (Lisp_Object c) { return &XCONS (c)->car; } -LISP_INLINE Lisp_Object * +INLINE Lisp_Object * xcdr_addr (Lisp_Object c) { return &XCONS (c)->u.cdr; @@ -956,26 +961,26 @@ LISP_MACRO_DEFUN (XCDR, Lisp_Object, (Lisp_Object c), (c)) Note that both arguments may refer to the same object, so 'n' should not be read after 'c' is first modified. */ -LISP_INLINE void +INLINE void XSETCAR (Lisp_Object c, Lisp_Object n) { *xcar_addr (c) = n; } -LISP_INLINE void +INLINE void XSETCDR (Lisp_Object c, Lisp_Object n) { *xcdr_addr (c) = n; } /* Take the car or cdr of something whose type is not known. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object CAR (Lisp_Object c) { return (CONSP (c) ? XCAR (c) : NILP (c) ? Qnil : wrong_type_argument (Qlistp, c)); } -LISP_INLINE Lisp_Object +INLINE Lisp_Object CDR (Lisp_Object c) { return (CONSP (c) ? XCDR (c) @@ -984,12 +989,12 @@ CDR (Lisp_Object c) } /* Take the car or cdr of something whose type is not known. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object CAR_SAFE (Lisp_Object c) { return CONSP (c) ? XCAR (c) : Qnil; } -LISP_INLINE Lisp_Object +INLINE Lisp_Object CDR_SAFE (Lisp_Object c) { return CONSP (c) ? XCDR (c) : Qnil; @@ -1006,7 +1011,7 @@ struct Lisp_String }; /* True if STR is a multibyte string. */ -LISP_INLINE bool +INLINE bool STRING_MULTIBYTE (Lisp_Object str) { return 0 <= XSTRING (str)->size_byte; @@ -1043,28 +1048,28 @@ STRING_MULTIBYTE (Lisp_Object str) /* Convenience functions for dealing with Lisp strings. */ -LISP_INLINE unsigned char * +INLINE unsigned char * SDATA (Lisp_Object string) { return XSTRING (string)->data; } -LISP_INLINE char * +INLINE char * SSDATA (Lisp_Object string) { /* Avoid "differ in sign" warnings. */ return (char *) SDATA (string); } -LISP_INLINE unsigned char +INLINE unsigned char SREF (Lisp_Object string, ptrdiff_t index) { return SDATA (string)[index]; } -LISP_INLINE void +INLINE void SSET (Lisp_Object string, ptrdiff_t index, unsigned char new) { SDATA (string)[index] = new; } -LISP_INLINE ptrdiff_t +INLINE ptrdiff_t SCHARS (Lisp_Object string) { return XSTRING (string)->size; @@ -1073,7 +1078,7 @@ SCHARS (Lisp_Object string) #ifdef GC_CHECK_STRING_BYTES extern ptrdiff_t string_bytes (struct Lisp_String *); #endif -LISP_INLINE ptrdiff_t +INLINE ptrdiff_t STRING_BYTES (struct Lisp_String *s) { #ifdef GC_CHECK_STRING_BYTES @@ -1083,17 +1088,17 @@ STRING_BYTES (struct Lisp_String *s) #endif } -LISP_INLINE ptrdiff_t +INLINE ptrdiff_t SBYTES (Lisp_Object string) { return STRING_BYTES (XSTRING (string)); } -LISP_INLINE void +INLINE void STRING_SET_CHARS (Lisp_Object string, ptrdiff_t newsize) { XSTRING (string)->size = newsize; } -LISP_INLINE void +INLINE void STRING_COPYIN (Lisp_Object string, ptrdiff_t index, char const *new, ptrdiff_t count) { @@ -1131,12 +1136,19 @@ struct vectorlike_header ptrdiff_t size; }; -/* Regular vector is just a header plus array of Lisp_Objects. */ +/* Regular vector is just a header plus array of Lisp_Objects... */ struct Lisp_Vector { struct vectorlike_header header; - Lisp_Object contents[FLEXIBLE_ARRAY_MEMBER]; + union { + /* ...but sometimes there is also a pointer internally used in + vector allocation code. Usually you don't want to touch this. */ + struct Lisp_Vector *next; + + /* We can't use FLEXIBLE_ARRAY_MEMBER here. */ + Lisp_Object contents[1]; + } u; }; /* A boolvector is a kind of vectorlike, with contents are like a string. */ @@ -1157,45 +1169,45 @@ struct Lisp_Bool_Vector enum { - header_size = offsetof (struct Lisp_Vector, contents), + header_size = offsetof (struct Lisp_Vector, u.contents), bool_header_size = offsetof (struct Lisp_Bool_Vector, data), word_size = sizeof (Lisp_Object) }; /* Conveniences for dealing with Lisp arrays. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object AREF (Lisp_Object array, ptrdiff_t idx) { - return XVECTOR (array)->contents[idx]; + return XVECTOR (array)->u.contents[idx]; } -LISP_INLINE Lisp_Object * +INLINE Lisp_Object * aref_addr (Lisp_Object array, ptrdiff_t idx) { - return & XVECTOR (array)->contents[idx]; + return & XVECTOR (array)->u.contents[idx]; } -LISP_INLINE ptrdiff_t +INLINE ptrdiff_t ASIZE (Lisp_Object array) { return XVECTOR (array)->header.size; } -LISP_INLINE void +INLINE void ASET (Lisp_Object array, ptrdiff_t idx, Lisp_Object val) { eassert (0 <= idx && idx < ASIZE (array)); - XVECTOR (array)->contents[idx] = val; + XVECTOR (array)->u.contents[idx] = val; } -LISP_INLINE void +INLINE void gc_aset (Lisp_Object array, ptrdiff_t idx, Lisp_Object val) { /* Like ASET, but also can be used in the garbage collector: sweep_weak_table calls set_hash_key etc. while the table is marked. */ eassert (0 <= idx && idx < (ASIZE (array) & ~ARRAY_MARK_FLAG)); - XVECTOR (array)->contents[idx] = val; + XVECTOR (array)->u.contents[idx] = val; } /* If a struct is made to look like a vector, this macro returns the length @@ -1296,7 +1308,7 @@ struct Lisp_Sub_Char_Table Lisp_Object contents[FLEXIBLE_ARRAY_MEMBER]; }; -LISP_INLINE Lisp_Object +INLINE Lisp_Object CHAR_TABLE_REF_ASCII (Lisp_Object ct, ptrdiff_t idx) { struct Lisp_Char_Table *tbl = NULL; @@ -1316,7 +1328,7 @@ CHAR_TABLE_REF_ASCII (Lisp_Object ct, ptrdiff_t idx) /* Almost equivalent to Faref (CT, IDX) with optimization for ASCII characters. Do not check validity of CT. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object CHAR_TABLE_REF (Lisp_Object ct, int idx) { return (ASCII_CHAR_P (idx) @@ -1326,7 +1338,7 @@ CHAR_TABLE_REF (Lisp_Object ct, int idx) /* Equivalent to Faset (CT, IDX, VAL) with optimization for ASCII and 8-bit European characters. Do not check validity of CT. */ -LISP_INLINE void +INLINE void CHAR_TABLE_SET (Lisp_Object ct, int idx, Lisp_Object val) { if (ASCII_CHAR_P (idx) && SUB_CHAR_TABLE_P (XCHAR_TABLE (ct)->ascii)) @@ -1371,7 +1383,7 @@ enum CHAR_TABLE_STANDARD_SLOTS /* Return the number of "extra" slots in the char table CT. */ -LISP_INLINE int +INLINE int CHAR_TABLE_EXTRA_SLOTS (struct Lisp_Char_Table *ct) { return ((ct->header.size & PSEUDOVECTOR_SIZE_MASK) @@ -1450,19 +1462,19 @@ struct Lisp_Symbol LISP_MACRO_DEFUN (SYMBOL_VAL, Lisp_Object, (struct Lisp_Symbol *sym), (sym)) -LISP_INLINE struct Lisp_Symbol * +INLINE struct Lisp_Symbol * SYMBOL_ALIAS (struct Lisp_Symbol *sym) { eassert (sym->redirect == SYMBOL_VARALIAS); return sym->val.alias; } -LISP_INLINE struct Lisp_Buffer_Local_Value * +INLINE struct Lisp_Buffer_Local_Value * SYMBOL_BLV (struct Lisp_Symbol *sym) { eassert (sym->redirect == SYMBOL_LOCALIZED); return sym->val.blv; } -LISP_INLINE union Lisp_Fwd * +INLINE union Lisp_Fwd * SYMBOL_FWD (struct Lisp_Symbol *sym) { eassert (sym->redirect == SYMBOL_FORWARDED); @@ -1472,26 +1484,26 @@ SYMBOL_FWD (struct Lisp_Symbol *sym) LISP_MACRO_DEFUN_VOID (SET_SYMBOL_VAL, (struct Lisp_Symbol *sym, Lisp_Object v), (sym, v)) -LISP_INLINE void +INLINE void SET_SYMBOL_ALIAS (struct Lisp_Symbol *sym, struct Lisp_Symbol *v) { eassert (sym->redirect == SYMBOL_VARALIAS); sym->val.alias = v; } -LISP_INLINE void +INLINE void SET_SYMBOL_BLV (struct Lisp_Symbol *sym, struct Lisp_Buffer_Local_Value *v) { eassert (sym->redirect == SYMBOL_LOCALIZED); sym->val.blv = v; } -LISP_INLINE void +INLINE void SET_SYMBOL_FWD (struct Lisp_Symbol *sym, union Lisp_Fwd *v) { eassert (sym->redirect == SYMBOL_FORWARDED); sym->val.fwd = v; } -LISP_INLINE Lisp_Object +INLINE Lisp_Object SYMBOL_NAME (Lisp_Object sym) { return XSYMBOL (sym)->name; @@ -1499,7 +1511,7 @@ SYMBOL_NAME (Lisp_Object sym) /* Value is true if SYM is an interned symbol. */ -LISP_INLINE bool +INLINE bool SYMBOL_INTERNED_P (Lisp_Object sym) { return XSYMBOL (sym)->interned != SYMBOL_UNINTERNED; @@ -1507,7 +1519,7 @@ SYMBOL_INTERNED_P (Lisp_Object sym) /* Value is true if SYM is interned in initial_obarray. */ -LISP_INLINE bool +INLINE bool SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (Lisp_Object sym) { return XSYMBOL (sym)->interned == SYMBOL_INTERNED_IN_INITIAL_OBARRAY; @@ -1603,7 +1615,7 @@ struct Lisp_Hash_Table }; -LISP_INLINE struct Lisp_Hash_Table * +INLINE struct Lisp_Hash_Table * XHASH_TABLE (Lisp_Object a) { return XUNTAG (a, Lisp_Vectorlike); @@ -1612,21 +1624,21 @@ XHASH_TABLE (Lisp_Object a) #define XSET_HASH_TABLE(VAR, PTR) \ (XSETPSEUDOVECTOR (VAR, PTR, PVEC_HASH_TABLE)) -LISP_INLINE bool +INLINE bool HASH_TABLE_P (Lisp_Object a) { return PSEUDOVECTORP (a, PVEC_HASH_TABLE); } /* Value is the key part of entry IDX in hash table H. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object HASH_KEY (struct Lisp_Hash_Table *h, ptrdiff_t idx) { return AREF (h->key_and_value, 2 * idx); } /* Value is the value part of entry IDX in hash table H. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object HASH_VALUE (struct Lisp_Hash_Table *h, ptrdiff_t idx) { return AREF (h->key_and_value, 2 * idx + 1); @@ -1634,14 +1646,14 @@ HASH_VALUE (struct Lisp_Hash_Table *h, ptrdiff_t idx) /* Value is the index of the next entry following the one at IDX in hash table H. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object HASH_NEXT (struct Lisp_Hash_Table *h, ptrdiff_t idx) { return AREF (h->next, idx); } /* Value is the hash code computed for entry IDX in hash table H. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object HASH_HASH (struct Lisp_Hash_Table *h, ptrdiff_t idx) { return AREF (h->hash, idx); @@ -1649,14 +1661,14 @@ HASH_HASH (struct Lisp_Hash_Table *h, ptrdiff_t idx) /* Value is the index of the element in hash table H that is the start of the collision list at index IDX in the index vector of H. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object HASH_INDEX (struct Lisp_Hash_Table *h, ptrdiff_t idx) { return AREF (h->index, idx); } /* Value is the size of hash table H. */ -LISP_INLINE ptrdiff_t +INLINE ptrdiff_t HASH_TABLE_SIZE (struct Lisp_Hash_Table *h) { return ASIZE (h->next); @@ -1679,7 +1691,7 @@ static double const DEFAULT_REHASH_SIZE = 1.5; /* Combine two integers X and Y for hashing. The result might not fit into a Lisp integer. */ -LISP_INLINE EMACS_UINT +INLINE EMACS_UINT sxhash_combine (EMACS_UINT x, EMACS_UINT y) { return (x << 4) + (x >> (BITS_PER_EMACS_INT - 4)) + y; @@ -1687,7 +1699,7 @@ sxhash_combine (EMACS_UINT x, EMACS_UINT y) /* Hash X, returning a value that fits into a fixnum. */ -LISP_INLINE EMACS_UINT +INLINE EMACS_UINT SXHASH_REDUCE (EMACS_UINT x) { return (x ^ x >> (BITS_PER_EMACS_INT - FIXNUM_BITS)) & INTMASK; @@ -1857,7 +1869,7 @@ struct Lisp_Save_Value }; /* Return the type of V's Nth saved value. */ -LISP_INLINE int +INLINE int save_type (struct Lisp_Save_Value *v, int n) { eassert (0 <= n && n < SAVE_VALUE_SLOTS); @@ -1866,19 +1878,19 @@ save_type (struct Lisp_Save_Value *v, int n) /* Get and set the Nth saved pointer. */ -LISP_INLINE void * +INLINE void * XSAVE_POINTER (Lisp_Object obj, int n) { eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_POINTER); return XSAVE_VALUE (obj)->data[n].pointer; } -LISP_INLINE void +INLINE void set_save_pointer (Lisp_Object obj, int n, void *val) { eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_POINTER); XSAVE_VALUE (obj)->data[n].pointer = val; } -LISP_INLINE voidfuncptr +INLINE voidfuncptr XSAVE_FUNCPOINTER (Lisp_Object obj, int n) { eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_FUNCPOINTER); @@ -1887,13 +1899,13 @@ XSAVE_FUNCPOINTER (Lisp_Object obj, int n) /* Likewise for the saved integer. */ -LISP_INLINE ptrdiff_t +INLINE ptrdiff_t XSAVE_INTEGER (Lisp_Object obj, int n) { eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_INTEGER); return XSAVE_VALUE (obj)->data[n].integer; } -LISP_INLINE void +INLINE void set_save_integer (Lisp_Object obj, int n, ptrdiff_t val) { eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_INTEGER); @@ -1902,7 +1914,7 @@ set_save_integer (Lisp_Object obj, int n, ptrdiff_t val) /* Extract Nth saved object. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object XSAVE_OBJECT (Lisp_Object obj, int n) { eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_OBJECT); @@ -1930,40 +1942,40 @@ union Lisp_Misc struct Lisp_Save_Value u_save_value; }; -LISP_INLINE union Lisp_Misc * +INLINE union Lisp_Misc * XMISC (Lisp_Object a) { return XUNTAG (a, Lisp_Misc); } -LISP_INLINE struct Lisp_Misc_Any * +INLINE struct Lisp_Misc_Any * XMISCANY (Lisp_Object a) { eassert (MISCP (a)); return & XMISC (a)->u_any; } -LISP_INLINE enum Lisp_Misc_Type +INLINE enum Lisp_Misc_Type XMISCTYPE (Lisp_Object a) { return XMISCANY (a)->type; } -LISP_INLINE struct Lisp_Marker * +INLINE struct Lisp_Marker * XMARKER (Lisp_Object a) { eassert (MARKERP (a)); return & XMISC (a)->u_marker; } -LISP_INLINE struct Lisp_Overlay * +INLINE struct Lisp_Overlay * XOVERLAY (Lisp_Object a) { eassert (OVERLAYP (a)); return & XMISC (a)->u_overlay; } -LISP_INLINE struct Lisp_Save_Value * +INLINE struct Lisp_Save_Value * XSAVE_VALUE (Lisp_Object a) { eassert (SAVE_VALUEP (a)); @@ -2077,13 +2089,13 @@ union Lisp_Fwd struct Lisp_Kboard_Objfwd u_kboard_objfwd; }; -LISP_INLINE enum Lisp_Fwd_Type +INLINE enum Lisp_Fwd_Type XFWDTYPE (union Lisp_Fwd *a) { return a->u_intfwd.type; } -LISP_INLINE struct Lisp_Buffer_Objfwd * +INLINE struct Lisp_Buffer_Objfwd * XBUFFER_OBJFWD (union Lisp_Fwd *a) { eassert (BUFFER_OBJFWDP (a)); @@ -2100,7 +2112,7 @@ struct Lisp_Float } u; }; -LISP_INLINE double +INLINE double XFLOAT_DATA (Lisp_Object f) { return XFLOAT (f)->u.data; @@ -2164,18 +2176,18 @@ enum char_bits LISP_MACRO_DEFUN (NILP, bool, (Lisp_Object x), (x)) -LISP_INLINE bool +INLINE bool NUMBERP (Lisp_Object x) { return INTEGERP (x) || FLOATP (x); } -LISP_INLINE bool +INLINE bool NATNUMP (Lisp_Object x) { return INTEGERP (x) && 0 <= XINT (x); } -LISP_INLINE bool +INLINE bool RANGED_INTEGERP (intmax_t lo, Lisp_Object x, intmax_t hi) { return INTEGERP (x) && lo <= XINT (x) && XINT (x) <= hi; @@ -2194,40 +2206,40 @@ LISP_MACRO_DEFUN (INTEGERP, bool, (Lisp_Object x), (x)) LISP_MACRO_DEFUN (VECTORLIKEP, bool, (Lisp_Object x), (x)) LISP_MACRO_DEFUN (MARKERP, bool, (Lisp_Object x), (x)) -LISP_INLINE bool +INLINE bool STRINGP (Lisp_Object x) { return XTYPE (x) == Lisp_String; } -LISP_INLINE bool +INLINE bool VECTORP (Lisp_Object x) { return VECTORLIKEP (x) && ! (ASIZE (x) & PSEUDOVECTOR_FLAG); } -LISP_INLINE bool +INLINE bool OVERLAYP (Lisp_Object x) { return MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Overlay; } -LISP_INLINE bool +INLINE bool SAVE_VALUEP (Lisp_Object x) { return MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Save_Value; } -LISP_INLINE bool +INLINE bool AUTOLOADP (Lisp_Object x) { return CONSP (x) && EQ (Qautoload, XCAR (x)); } -LISP_INLINE bool +INLINE bool BUFFER_OBJFWDP (union Lisp_Fwd *a) { return XFWDTYPE (a) == Lisp_Fwd_Buffer_Obj; } -LISP_INLINE bool +INLINE bool PSEUDOVECTOR_TYPEP (struct vectorlike_header *a, int code) { return ((a->size & (PSEUDOVECTOR_FLAG | PVEC_TYPE_MASK)) @@ -2235,7 +2247,7 @@ PSEUDOVECTOR_TYPEP (struct vectorlike_header *a, int code) } /* True if A is a pseudovector whose code is CODE. */ -LISP_INLINE bool +INLINE bool PSEUDOVECTORP (Lisp_Object a, int code) { if (! VECTORLIKEP (a)) @@ -2251,87 +2263,87 @@ PSEUDOVECTORP (Lisp_Object a, int code) /* Test for specific pseudovector types. */ -LISP_INLINE bool +INLINE bool WINDOW_CONFIGURATIONP (Lisp_Object a) { return PSEUDOVECTORP (a, PVEC_WINDOW_CONFIGURATION); } -LISP_INLINE bool +INLINE bool PROCESSP (Lisp_Object a) { return PSEUDOVECTORP (a, PVEC_PROCESS); } -LISP_INLINE bool +INLINE bool WINDOWP (Lisp_Object a) { return PSEUDOVECTORP (a, PVEC_WINDOW); } -LISP_INLINE bool +INLINE bool TERMINALP (Lisp_Object a) { return PSEUDOVECTORP (a, PVEC_TERMINAL); } -LISP_INLINE bool +INLINE bool SUBRP (Lisp_Object a) { return PSEUDOVECTORP (a, PVEC_SUBR); } -LISP_INLINE bool +INLINE bool COMPILEDP (Lisp_Object a) { return PSEUDOVECTORP (a, PVEC_COMPILED); } -LISP_INLINE bool +INLINE bool BUFFERP (Lisp_Object a) { return PSEUDOVECTORP (a, PVEC_BUFFER); } -LISP_INLINE bool +INLINE bool CHAR_TABLE_P (Lisp_Object a) { return PSEUDOVECTORP (a, PVEC_CHAR_TABLE); } -LISP_INLINE bool +INLINE bool SUB_CHAR_TABLE_P (Lisp_Object a) { return PSEUDOVECTORP (a, PVEC_SUB_CHAR_TABLE); } -LISP_INLINE bool +INLINE bool BOOL_VECTOR_P (Lisp_Object a) { return PSEUDOVECTORP (a, PVEC_BOOL_VECTOR); } -LISP_INLINE bool +INLINE bool FRAMEP (Lisp_Object a) { return PSEUDOVECTORP (a, PVEC_FRAME); } /* Test for image (image . spec) */ -LISP_INLINE bool +INLINE bool IMAGEP (Lisp_Object x) { return CONSP (x) && EQ (XCAR (x), Qimage); } /* Array types. */ -LISP_INLINE bool +INLINE bool ARRAYP (Lisp_Object x) { return VECTORP (x) || STRINGP (x) || CHAR_TABLE_P (x) || BOOL_VECTOR_P (x); } -LISP_INLINE void +INLINE void CHECK_LIST (Lisp_Object x) { CHECK_TYPE (CONSP (x) || NILP (x), Qlistp, x); @@ -2341,52 +2353,57 @@ LISP_MACRO_DEFUN_VOID (CHECK_LIST_CONS, (Lisp_Object x, Lisp_Object y), (x, y)) LISP_MACRO_DEFUN_VOID (CHECK_SYMBOL, (Lisp_Object x), (x)) LISP_MACRO_DEFUN_VOID (CHECK_NUMBER, (Lisp_Object x), (x)) -LISP_INLINE void +INLINE void CHECK_STRING (Lisp_Object x) { CHECK_TYPE (STRINGP (x), Qstringp, x); } -LISP_INLINE void +INLINE void CHECK_STRING_CAR (Lisp_Object x) { CHECK_TYPE (STRINGP (XCAR (x)), Qstringp, XCAR (x)); } -LISP_INLINE void +INLINE void CHECK_CONS (Lisp_Object x) { CHECK_TYPE (CONSP (x), Qconsp, x); } -LISP_INLINE void +INLINE void CHECK_VECTOR (Lisp_Object x) { CHECK_TYPE (VECTORP (x), Qvectorp, x); } -LISP_INLINE void +INLINE void +CHECK_BOOL_VECTOR (Lisp_Object x) +{ + CHECK_TYPE (BOOL_VECTOR_P (x), Qbool_vector_p, x); +} +INLINE void CHECK_VECTOR_OR_STRING (Lisp_Object x) { CHECK_TYPE (VECTORP (x) || STRINGP (x), Qarrayp, x); } -LISP_INLINE void +INLINE void CHECK_ARRAY (Lisp_Object x, Lisp_Object Qxxxp) { CHECK_TYPE (ARRAYP (x), Qxxxp, x); } -LISP_INLINE void +INLINE void CHECK_BUFFER (Lisp_Object x) { CHECK_TYPE (BUFFERP (x), Qbufferp, x); } -LISP_INLINE void +INLINE void CHECK_WINDOW (Lisp_Object x) { CHECK_TYPE (WINDOWP (x), Qwindowp, x); } -LISP_INLINE void +INLINE void CHECK_PROCESS (Lisp_Object x) { CHECK_TYPE (PROCESSP (x), Qprocessp, x); } -LISP_INLINE void +INLINE void CHECK_NATNUM (Lisp_Object x) { CHECK_TYPE (NATNUMP (x), Qwholenump, x); @@ -2415,13 +2432,13 @@ CHECK_NATNUM (Lisp_Object x) do { if (MARKERP ((x))) XSETFASTINT (x, marker_position (x)); \ else CHECK_TYPE (INTEGERP (x), Qinteger_or_marker_p, x); } while (0) -LISP_INLINE double +INLINE double XFLOATINT (Lisp_Object n) { return extract_float (n); } -LISP_INLINE void +INLINE void CHECK_NUMBER_OR_FLOAT (Lisp_Object x) { CHECK_TYPE (FLOATP (x) || INTEGERP (x), Qnumberp, x); @@ -2433,7 +2450,7 @@ CHECK_NUMBER_OR_FLOAT (Lisp_Object x) /* Since we can't assign directly to the CAR or CDR fields of a cons cell, use these when checking that those fields contain numbers. */ -LISP_INLINE void +INLINE void CHECK_NUMBER_CAR (Lisp_Object x) { Lisp_Object tmp = XCAR (x); @@ -2441,7 +2458,7 @@ CHECK_NUMBER_CAR (Lisp_Object x) XSETCAR (x, tmp); } -LISP_INLINE void +INLINE void CHECK_NUMBER_CDR (Lisp_Object x) { Lisp_Object tmp = XCDR (x); @@ -2519,7 +2536,7 @@ CHECK_NUMBER_CDR (Lisp_Object x) Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object) /* True if OBJ is a Lisp function. */ -LISP_INLINE bool +INLINE bool FUNCTIONP (Lisp_Object obj) { return functionp (obj); @@ -2686,7 +2703,7 @@ extern union specbinding *specpdl; extern union specbinding *specpdl_ptr; extern ptrdiff_t specpdl_size; -LISP_INLINE ptrdiff_t +INLINE ptrdiff_t SPECPDL_INDEX (void) { return specpdl_ptr - specpdl; @@ -3014,22 +3031,22 @@ struct frame; /* Copy COUNT Lisp_Objects from ARGS to contents of V starting from OFFSET. */ -LISP_INLINE void +INLINE void vcopy (Lisp_Object v, ptrdiff_t offset, Lisp_Object *args, ptrdiff_t count) { eassert (0 <= offset && 0 <= count && offset + count <= ASIZE (v)); - memcpy (XVECTOR (v)->contents + offset, args, count * sizeof *args); + memcpy (XVECTOR (v)->u.contents + offset, args, count * sizeof *args); } /* Functions to modify hash tables. */ -LISP_INLINE void +INLINE void set_hash_key_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val) { gc_aset (h->key_and_value, 2 * idx, val); } -LISP_INLINE void +INLINE void set_hash_value_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val) { gc_aset (h->key_and_value, 2 * idx + 1, val); @@ -3038,19 +3055,19 @@ set_hash_value_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val) /* Use these functions to set Lisp_Object or pointer slots of struct Lisp_Symbol. */ -LISP_INLINE void +INLINE void set_symbol_function (Lisp_Object sym, Lisp_Object function) { XSYMBOL (sym)->function = function; } -LISP_INLINE void +INLINE void set_symbol_plist (Lisp_Object sym, Lisp_Object plist) { XSYMBOL (sym)->plist = plist; } -LISP_INLINE void +INLINE void set_symbol_next (Lisp_Object sym, struct Lisp_Symbol *next) { XSYMBOL (sym)->next = next; @@ -3058,7 +3075,7 @@ set_symbol_next (Lisp_Object sym, struct Lisp_Symbol *next) /* Buffer-local (also frame-local) variable access functions. */ -LISP_INLINE int +INLINE int blv_found (struct Lisp_Buffer_Local_Value *blv) { eassert (blv->found == !EQ (blv->defcell, blv->valcell)); @@ -3067,7 +3084,7 @@ blv_found (struct Lisp_Buffer_Local_Value *blv) /* Set overlay's property list. */ -LISP_INLINE void +INLINE void set_overlay_plist (Lisp_Object overlay, Lisp_Object plist) { XOVERLAY (overlay)->plist = plist; @@ -3075,7 +3092,7 @@ set_overlay_plist (Lisp_Object overlay, Lisp_Object plist) /* Get text properties of S. */ -LISP_INLINE INTERVAL +INLINE INTERVAL string_intervals (Lisp_Object s) { return XSTRING (s)->intervals; @@ -3083,7 +3100,7 @@ string_intervals (Lisp_Object s) /* Set text properties of S to I. */ -LISP_INLINE void +INLINE void set_string_intervals (Lisp_Object s, INTERVAL i) { XSTRING (s)->intervals = i; @@ -3092,12 +3109,12 @@ set_string_intervals (Lisp_Object s, INTERVAL i) /* Set a Lisp slot in TABLE to VAL. Most code should use this instead of setting slots directly. */ -LISP_INLINE void +INLINE void set_char_table_defalt (Lisp_Object table, Lisp_Object val) { XCHAR_TABLE (table)->defalt = val; } -LISP_INLINE void +INLINE void set_char_table_purpose (Lisp_Object table, Lisp_Object val) { XCHAR_TABLE (table)->purpose = val; @@ -3105,21 +3122,21 @@ set_char_table_purpose (Lisp_Object table, Lisp_Object val) /* Set different slots in (sub)character tables. */ -LISP_INLINE void +INLINE void set_char_table_extras (Lisp_Object table, ptrdiff_t idx, Lisp_Object val) { eassert (0 <= idx && idx < CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (table))); XCHAR_TABLE (table)->extras[idx] = val; } -LISP_INLINE void +INLINE void set_char_table_contents (Lisp_Object table, ptrdiff_t idx, Lisp_Object val) { eassert (0 <= idx && idx < (1 << CHARTAB_SIZE_BITS_0)); XCHAR_TABLE (table)->contents[idx] = val; } -LISP_INLINE void +INLINE void set_sub_char_table_contents (Lisp_Object table, ptrdiff_t idx, Lisp_Object val) { XSUB_CHAR_TABLE (table)->contents[idx] = val; @@ -3160,6 +3177,16 @@ EXFUN (Fbyteorder, 0) ATTRIBUTE_CONST; /* Defined in data.c. */ extern Lisp_Object indirect_function (Lisp_Object); extern Lisp_Object find_symbol_value (Lisp_Object); +enum Arith_Comparison { + ARITH_EQUAL, + ARITH_NOTEQUAL, + ARITH_LESS, + ARITH_GRTR, + ARITH_LESS_OR_EQUAL, + ARITH_GRTR_OR_EQUAL +}; +extern Lisp_Object arithcompare (Lisp_Object num1, Lisp_Object num2, + enum Arith_Comparison comparison); /* Convert the integer I to an Emacs representation, either the integer itself, or a cons of two or three integers, or if all else fails a float. @@ -3339,7 +3366,6 @@ extern void syms_of_insdel (void); && (defined __FreeBSD__ || defined GNU_LINUX || defined __MINGW32__)) _Noreturn void __executable_start (void); #endif -extern Lisp_Object selected_frame; extern Lisp_Object Vwindow_system; extern Lisp_Object sit_for (Lisp_Object, bool, int); extern void init_display (void); @@ -3359,10 +3385,7 @@ extern Lisp_Object Qglyphless_char; extern Lisp_Object QCdata, QCfile; extern Lisp_Object QCmap; extern Lisp_Object Qrisky_local_variable; -extern struct frame *last_glyphless_glyph_frame; -extern int last_glyphless_glyph_face_id; -extern int last_glyphless_glyph_merged_face_id; -extern int noninteractive_need_newline; +extern bool noninteractive_need_newline; extern Lisp_Object echo_area_buffer[2]; extern void add_to_log (const char *, Lisp_Object, Lisp_Object); extern void check_message_stack (void); @@ -3429,19 +3452,19 @@ extern Lisp_Object listn (enum constype, ptrdiff_t, Lisp_Object, ...); /* Build a frequently used 2/3/4-integer lists. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object list2i (EMACS_INT x, EMACS_INT y) { return list2 (make_number (x), make_number (y)); } -LISP_INLINE Lisp_Object +INLINE Lisp_Object list3i (EMACS_INT x, EMACS_INT y, EMACS_INT w) { return list3 (make_number (x), make_number (y), make_number (w)); } -LISP_INLINE Lisp_Object +INLINE Lisp_Object list4i (EMACS_INT x, EMACS_INT y, EMACS_INT w, EMACS_INT h) { return list4 (make_number (x), make_number (y), @@ -3456,7 +3479,7 @@ extern Lisp_Object make_unibyte_string (const char *, ptrdiff_t); /* Make unibyte string from C string when the length isn't known. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object build_unibyte_string (const char *str) { return make_unibyte_string (str, strlen (str)); @@ -3474,7 +3497,7 @@ extern Lisp_Object make_pure_c_string (const char *, ptrdiff_t); /* Make a string allocated in pure space, use STR as string data. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object build_pure_c_string (const char *str) { return make_pure_c_string (str, strlen (str)); @@ -3483,7 +3506,7 @@ build_pure_c_string (const char *str) /* Make a string from the data at STR, treating it as multibyte if the data warrants. */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object build_string (const char *str) { return make_string (str, strlen (str)); @@ -3504,7 +3527,7 @@ extern struct Lisp_Vector *allocate_vector (EMACS_INT); ASET (v, 1, Ffunction_can_gc ()); ASET (v, 2, obj1); */ -LISP_INLINE Lisp_Object +INLINE Lisp_Object make_uninit_vector (ptrdiff_t size) { Lisp_Object v; @@ -3551,7 +3574,7 @@ extern int valid_lisp_object_p (Lisp_Object); #ifdef GC_CHECK_CONS_LIST extern void check_cons_list (void); #else -LISP_INLINE void (check_cons_list) (void) { lisp_h_check_cons_list (); } +INLINE void (check_cons_list) (void) { lisp_h_check_cons_list (); } #endif #ifdef REL_ALLOC @@ -3619,7 +3642,7 @@ extern Lisp_Object check_obarray (Lisp_Object); extern Lisp_Object intern_1 (const char *, ptrdiff_t); extern Lisp_Object intern_c_string_1 (const char *, ptrdiff_t); extern Lisp_Object oblookup (Lisp_Object, const char *, ptrdiff_t, ptrdiff_t); -LISP_INLINE void +INLINE void LOADHIST_ATTACH (Lisp_Object x) { if (initialized) @@ -3635,13 +3658,13 @@ extern void init_obarray (void); extern void init_lread (void); extern void syms_of_lread (void); -LISP_INLINE Lisp_Object +INLINE Lisp_Object intern (const char *str) { return intern_1 (str, strlen (str)); } -LISP_INLINE Lisp_Object +INLINE Lisp_Object intern_c_string (const char *str) { return intern_c_string_1 (str, strlen (str)); @@ -3920,9 +3943,9 @@ void fixup_locale (void); void synchronize_system_messages_locale (void); void synchronize_system_time_locale (void); #else -LISP_INLINE void fixup_locale (void) {} -LISP_INLINE void synchronize_system_messages_locale (void) {} -LISP_INLINE void synchronize_system_time_locale (void) {} +INLINE void fixup_locale (void) {} +INLINE void synchronize_system_messages_locale (void) {} +INLINE void synchronize_system_time_locale (void) {} #endif extern void shut_down_emacs (int, Lisp_Object); @@ -4301,7 +4324,7 @@ extern void *record_xmalloc (size_t); /* Check whether it's time for GC, and run it if so. */ -LISP_INLINE void +INLINE void maybe_gc (void) { if ((consing_since_gc > gc_cons_threshold @@ -4311,7 +4334,7 @@ maybe_gc (void) Fgarbage_collect (); } -LISP_INLINE bool +INLINE bool functionp (Lisp_Object object) { if (SYMBOLP (object) && !NILP (Ffboundp (object))) @@ -4343,6 +4366,40 @@ functionp (Lisp_Object object) return 0; } +INLINE uint16_t +swap16 (uint16_t val) +{ + return (val << 8) | (val & 0xFF); +} + +INLINE uint32_t +swap32 (uint32_t val) +{ + uint32_t low = swap16 (val & 0xFFFF); + uint32_t high = swap16 (val >> 16); + return (low << 16) | high; +} + +#ifdef UINT64_MAX +INLINE uint64_t +swap64 (uint64_t val) +{ + uint64_t low = swap32 (val & 0xFFFFFFFF); + uint64_t high = swap32 (val >> 32); + return (low << 32) | high; +} +#endif + +#if ((SIZE_MAX >> 31) >> 1) & 1 +# define BITS_PER_SIZE_T 64 +#else +# define BITS_PER_SIZE_T 32 +#endif + +/* Round x to the next multiple of y. Does not overflow. Evaluates + arguments repeatedly. */ +#define ROUNDUP(x,y) ((y)*((x)/(y) + ((x)%(y)!=0))) + INLINE_HEADER_END #endif /* EMACS_LISP_H */ diff --git a/src/lisp.mk b/src/lisp.mk index a9a661ea3a8..c12deebd893 100644 --- a/src/lisp.mk +++ b/src/lisp.mk @@ -152,6 +152,7 @@ lisp = \ $(lispsource)/term/w32-win.elc \ $(lispsource)/ls-lisp.elc \ $(lispsource)/disp-table.elc \ + $(lispsource)/w32-common-fns.elc \ $(lispsource)/dos-w32.elc \ $(lispsource)/w32-fns.elc \ $(lispsource)/dos-fns.elc \ diff --git a/src/lread.c b/src/lread.c index 9518631ba6d..fe2b92a34b3 100644 --- a/src/lread.c +++ b/src/lread.c @@ -2597,7 +2597,10 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list) build them using function calls. */ Lisp_Object tmp; tmp = read_vector (readcharfun, 1); - make_byte_code (XVECTOR (tmp)); + struct Lisp_Vector* vec = XVECTOR (tmp); + if (vec->header.size==0) + invalid_syntax ("Empty byte-code object"); + make_byte_code (vec); return tmp; } if (c == '(') @@ -3459,7 +3462,7 @@ read_vector (Lisp_Object readcharfun, bool bytecodeflag) vector = Fmake_vector (len, Qnil); size = ASIZE (vector); - ptr = XVECTOR (vector)->contents; + ptr = XVECTOR (vector)->u.contents; for (i = 0; i < size; i++) { item = Fcar (tem); diff --git a/src/macfont.h b/src/macfont.h new file mode 100644 index 00000000000..141d60bfb0a --- /dev/null +++ b/src/macfont.h @@ -0,0 +1,144 @@ +/* Interface definition for Mac OSX Core text font backend. + Copyright (C) 2009-2013 Free Software Foundation, Inc. + +This file is part of GNU Emacs. + +GNU Emacs is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +GNU Emacs is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. + +Original author: YAMAMOTO Mitsuharu +*/ + +/* Structure used by Mac `shape' functions for storing layout + information for each glyph. */ +struct mac_glyph_layout +{ + /* Range of indices of the characters composed into the group of + glyphs that share the cursor position with this glyph. The + members `location' and `length' are in UTF-16 indices. */ + CFRange comp_range; + + /* UTF-16 index in the source string for the first character + associated with this glyph. */ + CFIndex string_index; + + /* Horizontal and vertical adjustments of glyph position. The + coordinate space is that of Core Text. So, the `baseline_delta' + value is negative if the glyph should be placed below the + baseline. */ + CGFloat advance_delta, baseline_delta; + + /* Typographical width of the glyph. */ + CGFloat advance; + + /* Glyph ID of the glyph. */ + CGGlyph glyph_id; +}; + +typedef CTFontDescriptorRef FontDescriptorRef; +typedef CTFontRef FontRef; +typedef CTFontSymbolicTraits FontSymbolicTraits; +typedef CTCharacterCollection CharacterCollection; + +#define MAC_FONT_NAME_ATTRIBUTE kCTFontNameAttribute +#define MAC_FONT_FAMILY_NAME_ATTRIBUTE kCTFontFamilyNameAttribute +#define MAC_FONT_TRAITS_ATTRIBUTE kCTFontTraitsAttribute +#define MAC_FONT_SIZE_ATTRIBUTE kCTFontSizeAttribute +#define MAC_FONT_CASCADE_LIST_ATTRIBUTE kCTFontCascadeListAttribute +#define MAC_FONT_CHARACTER_SET_ATTRIBUTE kCTFontCharacterSetAttribute +#define MAC_FONT_LANGUAGES_ATTRIBUTE kCTFontLanguagesAttribute +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 +#define MAC_FONT_FORMAT_ATTRIBUTE kCTFontFormatAttribute +#else +#define MAC_FONT_FORMAT_ATTRIBUTE (CFSTR ("NSCTFontFormatAttribute")) +#endif +#define MAC_FONT_SYMBOLIC_TRAIT kCTFontSymbolicTrait +#define MAC_FONT_WEIGHT_TRAIT kCTFontWeightTrait +#define MAC_FONT_WIDTH_TRAIT kCTFontWidthTrait +#define MAC_FONT_SLANT_TRAIT kCTFontSlantTrait + +enum { + MAC_FONT_TRAIT_ITALIC = kCTFontItalicTrait, + MAC_FONT_TRAIT_BOLD = kCTFontBoldTrait, + MAC_FONT_TRAIT_MONO_SPACE = kCTFontMonoSpaceTrait, +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 + MAC_FONT_TRAIT_COLOR_GLYPHS = kCTFontColorGlyphsTrait +#else + MAC_FONT_TRAIT_COLOR_GLYPHS = (1 << 13) +#endif +}; + +enum { +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060 + MAC_FONT_FORMAT_BITMAP = kCTFontFormatBitmap +#else + MAC_FONT_FORMAT_BITMAP = 5 +#endif +}; + +enum { + MAC_CHARACTER_COLLECTION_IDENTITY_MAPPING = kCTIdentityMappingCharacterCollection, + MAC_CHARACTER_COLLECTION_ADOBE_JAPAN1 = kCTAdobeJapan1CharacterCollection +}; + +#define mac_font_descriptor_create_with_attributes \ + CTFontDescriptorCreateWithAttributes +#define mac_font_descriptor_create_matching_font_descriptors \ + CTFontDescriptorCreateMatchingFontDescriptors +#define mac_font_descriptor_create_matching_font_descriptor \ + CTFontDescriptorCreateMatchingFontDescriptor +#define mac_font_descriptor_copy_attribute CTFontDescriptorCopyAttribute +#define mac_font_descriptor_supports_languages \ + mac_ctfont_descriptor_supports_languages +#define mac_font_create_with_name(name, size) \ + CTFontCreateWithName (name, size, NULL) +#define mac_font_get_size CTFontGetSize +#define mac_font_copy_family_name CTFontCopyFamilyName +#define mac_font_copy_character_set CTFontCopyCharacterSet +#define mac_font_get_glyphs_for_characters CTFontGetGlyphsForCharacters +#define mac_font_get_ascent CTFontGetAscent +#define mac_font_get_descent CTFontGetDescent +#define mac_font_get_leading CTFontGetLeading +#define mac_font_get_underline_position CTFontGetUnderlinePosition +#define mac_font_get_underline_thickness CTFontGetUnderlineThickness +#define mac_font_copy_graphics_font(font) CTFontCopyGraphicsFont (font, NULL) +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 +#define mac_font_copy_non_synthetic_table(font, table) \ + CTFontCopyTable (font, table, kCTFontTableOptionNoOptions) +#else +#define mac_font_copy_non_synthetic_table(font, table) \ + CTFontCopyTable (font, table, kCTFontTableOptionExcludeSynthetic) +#endif + +#define mac_font_create_preferred_family_for_attributes \ + mac_ctfont_create_preferred_family_for_attributes +#define mac_font_get_advance_width_for_glyph \ + mac_ctfont_get_advance_width_for_glyph +#define mac_font_get_bounding_rect_for_glyph \ + mac_ctfont_get_bounding_rect_for_glyph +#define mac_font_create_available_families mac_ctfont_create_available_families +#define mac_font_shape mac_ctfont_shape +#if USE_CT_GLYPH_INFO +#define mac_font_get_glyph_for_cid mac_ctfont_get_glyph_for_cid +#endif + +#define mac_nsctfont_copy_font_descriptor CTFontCopyFontDescriptor + +#define MAC_FONT_CHARACTER_SET_STRING_ATTRIBUTE \ + (CFSTR ("MAC_FONT_CHARACTER_SET_STRING_ATTRIBUTE")) + +typedef const struct _EmacsScreenFont *ScreenFontRef; /* opaque */ + +extern void mac_register_font_driver (struct frame *f); +extern void *macfont_get_nsctfont (struct font *font); + diff --git a/src/macfont.m b/src/macfont.m new file mode 100644 index 00000000000..ab5029743ef --- /dev/null +++ b/src/macfont.m @@ -0,0 +1,3858 @@ +/* Font driver on Mac OSX Core text. + Copyright (C) 2009-2013 Free Software Foundation, Inc. + +This file is part of GNU Emacs. + +GNU Emacs is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +GNU Emacs is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. + +Original author: YAMAMOTO Mitsuharu +*/ + +#include <config.h> + +#include "lisp.h" +#include "dispextern.h" +#include "frame.h" +#include "blockinput.h" +#include "character.h" +#include "charset.h" +#include "composite.h" +#include "fontset.h" +#include "font.h" +#include "nsgui.h" +#include "nsterm.h" +#include "macfont.h" +#include "macuvs.h" + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1050 + +#include <libkern/OSByteOrder.h> + +static struct font_driver macfont_driver; + +/* Core Text, for Mac OS X 10.5 and later. */ +static Lisp_Object Qmac_ct; + +static double mac_ctfont_get_advance_width_for_glyph (CTFontRef, CGGlyph); +static CGRect mac_ctfont_get_bounding_rect_for_glyph (CTFontRef, CGGlyph); +static CFArrayRef mac_ctfont_create_available_families (void); +static Boolean mac_ctfont_equal_in_postscript_name (CTFontRef, CTFontRef); +static CTLineRef mac_ctfont_create_line_with_string_and_font (CFStringRef, + CTFontRef); +static CFComparisonResult mac_font_family_compare (const void *, + const void *, void *); +static Boolean mac_ctfont_descriptor_supports_languages (CTFontDescriptorRef, + CFArrayRef); +static CFStringRef mac_ctfont_create_preferred_family_for_attributes (CFDictionaryRef); +static CFIndex mac_ctfont_shape (CTFontRef, CFStringRef, + struct mac_glyph_layout *, CFIndex); +#if USE_CT_GLYPH_INFO +static CGGlyph mac_ctfont_get_glyph_for_cid (CTFontRef, + CTCharacterCollection, + CGFontIndex); +#endif + +/* The font property key specifying the font design destination. The + value is an unsigned integer code: 0 for WYSIWIG, and 1 for Video + text. (See the documentation of X Logical Font Description + Conventions.) In the Mac font driver, 1 means the screen font is + used for calculating some glyph metrics. You can see the + difference with Monaco 8pt or 9pt, for example. */ +static Lisp_Object QCdestination; + +/* The boolean-valued font property key specifying the use of + leading. */ +static Lisp_Object QCminspace; + +struct macfont_metrics; + +/* The actual structure for Mac font that can be casted to struct font. */ + +struct macfont_info +{ + struct font font; + FontRef macfont; + CGFontRef cgfont; + ScreenFontRef screen_font; + struct macfont_cache *cache; + struct macfont_metrics **metrics; + short metrics_nrows; + unsigned synthetic_italic_p : 1; + unsigned synthetic_bold_p : 1; + unsigned spacing : 2; + unsigned antialias : 2; + unsigned color_bitmap_p : 1; +}; + +/* Values for the `spacing' member in `struct macfont_info'. */ + +enum + { + MACFONT_SPACING_PROPORTIONAL, + MACFONT_SPACING_MONO, + MACFONT_SPACING_SYNTHETIC_MONO, + }; + +/* Values for the `antialias' member in `struct macfont_info'. */ + +enum + { + MACFONT_ANTIALIAS_DEFAULT, + MACFONT_ANTIALIAS_OFF, + MACFONT_ANTIALIAS_ON, + }; + +enum {FONT_SLANT_SYNTHETIC_ITALIC = 200}; /* FC_SLANT_ITALIC + 100 */ +enum {FONT_WEIGHT_SYNTHETIC_BOLD = 200}; /* FC_WEIGHT_BOLD */ +enum {FONT_SPACING_SYNTHETIC_MONO = FONT_SPACING_MONO}; + +static const CGAffineTransform synthetic_italic_atfm = {1, 0, 0.25, 1, 0, 0}; +static const CGFloat synthetic_bold_factor = 0.024; + +static Boolean cfnumber_get_font_symbolic_traits_value (CFNumberRef, + FontSymbolicTraits *); +static void macfont_store_descriptor_attributes (FontDescriptorRef, + Lisp_Object); +static Lisp_Object macfont_descriptor_entity (FontDescriptorRef, + Lisp_Object, + FontSymbolicTraits); +static CFStringRef macfont_create_family_with_symbol (Lisp_Object); +static int macfont_glyph_extents (struct font *, CGGlyph, + struct font_metrics *, CGFloat *, int); +static CFMutableDictionaryRef macfont_create_attributes_with_spec (Lisp_Object); +static Boolean macfont_supports_charset_and_languages_p (FontDescriptorRef, + CFCharacterSetRef, + Lisp_Object, + CFArrayRef); +static CFIndex macfont_closest_traits_index (CFArrayRef, + FontSymbolicTraits); +static CFDataRef mac_font_copy_uvs_table (FontRef); +static void mac_font_get_glyphs_for_variants (CFDataRef, UTF32Char, + const UTF32Char [], + CGGlyph [], CFIndex); + +/* From CFData to a lisp string. Always returns a unibyte string. */ + +static Lisp_Object +cfdata_to_lisp (CFDataRef data) +{ + CFIndex len = CFDataGetLength (data); + Lisp_Object result = make_uninit_string (len); + + CFDataGetBytes (data, CFRangeMake (0, len), SDATA (result)); + + return result; +} + + + +/* From CFString to a lisp string. Returns a unibyte string + containing a UTF-8 byte sequence. */ + +static Lisp_Object +cfstring_to_lisp_nodecode (CFStringRef string) +{ + Lisp_Object result = Qnil; + CFDataRef data; + const char *s = CFStringGetCStringPtr (string, kCFStringEncodingUTF8); + + if (s) + { + CFIndex i, length = CFStringGetLength (string); + + for (i = 0; i < length; i++) + if (CFStringGetCharacterAtIndex (string, i) == 0) + break; + + if (i == length) + return make_unibyte_string (s, strlen (s)); + } + + data = CFStringCreateExternalRepresentation (NULL, string, + kCFStringEncodingUTF8, '?'); + if (data) + { + result = cfdata_to_lisp (data); + CFRelease (data); + } + + return result; +} + +/* Lisp string containing a UTF-8 byte sequence to CFString. Unlike + cfstring_create_with_utf8_cstring, this function preserves NUL + characters. */ + +static CFStringRef +cfstring_create_with_string_noencode (Lisp_Object s) +{ + CFStringRef string = CFStringCreateWithBytes (NULL, SDATA (s), SBYTES (s), + kCFStringEncodingUTF8, false); + + if (string == NULL) + /* Failed to interpret as UTF 8. Fall back on Mac Roman. */ + string = CFStringCreateWithBytes (NULL, SDATA (s), SBYTES (s), + kCFStringEncodingMacRoman, false); + + return string; +} + +static CGFloat +mac_screen_font_get_advance_width_for_glyph (ScreenFontRef font, CGGlyph glyph) +{ + NSSize advancement = [(NSFont *)font advancementForGlyph:glyph]; + + return advancement.width; +} + +static CGGlyph +mac_font_get_glyph_for_cid (FontRef font, CharacterCollection collection, + CGFontIndex cid) +{ +#if USE_CT_GLYPH_INFO + return mac_ctfont_get_glyph_for_cid ((CTFontRef) font, collection, cid); +#else + { + CGGlyph result = kCGFontIndexInvalid; + NSFont *nsFont = (NSFont *) font; + unichar characters[] = {0xfffd}; + NSString *string = + [NSString stringWithCharacters:characters + length:(sizeof (characters) + / sizeof (characters[0]))]; + NSGlyphInfo *glyphInfo = + [NSGlyphInfo glyphInfoWithCharacterIdentifier:cid + collection:collection + baseString:string]; + NSDictionary *attributes = + [NSDictionary dictionaryWithObjectsAndKeys:nsFont,NSFontAttributeName, + glyphInfo,NSGlyphInfoAttributeName,nil]; + NSTextStorage *textStorage = + [[NSTextStorage alloc] initWithString:string + attributes:attributes]; + NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; + NSTextContainer *textContainer = [[NSTextContainer alloc] init]; + NSFont *fontInTextStorage; + + [layoutManager addTextContainer:textContainer]; + [textContainer release]; + [textStorage addLayoutManager:layoutManager]; + [layoutManager release]; + + /* Force layout. */ + (void) [layoutManager glyphRangeForTextContainer:textContainer]; + + fontInTextStorage = [textStorage attribute:NSFontAttributeName atIndex:0 + effectiveRange:NULL]; + if (fontInTextStorage == nsFont + || [[fontInTextStorage fontName] isEqualToString:[nsFont fontName]]) + { + NSGlyph glyph = [layoutManager glyphAtIndex:0]; + + if (glyph < [nsFont numberOfGlyphs]) + result = glyph; + } + + [textStorage release]; + + return result; + } +} +#endif + +static ScreenFontRef +mac_screen_font_create_with_name (CFStringRef name, CGFloat size) +{ + NSFont *result, *font; + + font = [NSFont fontWithName:((NSString *) name) size:size]; + result = [font screenFont]; + + return (ScreenFontRef)[result retain]; +} + + +static Boolean +mac_screen_font_get_metrics (ScreenFontRef font, CGFloat *ascent, + CGFloat *descent, CGFloat *leading) +{ + NSFont *nsFont = [(NSFont *)font printerFont]; + NSTextStorage *textStorage; + NSLayoutManager *layoutManager; + NSTextContainer *textContainer; + NSRect usedRect; + NSPoint spaceLocation; + CGFloat descender; + + textStorage = [[NSTextStorage alloc] initWithString:@" "]; + layoutManager = [[NSLayoutManager alloc] init]; + textContainer = [[NSTextContainer alloc] init]; + + [textStorage setFont:nsFont]; + [textContainer setLineFragmentPadding:0]; + [layoutManager setUsesScreenFonts:YES]; + + [layoutManager addTextContainer:textContainer]; + [textContainer release]; + [textStorage addLayoutManager:layoutManager]; + [layoutManager release]; + + if (!(textStorage && layoutManager && textContainer)) + { + [textStorage release]; + + return false; + } + + usedRect = [layoutManager lineFragmentUsedRectForGlyphAtIndex:0 + effectiveRange:NULL]; + spaceLocation = [layoutManager locationForGlyphAtIndex:0]; + [textStorage release]; + + *ascent = spaceLocation.y; + *descent = NSHeight (usedRect) - spaceLocation.y; + *leading = 0; + descender = [nsFont descender]; + if (- descender < *descent) + { + *leading = *descent + descender; + *descent = - descender; + } + + return true; +} + +static CFIndex +mac_font_shape_1 (NSFont *font, NSString *string, + struct mac_glyph_layout *glyph_layouts, CFIndex glyph_len, + BOOL screen_font_p) +{ + NSUInteger i; + CFIndex result = 0; + NSTextStorage *textStorage; + NSLayoutManager *layoutManager; + NSTextContainer *textContainer; + NSUInteger stringLength; + NSPoint spaceLocation; + NSUInteger used, numberOfGlyphs; + + textStorage = [[NSTextStorage alloc] initWithString:string]; + layoutManager = [[NSLayoutManager alloc] init]; + textContainer = [[NSTextContainer alloc] init]; + + /* Append a trailing space to measure baseline position. */ + [textStorage appendAttributedString:([[[NSAttributedString alloc] + initWithString:@" "] autorelease])]; + [textStorage setFont:font]; + [textContainer setLineFragmentPadding:0]; + [layoutManager setUsesScreenFonts:screen_font_p]; + + [layoutManager addTextContainer:textContainer]; + [textContainer release]; + [textStorage addLayoutManager:layoutManager]; + [layoutManager release]; + + if (!(textStorage && layoutManager && textContainer)) + { + [textStorage release]; + + return 0; + } + + stringLength = [string length]; + + /* Force layout. */ + (void) [layoutManager glyphRangeForTextContainer:textContainer]; + + spaceLocation = [layoutManager locationForGlyphAtIndex:stringLength]; + + /* Remove the appended trailing space because otherwise it may + generate a wrong result for a right-to-left text. */ + [textStorage beginEditing]; + [textStorage deleteCharactersInRange:(NSMakeRange (stringLength, 1))]; + [textStorage endEditing]; + (void) [layoutManager glyphRangeForTextContainer:textContainer]; + + i = 0; + while (i < stringLength) + { + NSRange range; + NSFont *fontInTextStorage = + [textStorage attribute:NSFontAttributeName atIndex:i + longestEffectiveRange:&range + inRange:(NSMakeRange (0, stringLength))]; + + if (!(fontInTextStorage == font + || [[fontInTextStorage fontName] isEqualToString:[font fontName]])) + break; + i = NSMaxRange (range); + } + if (i < stringLength) + /* Make the test `used <= glyph_len' below fail if textStorage + contained some fonts other than the specified one. */ + used = glyph_len + 1; + else + { + NSRange range = NSMakeRange (0, stringLength); + + range = [layoutManager glyphRangeForCharacterRange:range + actualCharacterRange:NULL]; + numberOfGlyphs = NSMaxRange (range); + used = numberOfGlyphs; + for (i = 0; i < numberOfGlyphs; i++) + if ([layoutManager notShownAttributeForGlyphAtIndex:i]) + used--; + } + + if (0 < used && used <= glyph_len) + { + NSUInteger glyphIndex, prevGlyphIndex; + unsigned char bidiLevel; + NSUInteger *permutation; + NSRange compRange, range; + CGFloat totalAdvance; + + glyphIndex = 0; + while ([layoutManager notShownAttributeForGlyphAtIndex:glyphIndex]) + glyphIndex++; + + /* For now we assume the direction is not changed within the + string. */ + [layoutManager getGlyphsInRange:(NSMakeRange (glyphIndex, 1)) + glyphs:NULL characterIndexes:NULL + glyphInscriptions:NULL elasticBits:NULL + bidiLevels:&bidiLevel]; + if (bidiLevel & 1) + permutation = xmalloc (sizeof (NSUInteger) * used); + else + permutation = NULL; + +#define RIGHT_TO_LEFT_P permutation + + /* Fill the `comp_range' member of struct mac_glyph_layout, and + setup a permutation for right-to-left text. */ + compRange = NSMakeRange (0, 0); + for (range = NSMakeRange (0, 0); NSMaxRange (range) < used; + range.length++) + { + struct mac_glyph_layout *gl = glyph_layouts + NSMaxRange (range); + NSUInteger characterIndex = + [layoutManager characterIndexForGlyphAtIndex:glyphIndex]; + + gl->string_index = characterIndex; + + if (characterIndex >= NSMaxRange (compRange)) + { + compRange.location = NSMaxRange (compRange); + do + { + NSRange characterRange = + [string + rangeOfComposedCharacterSequenceAtIndex:characterIndex]; + + compRange.length = + NSMaxRange (characterRange) - compRange.location; + [layoutManager glyphRangeForCharacterRange:compRange + actualCharacterRange:&characterRange]; + characterIndex = NSMaxRange (characterRange) - 1; + } + while (characterIndex >= NSMaxRange (compRange)); + + if (RIGHT_TO_LEFT_P) + for (i = 0; i < range.length; i++) + permutation[range.location + i] = NSMaxRange (range) - i - 1; + + range = NSMakeRange (NSMaxRange (range), 0); + } + + gl->comp_range.location = compRange.location; + gl->comp_range.length = compRange.length; + + while (++glyphIndex < numberOfGlyphs) + if (![layoutManager notShownAttributeForGlyphAtIndex:glyphIndex]) + break; + } + if (RIGHT_TO_LEFT_P) + for (i = 0; i < range.length; i++) + permutation[range.location + i] = NSMaxRange (range) - i - 1; + + /* Then fill the remaining members. */ + glyphIndex = prevGlyphIndex = 0; + while ([layoutManager notShownAttributeForGlyphAtIndex:glyphIndex]) + glyphIndex++; + + if (!RIGHT_TO_LEFT_P) + totalAdvance = 0; + else + { + NSUInteger nrects; + NSRect *glyphRects = + [layoutManager + rectArrayForGlyphRange:(NSMakeRange (0, numberOfGlyphs)) + withinSelectedGlyphRange:(NSMakeRange (NSNotFound, 0)) + inTextContainer:textContainer rectCount:&nrects]; + + totalAdvance = NSMaxX (glyphRects[0]); + } + + for (i = 0; i < used; i++) + { + struct mac_glyph_layout *gl; + NSPoint location; + NSUInteger nextGlyphIndex; + NSRange glyphRange; + NSRect *glyphRects; + NSUInteger nrects; + + if (!RIGHT_TO_LEFT_P) + gl = glyph_layouts + i; + else + { + NSUInteger dest = permutation[i]; + + gl = glyph_layouts + dest; + if (i < dest) + { + CFIndex tmp = gl->string_index; + + gl->string_index = glyph_layouts[i].string_index; + glyph_layouts[i].string_index = tmp; + } + } + gl->glyph_id = [layoutManager glyphAtIndex:glyphIndex]; + + location = [layoutManager locationForGlyphAtIndex:glyphIndex]; + gl->baseline_delta = spaceLocation.y - location.y; + + for (nextGlyphIndex = glyphIndex + 1; nextGlyphIndex < numberOfGlyphs; + nextGlyphIndex++) + if (![layoutManager + notShownAttributeForGlyphAtIndex:nextGlyphIndex]) + break; + + if (!RIGHT_TO_LEFT_P) + { + CGFloat maxX; + + if (prevGlyphIndex == 0) + glyphRange = NSMakeRange (0, nextGlyphIndex); + else + glyphRange = NSMakeRange (glyphIndex, + nextGlyphIndex - glyphIndex); + glyphRects = + [layoutManager + rectArrayForGlyphRange:glyphRange + withinSelectedGlyphRange:(NSMakeRange (NSNotFound, 0)) + inTextContainer:textContainer rectCount:&nrects]; + maxX = max (NSMaxX (glyphRects[0]), totalAdvance); + gl->advance_delta = location.x - totalAdvance; + gl->advance = maxX - totalAdvance; + totalAdvance = maxX; + } + else + { + CGFloat minX; + + if (nextGlyphIndex == numberOfGlyphs) + glyphRange = NSMakeRange (prevGlyphIndex, + numberOfGlyphs - prevGlyphIndex); + else + glyphRange = NSMakeRange (prevGlyphIndex, + glyphIndex + 1 - prevGlyphIndex); + glyphRects = + [layoutManager + rectArrayForGlyphRange:glyphRange + withinSelectedGlyphRange:(NSMakeRange (NSNotFound, 0)) + inTextContainer:textContainer rectCount:&nrects]; + minX = min (NSMinX (glyphRects[0]), totalAdvance); + gl->advance = totalAdvance - minX; + totalAdvance = minX; + gl->advance_delta = location.x - totalAdvance; + } + + prevGlyphIndex = glyphIndex + 1; + glyphIndex = nextGlyphIndex; + } + + if (RIGHT_TO_LEFT_P) + xfree (permutation); + +#undef RIGHT_TO_LEFT_P + + result = used; + } + [textStorage release]; + + return result; +} + +static CFIndex +mac_screen_font_shape (ScreenFontRef font, CFStringRef string, + struct mac_glyph_layout *glyph_layouts, + CFIndex glyph_len) +{ + return mac_font_shape_1 ([(NSFont *)font printerFont], + (NSString *) string, + glyph_layouts, glyph_len, YES); +} + +static CGColorRef +get_cgcolor(unsigned long idx, struct frame *f) +{ + NSColor *nsColor = ns_lookup_indexed_color (idx, f); + [nsColor set]; + CGColorSpaceRef colorSpace = [[nsColor colorSpace] CGColorSpace]; + NSInteger noc = [nsColor numberOfComponents]; + CGFloat *components = xmalloc (sizeof(CGFloat)*(1+noc)); + CGColorRef cgColor; + + [nsColor getComponents: components]; + cgColor = CGColorCreate (colorSpace, components); + xfree (components); + return cgColor; +} + +#define CG_SET_FILL_COLOR_WITH_GC_FOREGROUND(context, s) \ + CGContextSetFillColorWithColor (context, \ + get_cgcolor (NS_FACE_FOREGROUND (s->face), \ + s->f)) + +#define CG_SET_FILL_COLOR_WITH_GC_BACKGROUND(context, s) \ + CGContextSetFillColorWithColor (context, \ + get_cgcolor (NS_FACE_BACKGROUND (s->face), \ + s->f)) + +#define CG_SET_STROKE_COLOR_WITH_GC_FOREGROUND(context, s) \ + CGContextSetStrokeColorWithColor (context, \ + get_cgcolor (NS_FACE_FOREGROUND (s->face),\ + s->f)) + + +/* Mac font driver. */ + +static struct +{ + /* registry name */ + const char *name; + /* characters to distinguish the charset from the others */ + int uniquifier[6]; + /* additional constraint by language */ + CFStringRef lang; + /* set on demand */ + CFCharacterSetRef cf_charset; + CFStringRef cf_charset_string; +} cf_charset_table[] = + { { "iso8859-1", { 0x00A0, 0x00A1, 0x00B4, 0x00BC, 0x00D0 } }, + { "iso8859-2", { 0x00A0, 0x010E }}, + { "iso8859-3", { 0x00A0, 0x0108 }}, + { "iso8859-4", { 0x00A0, 0x00AF, 0x0128, 0x0156, 0x02C7 }}, + { "iso8859-5", { 0x00A0, 0x0401 }}, + { "iso8859-6", { 0x00A0, 0x060C }}, + { "iso8859-7", { 0x00A0, 0x0384 }}, + { "iso8859-8", { 0x00A0, 0x05D0 }}, + { "iso8859-9", { 0x00A0, 0x00A1, 0x00BC, 0x011E }}, + { "iso8859-10", { 0x00A0, 0x00D0, 0x0128, 0x2015 }}, + { "iso8859-11", { 0x00A0, 0x0E01 }}, + { "iso8859-13", { 0x00A0, 0x201C }}, + { "iso8859-14", { 0x00A0, 0x0174 }}, + { "iso8859-15", { 0x00A0, 0x00A1, 0x00D0, 0x0152 }}, + { "iso8859-16", { 0x00A0, 0x0218}}, + { "gb2312.1980-0", { 0x4E13 }, CFSTR ("zh-Hans")}, + { "big5-0", { /* 0xF6B1 in ftfont.c */ 0xF7E5 }, CFSTR ("zh-Hant") }, + { "jisx0208.1983-0", { 0x4E55 }, CFSTR ("ja")}, + { "ksc5601.1987-0", { 0xAC00 }, CFSTR ("ko")}, + { "cns11643.1992-1", { 0xFE32 }, CFSTR ("zh-Hant")}, + { "cns11643.1992-2", { 0x4E33, 0x7934 }}, + { "cns11643.1992-3", { 0x201A9 }}, + { "cns11643.1992-4", { 0x20057 }}, + { "cns11643.1992-5", { 0x20000 }}, + { "cns11643.1992-6", { 0x20003 }}, + { "cns11643.1992-7", { 0x20055 }}, + { "gbk-0", { 0x4E06 }, CFSTR ("zh-Hans")}, + { "jisx0212.1990-0", { 0x4E44 }}, + { "jisx0213.2000-1", { 0xFA10 }, CFSTR ("ja")}, + { "jisx0213.2000-2", { 0xFA49 }}, + { "jisx0213.2004-1", { 0x20B9F }}, + { "viscii1.1-1", { 0x1EA0, 0x1EAE, 0x1ED2 }, CFSTR ("vi")}, + { "tis620.2529-1", { 0x0E01 }, CFSTR ("th")}, + { "windows-1251", { 0x0401, 0x0490 }, CFSTR ("ru")}, + { "koi8-r", { 0x0401, 0x2219 }, CFSTR ("ru")}, + { "mulelao-1", { 0x0E81 }, CFSTR ("lo")}, + { "unicode-sip", { 0x20000 }}, + { NULL } + }; + +static CGFloat macfont_antialias_threshold; + +void +macfont_update_antialias_threshold (void) +{ + int threshold; + Boolean valid_p; + + threshold = + CFPreferencesGetAppIntegerValue (CFSTR ("AppleAntiAliasingThreshold"), + kCFPreferencesCurrentApplication, + &valid_p); + if (valid_p) + macfont_antialias_threshold = threshold; +} + +static inline Lisp_Object +macfont_intern_prop_cfstring (CFStringRef cfstring) +{ + Lisp_Object string = cfstring_to_lisp_nodecode (cfstring); + + return font_intern_prop (SSDATA (string), SBYTES (string), 1); +} + +static inline CFIndex +macfont_store_utf32char_to_unichars (UTF32Char c, UniChar *unichars) +{ + if (c < 0x10000) + { + unichars[0] = c; + + return 1; + } + else + { + c -= 0x10000; + unichars[0] = (c >> 10) + 0xD800; + unichars[1] = (c & 0x3FF) + 0xDC00; + + return 2; + } +} + +static Boolean +cfnumber_get_font_symbolic_traits_value (CFNumberRef number, + FontSymbolicTraits *sym_traits) +{ + SInt64 sint64_value; + + /* Getting symbolic traits with kCFNumberSInt32Type is lossy on Mac + OS 10.6 when the value is greater than or equal to 1 << 31. */ + if (CFNumberGetValue (number, kCFNumberSInt64Type, &sint64_value)) + { + *sym_traits = (FontSymbolicTraits) sint64_value; + + return true; + } + + return false; +} + +static void +macfont_store_descriptor_attributes (FontDescriptorRef desc, + Lisp_Object spec_or_entity) +{ + CFStringRef str; + CFDictionaryRef dict; + CFNumberRef num; + CGFloat floatval; + + str = mac_font_descriptor_copy_attribute (desc, + MAC_FONT_FAMILY_NAME_ATTRIBUTE); + if (str) + { + ASET (spec_or_entity, FONT_FAMILY_INDEX, + macfont_intern_prop_cfstring (str)); + CFRelease (str); + } + dict = mac_font_descriptor_copy_attribute (desc, MAC_FONT_TRAITS_ATTRIBUTE); + if (dict) + { + struct { + enum font_property_index index; + CFStringRef trait; + CGPoint points[6]; + } numeric_traits[] = + {{FONT_WEIGHT_INDEX, MAC_FONT_WEIGHT_TRAIT, + {{-0.4, 50}, /* light */ + {-0.24, 87.5}, /* (semi-light + normal) / 2 */ + {0, 100}, /* normal */ + {0.24, 140}, /* (semi-bold + normal) / 2 */ + {0.4, 200}, /* bold */ + {CGFLOAT_MAX, CGFLOAT_MAX}}}, + {FONT_SLANT_INDEX, MAC_FONT_SLANT_TRAIT, + {{0, 100}, {0.1, 200}, {CGFLOAT_MAX, CGFLOAT_MAX}}}, + {FONT_WIDTH_INDEX, MAC_FONT_WIDTH_TRAIT, + {{0, 100}, {1, 200}, {CGFLOAT_MAX, CGFLOAT_MAX}}}}; + int i; + + for (i = 0; i < sizeof (numeric_traits) / sizeof (numeric_traits[0]); i++) + { + num = CFDictionaryGetValue (dict, numeric_traits[i].trait); + if (num && CFNumberGetValue (num, kCFNumberCGFloatType, &floatval)) + { + CGPoint *point = numeric_traits[i].points; + + while (point->x < floatval) + point++; + if (point == numeric_traits[i].points) + point++; + else if (point->x == CGFLOAT_MAX) + point--; + floatval = (point - 1)->y + ((floatval - (point - 1)->x) + * ((point->y - (point - 1)->y) + / (point->x - (point - 1)->x))); + FONT_SET_STYLE (spec_or_entity, numeric_traits[i].index, + make_number (lround (floatval))); + } + } + + num = CFDictionaryGetValue (dict, MAC_FONT_SYMBOLIC_TRAIT); + if (num) + { + FontSymbolicTraits sym_traits; + int spacing; + + cfnumber_get_font_symbolic_traits_value (num, &sym_traits); + spacing = (sym_traits & MAC_FONT_TRAIT_MONO_SPACE + ? FONT_SPACING_MONO : FONT_SPACING_PROPORTIONAL); + ASET (spec_or_entity, FONT_SPACING_INDEX, make_number (spacing)); + } + + CFRelease (dict); + } + num = mac_font_descriptor_copy_attribute (desc, MAC_FONT_SIZE_ATTRIBUTE); + if (num && CFNumberGetValue (num, kCFNumberCGFloatType, &floatval)) + ASET (spec_or_entity, FONT_SIZE_INDEX, make_number (floatval)); + else + ASET (spec_or_entity, FONT_SIZE_INDEX, make_number (0)); + if (num) + CFRelease (num); +} + +static Lisp_Object +macfont_descriptor_entity (FontDescriptorRef desc, Lisp_Object extra, + FontSymbolicTraits synth_sym_traits) +{ + Lisp_Object entity; + CFDictionaryRef dict; + FontSymbolicTraits sym_traits = 0; + CFStringRef name; + + entity = font_make_entity (); + + ASET (entity, FONT_TYPE_INDEX, macfont_driver.type); + ASET (entity, FONT_REGISTRY_INDEX, Qiso10646_1); + + macfont_store_descriptor_attributes (desc, entity); + + dict = mac_font_descriptor_copy_attribute (desc, MAC_FONT_TRAITS_ATTRIBUTE); + if (dict) + { + CFNumberRef num = CFDictionaryGetValue (dict, MAC_FONT_SYMBOLIC_TRAIT); + + if (num) + cfnumber_get_font_symbolic_traits_value (num, &sym_traits); + CFRelease (dict); + } + if (EQ (AREF (entity, FONT_SIZE_INDEX), make_number (0))) + ASET (entity, FONT_AVGWIDTH_INDEX, make_number (0)); + ASET (entity, FONT_EXTRA_INDEX, Fcopy_sequence (extra)); + name = mac_font_descriptor_copy_attribute (desc, MAC_FONT_NAME_ATTRIBUTE); + font_put_extra (entity, QCfont_entity, + make_save_ptr_int ((void *) name, sym_traits)); + if (synth_sym_traits & MAC_FONT_TRAIT_ITALIC) + FONT_SET_STYLE (entity, FONT_SLANT_INDEX, + make_number (FONT_SLANT_SYNTHETIC_ITALIC)); + if (synth_sym_traits & MAC_FONT_TRAIT_BOLD) + FONT_SET_STYLE (entity, FONT_WEIGHT_INDEX, + make_number (FONT_WEIGHT_SYNTHETIC_BOLD)); + if (synth_sym_traits & MAC_FONT_TRAIT_MONO_SPACE) + ASET (entity, FONT_SPACING_INDEX, + make_number (FONT_SPACING_SYNTHETIC_MONO)); + + return entity; +} + +static CFStringRef +macfont_create_family_with_symbol (Lisp_Object symbol) +{ + static CFArrayRef families = NULL; + CFStringRef result = NULL, family_name; + int using_cache_p = 1; + CFComparatorFunction family_name_comparator; + + family_name = cfstring_create_with_string_noencode (SYMBOL_NAME (symbol)); + if (family_name == NULL) + return NULL; + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060 +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 + if (CTFontManagerCompareFontFamilyNames != NULL) +#endif + { + family_name_comparator = CTFontManagerCompareFontFamilyNames; + } +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 + else /* CTFontManagerCompareFontFamilyNames == NULL */ +#endif +#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 1060 */ +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 + { + family_name_comparator = mac_font_family_compare; + } +#endif + + if ((*family_name_comparator) (family_name, CFSTR ("LastResort"), NULL) + == kCFCompareEqualTo) + result = CFSTR ("LastResort"); + else + while (1) + { + CFIndex i, count; + + if (families == NULL) + { + families = mac_font_create_available_families (); + using_cache_p = 0; + if (families == NULL) + break; + } + + count = CFArrayGetCount (families); + i = CFArrayBSearchValues (families, CFRangeMake (0, count), + (const void *) family_name, + family_name_comparator, NULL); + if (i < count) + { + CFStringRef name = CFArrayGetValueAtIndex (families, i); + + if ((*family_name_comparator) (name, family_name, NULL) + == kCFCompareEqualTo) + result = CFRetain (name); + } + + if (result || !using_cache_p) + break; + else + { + CFRelease (families); + families = NULL; + } + } + + CFRelease (family_name); + + return result; +} + +#define WIDTH_FRAC_BITS (4) +#define WIDTH_FRAC_SCALE (2 * ((1 << (WIDTH_FRAC_BITS - 1)) - 1)) + +struct macfont_metrics +{ + unsigned char lbearing_low, rbearing_low; + signed lbearing_high : 4, rbearing_high : 4; + unsigned char ascent_low, descent_low; + signed ascent_high : 4, descent_high : 4; + + /* These two members are used for fixed-point representation of + glyph width. The `width_int' member is an integer that is + closest to the width. The `width_frac' member is the fractional + adjustment representing a value in [-.5, .5], multiplied by + WIDTH_FRAC_SCALE. For synthetic monospace fonts, they represent + the advance delta for centering instead of the glyph width. */ + signed width_frac : WIDTH_FRAC_BITS, width_int : 16 - WIDTH_FRAC_BITS; +}; + +#define METRICS_VALUE(metrics, member) \ + (((metrics)->member##_high << 8) | (metrics)->member##_low) +#define METRICS_SET_VALUE(metrics, member, value) \ + do {short tmp = (value); (metrics)->member##_low = tmp & 0xff; \ + (metrics)->member##_high = tmp >> 8;} while (0) + +enum metrics_status + { + METRICS_INVALID = -1, /* metrics entry is invalid */ + METRICS_WIDTH_VALID = -2 /* width is valid but others are invalid */ + }; + +#define METRICS_STATUS(metrics) \ + (METRICS_VALUE (metrics, ascent) + METRICS_VALUE (metrics, descent)) +#define METRICS_SET_STATUS(metrics, status) \ + do {METRICS_SET_VALUE (metrics, ascent, 0); \ + METRICS_SET_VALUE (metrics, descent, status);} while (0) + +#define METRICS_NCOLS_PER_ROW (128) +#define LCD_FONT_SMOOTHING_LEFT_MARGIN (0.396f) +#define LCD_FONT_SMOOTHING_RIGHT_MARGIN (0.396f) + +static int +macfont_glyph_extents (struct font *font, CGGlyph glyph, + struct font_metrics *metrics, CGFloat *advance_delta, + int force_integral_p) +{ + struct macfont_info *macfont_info = (struct macfont_info *) font; + FontRef macfont = macfont_info->macfont; + int row, col; + struct macfont_metrics *cache; + int width; + + row = glyph / METRICS_NCOLS_PER_ROW; + col = glyph % METRICS_NCOLS_PER_ROW; + if (row >= macfont_info->metrics_nrows) + { + macfont_info->metrics = + xrealloc (macfont_info->metrics, + sizeof (struct macfont_metrics *) * (row + 1)); + memset (macfont_info->metrics + macfont_info->metrics_nrows, 0, + (sizeof (struct macfont_metrics *) + * (row + 1 - macfont_info->metrics_nrows))); + macfont_info->metrics_nrows = row + 1; + } + if (macfont_info->metrics[row] == NULL) + { + struct macfont_metrics *new; + int i; + + new = xmalloc (sizeof (struct macfont_metrics) * METRICS_NCOLS_PER_ROW); + for (i = 0; i < METRICS_NCOLS_PER_ROW; i++) + METRICS_SET_STATUS (new + i, METRICS_INVALID); + macfont_info->metrics[row] = new; + } + cache = macfont_info->metrics[row] + col; + + if (METRICS_STATUS (cache) == METRICS_INVALID) + { + CGFloat fwidth; + + if (macfont_info->screen_font) + fwidth = mac_screen_font_get_advance_width_for_glyph (macfont_info->screen_font, glyph); + else + fwidth = mac_font_get_advance_width_for_glyph (macfont, glyph); + + /* For synthetic mono fonts, cache->width_{int,frac} holds the + advance delta value. */ + if (macfont_info->spacing == MACFONT_SPACING_SYNTHETIC_MONO) + fwidth = (font->pixel_size - fwidth) / 2; + cache->width_int = lround (fwidth); + cache->width_frac = lround ((fwidth - cache->width_int) + * WIDTH_FRAC_SCALE); + METRICS_SET_STATUS (cache, METRICS_WIDTH_VALID); + } + if (macfont_info->spacing == MACFONT_SPACING_SYNTHETIC_MONO) + width = font->pixel_size; + else + width = cache->width_int; + + if (metrics) + { + if (METRICS_STATUS (cache) == METRICS_WIDTH_VALID) + { + CGRect bounds = mac_font_get_bounding_rect_for_glyph (macfont, glyph); + + if (macfont_info->synthetic_italic_p) + { + /* We assume the members a, b, c, and d in + synthetic_italic_atfm are non-negative. */ + bounds.origin = + CGPointApplyAffineTransform (bounds.origin, + synthetic_italic_atfm); + bounds.size = + CGSizeApplyAffineTransform (bounds.size, synthetic_italic_atfm); + } + if (macfont_info->synthetic_bold_p) + { + CGFloat d = + - synthetic_bold_factor * mac_font_get_size (macfont) / 2; + + bounds = CGRectInset (bounds, d, d); + } + switch (macfont_info->spacing) + { + case MACFONT_SPACING_PROPORTIONAL: + bounds.origin.x += - (cache->width_frac + / (CGFloat) (WIDTH_FRAC_SCALE * 2)); + break; + case MACFONT_SPACING_MONO: + break; + case MACFONT_SPACING_SYNTHETIC_MONO: + bounds.origin.x += (cache->width_int + + (cache->width_frac + / (CGFloat) WIDTH_FRAC_SCALE)); + break; + } + if (bounds.size.width > 0) + { + bounds.origin.x -= LCD_FONT_SMOOTHING_LEFT_MARGIN; + bounds.size.width += (LCD_FONT_SMOOTHING_LEFT_MARGIN + + LCD_FONT_SMOOTHING_RIGHT_MARGIN); + } + bounds = CGRectIntegral (bounds); + METRICS_SET_VALUE (cache, lbearing, CGRectGetMinX (bounds)); + METRICS_SET_VALUE (cache, rbearing, CGRectGetMaxX (bounds)); + METRICS_SET_VALUE (cache, ascent, CGRectGetMaxY (bounds)); + METRICS_SET_VALUE (cache, descent, -CGRectGetMinY (bounds)); + } + metrics->lbearing = METRICS_VALUE (cache, lbearing); + metrics->rbearing = METRICS_VALUE (cache, rbearing); + metrics->width = width; + metrics->ascent = METRICS_VALUE (cache, ascent); + metrics->descent = METRICS_VALUE (cache, descent); + } + + if (advance_delta) + { + switch (macfont_info->spacing) + { + case MACFONT_SPACING_PROPORTIONAL: + *advance_delta = (force_integral_p ? 0 + : - (cache->width_frac + / (CGFloat) (WIDTH_FRAC_SCALE * 2))); + break; + case MACFONT_SPACING_MONO: + *advance_delta = 0; + break; + case MACFONT_SPACING_SYNTHETIC_MONO: + *advance_delta = (force_integral_p ? cache->width_int + : (cache->width_int + + (cache->width_frac + / (CGFloat) WIDTH_FRAC_SCALE))); + break; + } + } + + return width; +} + +static CFMutableDictionaryRef macfont_cache_dictionary; + +/* Threshold used in row_nkeys_or_perm. This must be less than or + equal to the number of rows that are invalid as BMP (i.e., from + U+D800 to U+DFFF). */ +#define ROW_PERM_OFFSET (8) + +/* The number of glyphs that can be stored in a value for a single + entry of CFDictionary. */ +#define NGLYPHS_IN_VALUE (sizeof (void *) / sizeof (CGGlyph)) + +struct macfont_cache +{ + int reference_count; + CFCharacterSetRef cf_charset; + struct { + /* The cached glyph for a BMP character c is stored in + matrix[row_nkeys_or_perm[c / 256] - ROW_PERM_OFFSET][c % 256] + if row_nkeys_or_perm[c / 256] >= ROW_PERM_OFFSET. */ + unsigned char row_nkeys_or_perm[256]; + CGGlyph **matrix; + + /* Number of rows for which the BMP cache is allocated so far. + I.e., matrix[0] ... matrix[nrows - 1] are non-NULL. */ + int nrows; + + /* The cached glyph for a character c is stored as the (c % + NGLYPHS_IN_VALUE)-th CGGlyph block of a value for the key (c / + NGLYPHS_IN_VALUE). However, the glyph for a BMP characrer c is + not stored here if row_nkeys_or_perm[c / 256] >= + ROW_PERM_OFFSET. */ + CFMutableDictionaryRef dictionary; + } glyph; + + struct { + /* UVS (Unicode Variation Sequence) subtable data, which is of + type CFDataRef if available. NULL means it is not initialized + yet. kCFNull means the subtable is not found and there is no + suitable fallback table for this font. */ + CFTypeRef table; + + /* Character collection specifying the destination of the mapping + provided by `table' above. If `table' is obtained from the UVS + subtable in the font cmap table, then the value of this member + should be MAC_CHARACTER_COLLECTION_IDENTITY_MAPPING. */ + CharacterCollection collection; + } uvs; +}; + +static struct macfont_cache *macfont_lookup_cache (CFStringRef); +static struct macfont_cache *macfont_retain_cache (struct macfont_cache *); +static void macfont_release_cache (struct macfont_cache *); +static CFCharacterSetRef macfont_get_cf_charset (struct font *); +static CFCharacterSetRef macfont_get_cf_charset_for_name (CFStringRef); +static CGGlyph macfont_get_glyph_for_character (struct font *, UTF32Char); +static CGGlyph macfont_get_glyph_for_cid (struct font *font, + CharacterCollection, CGFontIndex); +static CFDataRef macfont_get_uvs_table (struct font *, CharacterCollection *); + +static struct macfont_cache * +macfont_lookup_cache (CFStringRef key) +{ + struct macfont_cache *cache; + + if (macfont_cache_dictionary == NULL) + { + macfont_cache_dictionary = + CFDictionaryCreateMutable (NULL, 0, + &kCFTypeDictionaryKeyCallBacks, NULL); + cache = NULL; + } + else + cache = ((struct macfont_cache *) + CFDictionaryGetValue (macfont_cache_dictionary, key)); + + if (cache == NULL) + { + FontRef macfont = mac_font_create_with_name (key, 0); + + if (macfont) + { + cache = xzalloc (sizeof (struct macfont_cache)); + /* Treat the LastResort font as if it contained glyphs for + all characters. This may look too rough, but neither + CTFontCopyCharacterSet nor -[NSFont coveredCharacterSet] + for this font is correct for non-BMP characters on Mac OS + X 10.5, anyway. */ + if (CFStringCompare (key, CFSTR ("LastResort"), 0) + == kCFCompareEqualTo) + { + CFRange range = CFRangeMake (0, MAX_UNICODE_CHAR + 1); + + cache->cf_charset = + CFCharacterSetCreateWithCharactersInRange (NULL, range); + } + if (cache->cf_charset == NULL) + cache->cf_charset = mac_font_copy_character_set (macfont); + CFDictionaryAddValue (macfont_cache_dictionary, key, + (const void *) cache); + CFRelease (macfont); + } + } + + return cache; +} + +static struct macfont_cache * +macfont_retain_cache (struct macfont_cache *cache) +{ + cache->reference_count++; + + return cache; +} + +static void +macfont_release_cache (struct macfont_cache *cache) +{ + if (--cache->reference_count == 0) + { + int i; + + for (i = 0; i < cache->glyph.nrows; i++) + xfree (cache->glyph.matrix[i]); + xfree (cache->glyph.matrix); + if (cache->glyph.dictionary) + CFRelease (cache->glyph.dictionary); + memset (&cache->glyph, 0, sizeof (cache->glyph)); + if (cache->uvs.table) + CFRelease (cache->uvs.table); + memset (&cache->uvs, 0, sizeof (cache->uvs)); + } +} + +static CFCharacterSetRef +macfont_get_cf_charset (struct font *font) +{ + struct macfont_info *macfont_info = (struct macfont_info *) font; + + return macfont_info->cache->cf_charset; +} + +static CFCharacterSetRef +macfont_get_cf_charset_for_name (CFStringRef name) +{ + struct macfont_cache *cache = macfont_lookup_cache (name); + + return cache->cf_charset; +} + +static CGGlyph +macfont_get_glyph_for_character (struct font *font, UTF32Char c) +{ + struct macfont_info *macfont_info = (struct macfont_info *) font; + FontRef macfont = macfont_info->macfont; + struct macfont_cache *cache = macfont_info->cache; + + if (c < 0xD800 || (c > 0xDFFF && c < 0x10000)) + { + int row = c / 256; + int nkeys_or_perm = cache->glyph.row_nkeys_or_perm[row]; + + if (nkeys_or_perm < ROW_PERM_OFFSET) + { + UniChar unichars[256], ch; + CGGlyph *glyphs; + int i, len; + int nrows; +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + dispatch_queue_t queue; + dispatch_group_t group = NULL; +#else + int nkeys; +#endif + + if (row != 0) + { + CFMutableDictionaryRef dictionary; + uintptr_t key, value; + int nshifts; + CGGlyph glyph; + + if (cache->glyph.dictionary == NULL) + cache->glyph.dictionary = + CFDictionaryCreateMutable (NULL, 0, NULL, NULL); + dictionary = cache->glyph.dictionary; + key = c / NGLYPHS_IN_VALUE; + nshifts = ((c % NGLYPHS_IN_VALUE) * sizeof (CGGlyph) * 8); + value = ((uintptr_t) + CFDictionaryGetValue (dictionary, (const void *) key)); + glyph = (value >> nshifts); + if (glyph) + return glyph; + + if (nkeys_or_perm + 1 != ROW_PERM_OFFSET) + { + ch = c; + if (!mac_font_get_glyphs_for_characters (macfont, &ch, + &glyph, 1) + || glyph == 0) + glyph = kCGFontIndexInvalid; + + if (value == 0) + cache->glyph.row_nkeys_or_perm[row] = nkeys_or_perm + 1; + value |= ((uintptr_t) glyph << nshifts); + CFDictionarySetValue (dictionary, (const void *) key, + (const void *) value); + + return glyph; + } + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + queue = + dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + group = dispatch_group_create (); + dispatch_group_async (group, queue, ^{ + int nkeys; + uintptr_t key; +#endif + nkeys = nkeys_or_perm; + for (key = row * (256 / NGLYPHS_IN_VALUE); ; key++) + if (CFDictionaryContainsKey (dictionary, + (const void *) key)) + { + CFDictionaryRemoveValue (dictionary, + (const void *) key); + if (--nkeys == 0) + break; + } +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + }); +#endif + } + + len = 0; + for (i = 0; i < 256; i++) + { + ch = row * 256 + i; + if (CFCharacterSetIsLongCharacterMember (cache->cf_charset, ch)) + unichars[len++] = ch; + } + + glyphs = xmalloc (sizeof (CGGlyph) * 256); + if (len > 0) + { + mac_font_get_glyphs_for_characters (macfont, unichars, + glyphs, len); + while (i > len) + { + int next = unichars[len - 1] % 256; + + while (--i > next) + glyphs[i] = kCGFontIndexInvalid; + + len--; + glyphs[i] = glyphs[len]; + if (len == 0) + break; + } + } + if (i > len) + while (i-- > 0) + glyphs[i] = kCGFontIndexInvalid; + + nrows = cache->glyph.nrows; + nkeys_or_perm = nrows + ROW_PERM_OFFSET; + cache->glyph.row_nkeys_or_perm[row] = nkeys_or_perm; + nrows++; + cache->glyph.matrix = xrealloc (cache->glyph.matrix, + sizeof (CGGlyph *) * nrows); + cache->glyph.matrix[nrows - 1] = glyphs; + cache->glyph.nrows = nrows; + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + if (group) + { + dispatch_group_wait (group, DISPATCH_TIME_FOREVER); + dispatch_release (group); + } +#endif + } + + return cache->glyph.matrix[nkeys_or_perm - ROW_PERM_OFFSET][c % 256]; + } + else + { + uintptr_t key, value; + int nshifts; + CGGlyph glyph; + + if (cache->glyph.dictionary == NULL) + cache->glyph.dictionary = + CFDictionaryCreateMutable (NULL, 0, NULL, NULL); + key = c / NGLYPHS_IN_VALUE; + nshifts = ((c % NGLYPHS_IN_VALUE) * sizeof (CGGlyph) * 8); + value = (uintptr_t) CFDictionaryGetValue (cache->glyph.dictionary, + (const void *) key); + glyph = (value >> nshifts); + if (glyph == 0) + { + UniChar unichars[2]; + CGGlyph glyphs[2]; + CFIndex count = macfont_store_utf32char_to_unichars (c, unichars); + + if (mac_font_get_glyphs_for_characters (macfont, unichars, glyphs, + count)) + glyph = glyphs[0]; + if (glyph == 0) + glyph = kCGFontIndexInvalid; + + value |= ((uintptr_t) glyph << nshifts); + CFDictionarySetValue (cache->glyph.dictionary, + (const void *) key, (const void *) value); + } + + return glyph; + } +} + +static CGGlyph +macfont_get_glyph_for_cid (struct font *font, CharacterCollection collection, + CGFontIndex cid) +{ + struct macfont_info *macfont_info = (struct macfont_info *) font; + FontRef macfont = macfont_info->macfont; + + /* Cache it? */ + return mac_font_get_glyph_for_cid (macfont, collection, cid); +} + +static CFDataRef +macfont_get_uvs_table (struct font *font, CharacterCollection *collection) +{ + struct macfont_info *macfont_info = (struct macfont_info *) font; + FontRef macfont = macfont_info->macfont; + struct macfont_cache *cache = macfont_info->cache; + CFDataRef result = NULL; + + if (cache->uvs.table == NULL) + { + CFDataRef uvs_table = mac_font_copy_uvs_table (macfont); + CharacterCollection uvs_collection = + MAC_CHARACTER_COLLECTION_IDENTITY_MAPPING; + + if (uvs_table == NULL + && mac_font_get_glyph_for_cid (macfont, + MAC_CHARACTER_COLLECTION_ADOBE_JAPAN1, + 6480) != kCGFontIndexInvalid) + { + /* If the glyph for U+4E55 is accessible via its CID 6480, + then we use the Adobe-Japan1 UVS table, which maps a + variation sequence to a CID, as a fallback. */ + static CFDataRef mac_uvs_table_adobe_japan1 = NULL; + + if (mac_uvs_table_adobe_japan1 == NULL) + mac_uvs_table_adobe_japan1 = + CFDataCreateWithBytesNoCopy (NULL, + mac_uvs_table_adobe_japan1_bytes, + sizeof (mac_uvs_table_adobe_japan1_bytes), + kCFAllocatorNull); + if (mac_uvs_table_adobe_japan1) + { + uvs_table = CFRetain (mac_uvs_table_adobe_japan1); + uvs_collection = MAC_CHARACTER_COLLECTION_ADOBE_JAPAN1; + } + } + if (uvs_table == NULL) + cache->uvs.table = kCFNull; + else + cache->uvs.table = uvs_table; + cache->uvs.collection = uvs_collection; + } + + if (cache->uvs.table != kCFNull) + { + result = cache->uvs.table; + *collection = cache->uvs.collection; + } + + return result; +} + +static Lisp_Object macfont_get_cache (struct frame *); +static Lisp_Object macfont_list (struct frame *, Lisp_Object); +static Lisp_Object macfont_match (struct frame *, Lisp_Object); +static Lisp_Object macfont_list_family (struct frame *); +static void macfont_free_entity (Lisp_Object); +static Lisp_Object macfont_open (struct frame *, Lisp_Object, int); +static void macfont_close (struct frame *, struct font *); +static int macfont_has_char (Lisp_Object, int); +static unsigned macfont_encode_char (struct font *, int); +static int macfont_text_extents (struct font *, unsigned int *, int, + struct font_metrics *); +static int macfont_draw (struct glyph_string *, int, int, int, int, bool); +static Lisp_Object macfont_shape (Lisp_Object); +static int macfont_variation_glyphs (struct font *, int c, + unsigned variations[256]); +static void macfont_filter_properties (Lisp_Object, Lisp_Object); + +static struct font_driver macfont_driver = + { + LISP_INITIALLY_ZERO, /* Qmac_ct */ + 0, /* case insensitive */ + macfont_get_cache, + macfont_list, + macfont_match, + macfont_list_family, + macfont_free_entity, + macfont_open, + macfont_close, + NULL, /* prepare_face */ + NULL, /* done_face */ + macfont_has_char, + macfont_encode_char, + macfont_text_extents, + macfont_draw, + NULL, /* get_bitmap */ + NULL, /* free_bitmap */ + NULL, /* get_outline */ + NULL, /* free_outline */ + NULL, /* anchor_point */ + NULL, /* otf_capability */ + NULL, /* otf_drive */ + NULL, /* start_for_frame */ + NULL, /* end_for_frame */ + macfont_shape, + NULL, /* check */ + macfont_variation_glyphs, + macfont_filter_properties, + }; + +static Lisp_Object +macfont_get_cache (struct frame * f) +{ + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); + + return (dpyinfo->name_list_element); +} + +static int +macfont_get_charset (Lisp_Object registry) +{ + char *str = SSDATA (SYMBOL_NAME (registry)); + char *re = alloca (SBYTES (SYMBOL_NAME (registry)) * 2 + 1); + Lisp_Object regexp; + int i, j; + + for (i = j = 0; i < SBYTES (SYMBOL_NAME (registry)); i++, j++) + { + if (str[i] == '.') + re[j++] = '\\'; + else if (str[i] == '*') + re[j++] = '.'; + re[j] = str[i]; + if (re[j] == '?') + re[j] = '.'; + } + re[j] = '\0'; + regexp = make_unibyte_string (re, j); + for (i = 0; cf_charset_table[i].name; i++) + if (fast_c_string_match_ignore_case + (regexp, cf_charset_table[i].name, + strlen (cf_charset_table[i].name)) >= 0) + break; + if (! cf_charset_table[i].name) + return -1; + if (! cf_charset_table[i].cf_charset) + { + int *uniquifier = cf_charset_table[i].uniquifier; + UniChar *unichars = alloca (sizeof (cf_charset_table[i].uniquifier)); + CFIndex count = 0; + CFStringRef string; + CFMutableCharacterSetRef charset = CFCharacterSetCreateMutable (NULL); + + if (! charset) + return -1; + for (j = 0; uniquifier[j]; j++) + { + count += macfont_store_utf32char_to_unichars (uniquifier[j], + unichars + count); + CFCharacterSetAddCharactersInRange (charset, + CFRangeMake (uniquifier[j], 1)); + } + + string = CFStringCreateWithCharacters (NULL, unichars, count); + if (! string) + { + CFRelease (charset); + return -1; + } + cf_charset_table[i].cf_charset = CFCharacterSetCreateCopy (NULL, + charset); + CFRelease (charset); + /* CFCharacterSetCreateWithCharactersInString does not handle + surrogate pairs properly as of Mac OS X 10.5. */ + cf_charset_table[i].cf_charset_string = string; + } + return i; +} + +struct OpenTypeSpec +{ + Lisp_Object script; + unsigned int script_tag, langsys_tag; + int nfeatures[2]; + unsigned int *features[2]; +}; + +#define OTF_SYM_TAG(SYM, TAG) \ + do { \ + unsigned char *p = SDATA (SYMBOL_NAME (SYM)); \ + TAG = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; \ + } while (0) + +#define OTF_TAG_STR(TAG, P) \ + do { \ + (P)[0] = (char) (TAG >> 24); \ + (P)[1] = (char) ((TAG >> 16) & 0xFF); \ + (P)[2] = (char) ((TAG >> 8) & 0xFF); \ + (P)[3] = (char) (TAG & 0xFF); \ + (P)[4] = '\0'; \ + } while (0) + +static struct OpenTypeSpec * +macfont_get_open_type_spec (Lisp_Object otf_spec) +{ + struct OpenTypeSpec *spec = xmalloc (sizeof *spec); + Lisp_Object val; + int i, j; + bool negative; + + if (! spec) + return NULL; + spec->script = XCAR (otf_spec); + if (! NILP (spec->script)) + { + OTF_SYM_TAG (spec->script, spec->script_tag); + val = assq_no_quit (spec->script, Votf_script_alist); + if (CONSP (val) && SYMBOLP (XCDR (val))) + spec->script = XCDR (val); + else + spec->script = Qnil; + } + else + spec->script_tag = 0x44464C54; /* "DFLT" */ + otf_spec = XCDR (otf_spec); + spec->langsys_tag = 0; + if (! NILP (otf_spec)) + { + val = XCAR (otf_spec); + if (! NILP (val)) + OTF_SYM_TAG (val, spec->langsys_tag); + otf_spec = XCDR (otf_spec); + } + spec->nfeatures[0] = spec->nfeatures[1] = 0; + for (i = 0; i < 2 && ! NILP (otf_spec); i++, otf_spec = XCDR (otf_spec)) + { + Lisp_Object len; + + val = XCAR (otf_spec); + if (NILP (val)) + continue; + len = Flength (val); + spec->features[i] = + (min (PTRDIFF_MAX, SIZE_MAX) / sizeof (int) < XINT (len) + ? 0 + : malloc (XINT (len) * sizeof *spec->features[i])); + if (! spec->features[i]) + { + if (i > 0 && spec->features[0]) + free (spec->features[0]); + free (spec); + return NULL; + } + for (j = 0, negative = 0; CONSP (val); val = XCDR (val)) + { + if (NILP (XCAR (val))) + negative = 1; + else + { + unsigned int tag; + + OTF_SYM_TAG (XCAR (val), tag); + spec->features[i][j++] = negative ? tag & 0x80000000 : tag; + } + } + spec->nfeatures[i] = j; + } + return spec; +} + +static CFMutableDictionaryRef +macfont_create_attributes_with_spec (Lisp_Object spec) +{ + Lisp_Object tmp, extra; + CFMutableArrayRef langarray = NULL; + CFCharacterSetRef charset = NULL; + CFStringRef charset_string = NULL; + CFMutableDictionaryRef attributes = NULL, traits = NULL; + Lisp_Object script = Qnil; + Lisp_Object registry; + int cf_charset_idx, i; + struct OpenTypeSpec *otspec = NULL; + struct { + enum font_property_index index; + CFStringRef trait; + CGPoint points[6]; + } numeric_traits[] = + {{FONT_WEIGHT_INDEX, MAC_FONT_WEIGHT_TRAIT, + {{-0.4, 50}, /* light */ + {-0.24, 87.5}, /* (semi-light + normal) / 2 */ + {0, 100}, /* normal */ + {0.24, 140}, /* (semi-bold + normal) / 2 */ + {0.4, 200}, /* bold */ + {CGFLOAT_MAX, CGFLOAT_MAX}}}, + {FONT_SLANT_INDEX, MAC_FONT_SLANT_TRAIT, + {{0, 100}, {0.1, 200}, {CGFLOAT_MAX, CGFLOAT_MAX}}}, + {FONT_WIDTH_INDEX, MAC_FONT_WIDTH_TRAIT, + {{0, 100}, {1, 200}, {CGFLOAT_MAX, CGFLOAT_MAX}}}}; + + registry = AREF (spec, FONT_REGISTRY_INDEX); + if (NILP (registry) + || EQ (registry, Qascii_0) + || EQ (registry, Qiso10646_1) + || EQ (registry, Qunicode_bmp)) + cf_charset_idx = -1; + else + { + CFStringRef lang; + + cf_charset_idx = macfont_get_charset (registry); + if (cf_charset_idx < 0) + goto err; + charset = cf_charset_table[cf_charset_idx].cf_charset; + charset_string = cf_charset_table[cf_charset_idx].cf_charset_string; + lang = cf_charset_table[cf_charset_idx].lang; + if (lang) + { + langarray = CFArrayCreateMutable (NULL, 0, &kCFTypeArrayCallBacks); + if (! langarray) + goto err; + CFArrayAppendValue (langarray, lang); + } + } + + for (extra = AREF (spec, FONT_EXTRA_INDEX); + CONSP (extra); extra = XCDR (extra)) + { + Lisp_Object key, val; + + tmp = XCAR (extra); + key = XCAR (tmp), val = XCDR (tmp); + if (EQ (key, QClang)) + { + if (! langarray) + langarray = CFArrayCreateMutable (NULL, 0, &kCFTypeArrayCallBacks); + if (! langarray) + goto err; + if (SYMBOLP (val)) + val = list1 (val); + for (; CONSP (val); val = XCDR (val)) + if (SYMBOLP (XCAR (val))) + { + CFStringRef lang = + cfstring_create_with_string_noencode (SYMBOL_NAME + (XCAR (val))); + + if (lang == NULL) + goto err; + CFArrayAppendValue (langarray, lang); + CFRelease (lang); + } + } + else if (EQ (key, QCotf)) + { + otspec = macfont_get_open_type_spec (val); + if (! otspec) + goto err; + script = otspec->script; + } + else if (EQ (key, QCscript)) + script = val; + } + + if (! NILP (script) && ! charset) + { + Lisp_Object chars = assq_no_quit (script, Vscript_representative_chars); + + if (CONSP (chars) && CONSP (CDR (chars))) + { + CFMutableStringRef string = CFStringCreateMutable (NULL, 0); + CFMutableCharacterSetRef cs = CFCharacterSetCreateMutable (NULL); + + if (! string || !cs) + { + if (string) + CFRelease (string); + else if (cs) + CFRelease (cs); + goto err; + } + for (chars = XCDR (chars); CONSP (chars); chars = XCDR (chars)) + if (CHARACTERP (XCAR (chars))) + { + UniChar unichars[2]; + CFIndex count = + macfont_store_utf32char_to_unichars (XFASTINT (XCAR (chars)), + unichars); + CFRange range = CFRangeMake (XFASTINT (XCAR (chars)), 1); + + CFStringAppendCharacters (string, unichars, count); + CFCharacterSetAddCharactersInRange (cs, range); + } + charset = cs; + /* CFCharacterSetCreateWithCharactersInString does not + handle surrogate pairs properly as of Mac OS X 10.5. */ + charset_string = string; + } + } + + attributes = CFDictionaryCreateMutable (NULL, 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + if (! attributes) + goto err; + + tmp = AREF (spec, FONT_FAMILY_INDEX); + if (SYMBOLP (tmp) && ! NILP (tmp)) + { + CFStringRef family = macfont_create_family_with_symbol (tmp); + + if (! family) + goto err; + CFDictionaryAddValue (attributes, MAC_FONT_FAMILY_NAME_ATTRIBUTE, + family); + CFRelease (family); + } + + traits = CFDictionaryCreateMutable (NULL, 4, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + if (! traits) + goto err; + + for (i = 0; i < sizeof (numeric_traits) / sizeof (numeric_traits[0]); i++) + { + tmp = AREF (spec, numeric_traits[i].index); + if (INTEGERP (tmp)) + { + CGPoint *point = numeric_traits[i].points; + CGFloat floatval = (XINT (tmp) >> 8); // XXX + CFNumberRef num; + + while (point->y < floatval) + point++; + if (point == numeric_traits[i].points) + point++; + else if (point->y == CGFLOAT_MAX) + point--; + floatval = (point - 1)->x + ((floatval - (point - 1)->y) + * ((point->x - (point - 1)->x) + / (point->y - (point - 1)->y))); + if (floatval > 1.0) + floatval = 1.0; + else if (floatval < -1.0) + floatval = -1.0; + num = CFNumberCreate (NULL, kCFNumberCGFloatType, &floatval); + if (! num) + goto err; + CFDictionaryAddValue (traits, numeric_traits[i].trait, num); + CFRelease (num); + } + } + if (CFDictionaryGetCount (traits)) + CFDictionaryAddValue (attributes, MAC_FONT_TRAITS_ATTRIBUTE, traits); + + if (charset) + CFDictionaryAddValue (attributes, MAC_FONT_CHARACTER_SET_ATTRIBUTE, + charset); + if (charset_string) + CFDictionaryAddValue (attributes, MAC_FONT_CHARACTER_SET_STRING_ATTRIBUTE, + charset_string); + if (langarray) + CFDictionaryAddValue (attributes, MAC_FONT_LANGUAGES_ATTRIBUTE, langarray); + + goto finish; + + err: + if (attributes) + { + CFRelease (attributes); + attributes = NULL; + } + + finish: + if (langarray) CFRelease (langarray); + if (charset && cf_charset_idx < 0) CFRelease (charset); + if (charset_string && cf_charset_idx < 0) CFRelease (charset_string); + if (traits) CFRelease (traits); + if (otspec) + { + if (otspec->nfeatures[0] > 0) + free (otspec->features[0]); + if (otspec->nfeatures[1] > 0) + free (otspec->features[1]); + free (otspec); + } + + return attributes; +} + +static Boolean +macfont_supports_charset_and_languages_p (FontDescriptorRef desc, + CFCharacterSetRef charset, + Lisp_Object chars, + CFArrayRef languages) +{ + Boolean result = true; + + if (charset || VECTORP (chars)) + { + CFCharacterSetRef desc_charset = + mac_font_descriptor_copy_attribute (desc, + MAC_FONT_CHARACTER_SET_ATTRIBUTE); + + if (desc_charset == NULL) + result = false; + else + { + if (charset) + result = CFCharacterSetIsSupersetOfSet (desc_charset, charset); + else /* VECTORP (chars) */ + { + ptrdiff_t j; + + for (j = 0; j < ASIZE (chars); j++) + if (TYPE_RANGED_INTEGERP (UTF32Char, AREF (chars, j)) + && CFCharacterSetIsLongCharacterMember (desc_charset, + XFASTINT (AREF (chars, j)))) + break; + if (j == ASIZE (chars)) + result = false; + } + CFRelease (desc_charset); + } + } + if (result && languages) + result = mac_font_descriptor_supports_languages (desc, languages); + + return result; +} + +static CFIndex +macfont_closest_traits_index (CFArrayRef traits_array, + FontSymbolicTraits target) +{ + CFIndex i, result = -1, count = CFArrayGetCount (traits_array); + int min_distance = (1 << 3); + + for (i = 0; i < count; i++) + { + FontSymbolicTraits traits, diff; + int distance = 0; + + traits = ((FontSymbolicTraits) (uintptr_t) + CFArrayGetValueAtIndex (traits_array, i)); + diff = (target ^ traits); + /* We prefer synthetic bold of italic to synthetic italic of + bold when both bold and italic are available but bold-italic + is not available. */ + if (diff & MAC_FONT_TRAIT_BOLD) + distance |= (1 << 0); + if (diff & MAC_FONT_TRAIT_ITALIC) + distance |= (1 << 1); + if (diff & MAC_FONT_TRAIT_MONO_SPACE) + distance |= (1 << 2); + if (distance < min_distance) + { + min_distance = distance; + result = i; + } + } + + return result; +} + +static Lisp_Object +macfont_list (struct frame *f, Lisp_Object spec) +{ + Lisp_Object val = Qnil, family, extra; + int i, n; + CFStringRef family_name = NULL; + CFMutableDictionaryRef attributes = NULL, traits; + Lisp_Object chars = Qnil; + int spacing = -1; + FontSymbolicTraits synth_sym_traits = 0; + CFArrayRef families; + CFIndex families_count; + CFCharacterSetRef charset = NULL; + CFArrayRef languages = NULL; + + block_input (); + + family = AREF (spec, FONT_FAMILY_INDEX); + if (! NILP (family)) + { + family_name = macfont_create_family_with_symbol (family); + if (family_name == NULL) + goto finish; + } + + attributes = macfont_create_attributes_with_spec (spec); + if (! attributes) + goto finish; + + charset = ((CFCharacterSetRef) + CFDictionaryGetValue (attributes, + MAC_FONT_CHARACTER_SET_ATTRIBUTE)); + if (charset) + { + CFRetain (charset); + CFDictionaryRemoveValue (attributes, MAC_FONT_CHARACTER_SET_ATTRIBUTE); + } + else + { + val = assq_no_quit (QCscript, AREF (spec, FONT_EXTRA_INDEX)); + if (! NILP (val)) + { + val = assq_no_quit (XCDR (val), Vscript_representative_chars); + if (CONSP (val) && VECTORP (XCDR (val))) + chars = XCDR (val); + } + val = Qnil; + } + + languages = ((CFArrayRef) + CFDictionaryGetValue (attributes, MAC_FONT_LANGUAGES_ATTRIBUTE)); + if (languages) + { + CFRetain (languages); + CFDictionaryRemoveValue (attributes, MAC_FONT_LANGUAGES_ATTRIBUTE); + } + + if (INTEGERP (AREF (spec, FONT_SPACING_INDEX))) + spacing = XINT (AREF (spec, FONT_SPACING_INDEX)); + + traits = ((CFMutableDictionaryRef) + CFDictionaryGetValue (attributes, MAC_FONT_TRAITS_ATTRIBUTE)); + + n = FONT_SLANT_NUMERIC (spec); + if (n < 0 || n == FONT_SLANT_SYNTHETIC_ITALIC) + { + synth_sym_traits |= MAC_FONT_TRAIT_ITALIC; + if (traits) + CFDictionaryRemoveValue (traits, MAC_FONT_SLANT_TRAIT); + } + + n = FONT_WEIGHT_NUMERIC (spec); + if (n < 0 || n == FONT_WEIGHT_SYNTHETIC_BOLD) + { + synth_sym_traits |= MAC_FONT_TRAIT_BOLD; + if (traits) + CFDictionaryRemoveValue (traits, MAC_FONT_WEIGHT_TRAIT); + } + + if (languages + && (spacing < 0 || spacing == FONT_SPACING_SYNTHETIC_MONO)) + { + CFStringRef language = CFArrayGetValueAtIndex (languages, 0); + + if (CFStringHasPrefix (language, CFSTR ("ja")) + || CFStringHasPrefix (language, CFSTR ("ko")) + || CFStringHasPrefix (language, CFSTR ("zh"))) + synth_sym_traits |= MAC_FONT_TRAIT_MONO_SPACE; + } + + /* Create array of families. */ + if (family_name) + families = CFArrayCreate (NULL, (const void **) &family_name, + 1, &kCFTypeArrayCallBacks); + else + { + CFStringRef pref_family; + CFIndex families_count, pref_family_index = -1; + + families = mac_font_create_available_families (); + if (families == NULL) + goto err; + + families_count = CFArrayGetCount (families); + + /* Move preferred family to the front if exists. */ + pref_family = + mac_font_create_preferred_family_for_attributes (attributes); + if (pref_family) + { + pref_family_index = + CFArrayGetFirstIndexOfValue (families, + CFRangeMake (0, families_count), + pref_family); + CFRelease (pref_family); + } + if (pref_family_index > 0) + { + CFMutableArrayRef mutable_families = + CFArrayCreateMutable (NULL, families_count, &kCFTypeArrayCallBacks); + + if (mutable_families) + { + CFArrayAppendValue (mutable_families, + CFArrayGetValueAtIndex (families, + pref_family_index)); + CFArrayAppendArray (mutable_families, families, + CFRangeMake (0, pref_family_index)); + if (pref_family_index + 1 < families_count) + CFArrayAppendArray (mutable_families, families, + CFRangeMake (pref_family_index + 1, + families_count + - (pref_family_index + 1))); + CFRelease (families); + families = mutable_families; + } + } + } + + val = Qnil; + extra = AREF (spec, FONT_EXTRA_INDEX); + families_count = CFArrayGetCount (families); + for (i = 0; i < families_count; i++) + { + CFStringRef family_name = CFArrayGetValueAtIndex (families, i); + FontDescriptorRef pat_desc; + CFArrayRef descs; + CFIndex descs_count; + CFMutableArrayRef filtered_descs, traits_array; + Lisp_Object entity; + int j; + + CFDictionarySetValue (attributes, MAC_FONT_FAMILY_NAME_ATTRIBUTE, + family_name); + pat_desc = mac_font_descriptor_create_with_attributes (attributes); + if (! pat_desc) + goto err; + + /* CTFontDescriptorCreateMatchingFontDescriptors on Mac OS X + 10.7 returns NULL if pat_desc represents the LastResort font. + So we use CTFontDescriptorCreateMatchingFontDescriptor (no + trailing "s") for such a font. */ + if (CFStringCompare (family_name, CFSTR ("LastResort"), 0) + != kCFCompareEqualTo) + descs = mac_font_descriptor_create_matching_font_descriptors (pat_desc, + NULL); + else + { + FontDescriptorRef lr_desc = + mac_font_descriptor_create_matching_font_descriptor (pat_desc, + NULL); + if (lr_desc) + { + descs = CFArrayCreate (NULL, (const void **) &lr_desc, 1, + &kCFTypeArrayCallBacks); + CFRelease (lr_desc); + } + else + descs = NULL; + } + CFRelease (pat_desc); + if (! descs) + goto err; + + descs_count = CFArrayGetCount (descs); + if (descs_count == 0 + || !macfont_supports_charset_and_languages_p (CFArrayGetValueAtIndex (descs, 0), + charset, chars, + languages)) + { + CFRelease (descs); + continue; + } + + filtered_descs = + CFArrayCreateMutable (NULL, descs_count, &kCFTypeArrayCallBacks); + traits_array = CFArrayCreateMutable (NULL, descs_count, NULL); + for (j = 0; j < descs_count; j++) + { + FontDescriptorRef desc = CFArrayGetValueAtIndex (descs, j); + CFDictionaryRef dict; + CFNumberRef num; + FontSymbolicTraits sym_traits; + + dict = mac_font_descriptor_copy_attribute (desc, + MAC_FONT_TRAITS_ATTRIBUTE); + if (dict == NULL) + continue; + + num = CFDictionaryGetValue (dict, MAC_FONT_SYMBOLIC_TRAIT); + CFRelease (dict); + if (num == NULL + || !cfnumber_get_font_symbolic_traits_value (num, &sym_traits)) + continue; + + if (spacing >= 0 + && !(synth_sym_traits & MAC_FONT_TRAIT_MONO_SPACE) + && (((sym_traits & MAC_FONT_TRAIT_MONO_SPACE) != 0) + != (spacing >= FONT_SPACING_MONO))) + continue; + + /* Don't use a color bitmap font unless its family is + explicitly specified. */ + if ((sym_traits & MAC_FONT_TRAIT_COLOR_GLYPHS) && NILP (family)) + continue; + + if (j > 0 + && !macfont_supports_charset_and_languages_p (desc, charset, + chars, languages)) + continue; + + CFArrayAppendValue (filtered_descs, desc); + CFArrayAppendValue (traits_array, + (const void *) (uintptr_t) sym_traits); + } + + CFRelease (descs); + descs = filtered_descs; + descs_count = CFArrayGetCount (descs); + + for (j = 0; j < descs_count; j++) + { + FontDescriptorRef desc = CFArrayGetValueAtIndex (descs, j); + FontSymbolicTraits sym_traits = + ((FontSymbolicTraits) (uintptr_t) + CFArrayGetValueAtIndex (traits_array, j)); + FontSymbolicTraits mask_min, mask_max, imask, bmask, mmask; + + mask_min = ((synth_sym_traits ^ sym_traits) + & (MAC_FONT_TRAIT_ITALIC | MAC_FONT_TRAIT_BOLD)); + if (FONT_SLANT_NUMERIC (spec) < 0) + mask_min &= ~MAC_FONT_TRAIT_ITALIC; + if (FONT_WEIGHT_NUMERIC (spec) < 0) + mask_min &= ~MAC_FONT_TRAIT_BOLD; + + mask_max = (synth_sym_traits & ~sym_traits); + /* Synthetic bold does not work for bitmap-only fonts on Mac + OS X 10.6. */ + if ((mask_min ^ mask_max) & MAC_FONT_TRAIT_BOLD) + { + CFNumberRef format = + mac_font_descriptor_copy_attribute (desc, + MAC_FONT_FORMAT_ATTRIBUTE); + + if (format) + { + uint32_t format_val; + + if (CFNumberGetValue (format, kCFNumberSInt32Type, + &format_val) + && format_val == MAC_FONT_FORMAT_BITMAP) + mask_max &= ~MAC_FONT_TRAIT_BOLD; + } + } + if (spacing >= 0) + mask_min |= (mask_max & MAC_FONT_TRAIT_MONO_SPACE); + + for (mmask = (mask_min & MAC_FONT_TRAIT_MONO_SPACE); + mmask <= (mask_max & MAC_FONT_TRAIT_MONO_SPACE); + mmask += MAC_FONT_TRAIT_MONO_SPACE) + for (bmask = (mask_min & MAC_FONT_TRAIT_BOLD); + bmask <= (mask_max & MAC_FONT_TRAIT_BOLD); + bmask += MAC_FONT_TRAIT_BOLD) + for (imask = (mask_min & MAC_FONT_TRAIT_ITALIC); + imask <= (mask_max & MAC_FONT_TRAIT_ITALIC); + imask += MAC_FONT_TRAIT_ITALIC) + { + FontSymbolicTraits synth = (imask | bmask | mmask); + + if (synth == 0 + || j == macfont_closest_traits_index (traits_array, + (sym_traits | synth))) + { + entity = macfont_descriptor_entity (desc, extra, synth); + if (! NILP (entity)) + val = Fcons (entity, val); + } + } + } + + CFRelease (traits_array); + CFRelease (descs); + } + + CFRelease (families); + val = Fnreverse (val); + goto finish; + err: + val = Qnil; + + finish: + FONT_ADD_LOG ("macfont-list", spec, val); + if (charset) CFRelease (charset); + if (languages) CFRelease (languages); + if (attributes) CFRelease (attributes); + if (family_name) CFRelease (family_name); + + unblock_input (); + + return val; +} + +static Lisp_Object +macfont_match (struct frame * frame, Lisp_Object spec) +{ + Lisp_Object entity = Qnil; + CFMutableDictionaryRef attributes; + FontDescriptorRef pat_desc = NULL, desc = NULL; + + block_input (); + + attributes = macfont_create_attributes_with_spec (spec); + if (attributes) + { + pat_desc = mac_font_descriptor_create_with_attributes (attributes); + CFRelease (attributes); + } + if (pat_desc) + { + desc = mac_font_descriptor_create_matching_font_descriptor (pat_desc, + NULL); + CFRelease (pat_desc); + } + if (desc) + { + entity = macfont_descriptor_entity (desc, AREF (spec, FONT_EXTRA_INDEX), + 0); + CFRelease (desc); + } + unblock_input (); + + FONT_ADD_LOG ("macfont-match", spec, entity); + return entity; +} + +static Lisp_Object +macfont_list_family (struct frame *frame) +{ + Lisp_Object list = Qnil; + CFArrayRef families; + + block_input (); + + families = mac_font_create_available_families (); + if (families) + { + CFIndex i, count = CFArrayGetCount (families); + + for (i = 0; i < count; i++) + list = Fcons (macfont_intern_prop_cfstring (CFArrayGetValueAtIndex (families, i)), list); + CFRelease (families); + } + + unblock_input (); + + return list; +} + +static void +macfont_free_entity (Lisp_Object entity) +{ + Lisp_Object val = assq_no_quit (QCfont_entity, + AREF (entity, FONT_EXTRA_INDEX)); + CFStringRef name = XSAVE_POINTER (XCDR (val), 0); + + block_input (); + CFRelease (name); + unblock_input (); +} + +static Lisp_Object +macfont_open (struct frame * f, Lisp_Object entity, int pixel_size) +{ + Lisp_Object val, font_object; + CFStringRef font_name; + struct macfont_info *macfont_info = NULL; + struct font *font; + int size; + FontRef macfont; + FontSymbolicTraits sym_traits; + char name[256]; + int len, i, total_width; + CGGlyph glyph; + CGFloat ascent, descent, leading; + + val = assq_no_quit (QCfont_entity, AREF (entity, FONT_EXTRA_INDEX)); + if (! CONSP (val) + || XTYPE (XCDR (val)) != Lisp_Misc + || XMISCTYPE (XCDR (val)) != Lisp_Misc_Save_Value) + return Qnil; + font_name = XSAVE_POINTER (XCDR (val), 0); + sym_traits = XSAVE_INTEGER (XCDR (val), 1); + + size = XINT (AREF (entity, FONT_SIZE_INDEX)); + if (size == 0) + size = pixel_size; + + block_input (); + macfont = mac_font_create_with_name (font_name, size); + if (macfont) + { + int fontsize = (int) [((NSFont *) macfont) pointSize]; + if (fontsize != size) size = fontsize; + } + unblock_input (); + if (! macfont) + return Qnil; + + font_object = font_make_object (VECSIZE (struct macfont_info), entity, size); + ASET (font_object, FONT_TYPE_INDEX, macfont_driver.type); + len = font_unparse_xlfd (entity, size, name, 256); + if (len > 0) + ASET (font_object, FONT_NAME_INDEX, make_string (name, len)); + len = font_unparse_fcname (entity, size, name, 256); + if (len > 0) + ASET (font_object, FONT_FULLNAME_INDEX, make_string (name, len)); + else + ASET (font_object, FONT_FULLNAME_INDEX, + AREF (font_object, FONT_NAME_INDEX)); + font = XFONT_OBJECT (font_object); + font->pixel_size = size; + font->driver = &macfont_driver; + font->encoding_charset = font->repertory_charset = -1; + + block_input (); + + macfont_info = (struct macfont_info *) font; + macfont_info->macfont = macfont; + macfont_info->cgfont = mac_font_copy_graphics_font (macfont); + + val = assq_no_quit (QCdestination, AREF (entity, FONT_EXTRA_INDEX)); + if (CONSP (val) && EQ (XCDR (val), make_number (1))) + macfont_info->screen_font = mac_screen_font_create_with_name (font_name, + size); + else + macfont_info->screen_font = NULL; + macfont_info->cache = macfont_lookup_cache (font_name); + macfont_retain_cache (macfont_info->cache); + macfont_info->metrics = NULL; + macfont_info->metrics_nrows = 0; + macfont_info->synthetic_italic_p = 0; + macfont_info->synthetic_bold_p = 0; + macfont_info->spacing = MACFONT_SPACING_PROPORTIONAL; + macfont_info->antialias = MACFONT_ANTIALIAS_DEFAULT; + if (!(sym_traits & MAC_FONT_TRAIT_ITALIC) + && FONT_SLANT_NUMERIC (entity) == FONT_SLANT_SYNTHETIC_ITALIC) + macfont_info->synthetic_italic_p = 1; + if (!(sym_traits & MAC_FONT_TRAIT_BOLD) + && FONT_WEIGHT_NUMERIC (entity) == FONT_WEIGHT_SYNTHETIC_BOLD) + macfont_info->synthetic_bold_p = 1; + if (sym_traits & MAC_FONT_TRAIT_MONO_SPACE) + macfont_info->spacing = MACFONT_SPACING_MONO; + else if (INTEGERP (AREF (entity, FONT_SPACING_INDEX)) + && (XINT (AREF (entity, FONT_SPACING_INDEX)) + == FONT_SPACING_SYNTHETIC_MONO)) + macfont_info->spacing = MACFONT_SPACING_SYNTHETIC_MONO; + if (macfont_info->synthetic_italic_p || macfont_info->synthetic_bold_p) + macfont_info->antialias = MACFONT_ANTIALIAS_ON; + else + { + val = assq_no_quit (QCantialias, AREF (entity, FONT_EXTRA_INDEX)); + if (CONSP (val)) + macfont_info->antialias = + NILP (XCDR (val)) ? MACFONT_ANTIALIAS_OFF : MACFONT_ANTIALIAS_ON; + } + macfont_info->color_bitmap_p = 0; + if (sym_traits & MAC_FONT_TRAIT_COLOR_GLYPHS) + macfont_info->color_bitmap_p = 1; + + glyph = macfont_get_glyph_for_character (font, ' '); + if (glyph != kCGFontIndexInvalid) + font->space_width = macfont_glyph_extents (font, glyph, NULL, NULL, 0); + else + /* dirty workaround */ + font->space_width = pixel_size; + + total_width = font->space_width; + for (i = 1; i < 95; i++) + { + glyph = macfont_get_glyph_for_character (font, ' ' + i); + if (glyph == kCGFontIndexInvalid) + break; + total_width += macfont_glyph_extents (font, glyph, NULL, NULL, 0); + } + if (i == 95) + font->average_width = total_width / 95; + else + font->average_width = font->space_width; /* XXX */ + + if (!(macfont_info->screen_font + && mac_screen_font_get_metrics (macfont_info->screen_font, + &ascent, &descent, &leading))) + { + CFStringRef family_name; + + ascent = mac_font_get_ascent (macfont); + descent = mac_font_get_descent (macfont); + leading = mac_font_get_leading (macfont); + /* AppKit and WebKit do some adjustment to the heights of + Courier, Helvetica, and Times. */ + family_name = mac_font_copy_family_name (macfont); + if (family_name) + { + if ((CFStringCompare (family_name, CFSTR ("Courier"), 0) + == kCFCompareEqualTo) + || (CFStringCompare (family_name, CFSTR ("Helvetica"), 0) + == kCFCompareEqualTo) + || (CFStringCompare (family_name, CFSTR ("Times"), 0) + == kCFCompareEqualTo)) + ascent += (ascent + descent) * .15f; + else if (CFStringHasPrefix (family_name, CFSTR ("Hiragino"))) + { + leading *= .25f; + ascent += leading; + } + CFRelease (family_name); + } + } + font->ascent = ascent + 0.5f; + val = assq_no_quit (QCminspace, AREF (entity, FONT_EXTRA_INDEX)); + if (CONSP (val) && !NILP (XCDR (val))) + font->descent = descent + 0.5f; + else + font->descent = descent + leading + 0.5f; + font->height = font->ascent + font->descent; + + font->underline_position = - mac_font_get_underline_position (macfont) + 0.5f; + font->underline_thickness = mac_font_get_underline_thickness (macfont) + 0.5f; + + unblock_input (); + + /* Unfortunately Xft doesn't provide a way to get minimum char + width. So, we use space_width instead. */ + font->min_width = font->max_width = font->space_width; /* XXX */ + + font->baseline_offset = 0; + font->relative_compose = 0; + font->default_ascent = 0; + font->vertical_centering = 0; + + return font_object; +} + +static void +macfont_close (struct frame * f, struct font *font) +{ + struct macfont_info *macfont_info = (struct macfont_info *) font; + int i; + + block_input (); + CFRelease (macfont_info->macfont); + CGFontRelease (macfont_info->cgfont); + if (macfont_info->screen_font) + CFRelease (macfont_info->screen_font); + macfont_release_cache (macfont_info->cache); + for (i = 0; i < macfont_info->metrics_nrows; i++) + if (macfont_info->metrics[i]) + xfree (macfont_info->metrics[i]); + if (macfont_info->metrics) + xfree (macfont_info->metrics); + unblock_input (); +} + +static int +macfont_has_char (Lisp_Object font, int c) +{ + int result; + CFCharacterSetRef charset; + + block_input (); + if (FONT_ENTITY_P (font)) + { + Lisp_Object val; + CFStringRef name; + + val = assq_no_quit (QCfont_entity, AREF (font, FONT_EXTRA_INDEX)); + val = XCDR (val); + name = XSAVE_POINTER (val, 0); + charset = macfont_get_cf_charset_for_name (name); + } + else + charset = macfont_get_cf_charset (XFONT_OBJECT (font)); + + result = CFCharacterSetIsLongCharacterMember (charset, c); + unblock_input (); + + return result; +} + +static unsigned +macfont_encode_char (struct font *font, int c) +{ + struct macfont_info *macfont_info = (struct macfont_info *) font; + CGGlyph glyph; + + block_input (); + glyph = macfont_get_glyph_for_character (font, c); + unblock_input (); + + return glyph != kCGFontIndexInvalid ? glyph : FONT_INVALID_CODE; +} + +static int +macfont_text_extents (struct font *font, unsigned int *code, int nglyphs, + struct font_metrics *metrics) +{ + int width, i; + + block_input (); + width = macfont_glyph_extents (font, code[0], metrics, NULL, 0); + for (i = 1; i < nglyphs; i++) + { + struct font_metrics m; + int w = macfont_glyph_extents (font, code[i], metrics ? &m : NULL, + NULL, 0); + + if (metrics) + { + if (width + m.lbearing < metrics->lbearing) + metrics->lbearing = width + m.lbearing; + if (width + m.rbearing > metrics->rbearing) + metrics->rbearing = width + m.rbearing; + if (m.ascent > metrics->ascent) + metrics->ascent = m.ascent; + if (m.descent > metrics->descent) + metrics->descent = m.descent; + } + width += w; + } + unblock_input (); + + if (metrics) + metrics->width = width; + + return width; +} + +static int +macfont_draw (struct glyph_string *s, int from, int to, int x, int y, + bool with_background) +{ + struct frame * f = s->f; + struct macfont_info *macfont_info = (struct macfont_info *) s->font; + FontRef macfont = macfont_info->macfont; + CGContextRef context; + BOOL isComposite = s->first_glyph->type == COMPOSITE_GLYPH; + int end = isComposite ? s->cmp_to : s->nchars; + int len = end - s->cmp_from; + int i; + + block_input (); + + context = [[NSGraphicsContext currentContext] graphicsPort]; + CGContextSaveGState (context); + +#if 0 + if (s->num_clips > 0) + { + CGRect clips[2]; + + for (i = 0; i < s->num_clips; i++) + clips[i] = mac_rect_make (f, s->clip[i].left, s->clip[i].top, + s->clip[i].right - s->clip[i].left, + s->clip[i].bottom - s->clip[i].top); + CGContextClipToRects (context, clips, s->num_clips); + } +#endif + + if (with_background) + { + CG_SET_FILL_COLOR_WITH_GC_BACKGROUND (context, s); + CGContextFillRect (context, + NSMakeRect (x, y, + s->width, FONT_HEIGHT (s->font))); + } + + if (macfont_info->cgfont) + { + CGGlyph *glyphs = alloca (sizeof (CGGlyph) * len); + CGPoint *positions = alloca (sizeof (CGPoint) * len); + CGFloat total_width = 0; + CGFloat font_size = mac_font_get_size (macfont); + CGAffineTransform atfm; + CGFloat advance_delta = 0; + int y_draw = -y-FONT_BASE (s->font); + int no_antialias_p = + (macfont_info->antialias == MACFONT_ANTIALIAS_OFF + || (macfont_info->antialias == MACFONT_ANTIALIAS_DEFAULT + && font_size <= macfont_antialias_threshold)); + + for (i = 0; i < len; i++) + { + int width; + + glyphs[i] = *(s->char2b + s->cmp_from + i); + width = (s->padding_p ? 1 + : macfont_glyph_extents (s->font, glyphs[i], + NULL, &advance_delta, + no_antialias_p)); + positions[i].x = total_width + advance_delta; + positions[i].y = 0; + total_width += width; + } + + CGContextScaleCTM (context, 1, -1); + CG_SET_FILL_COLOR_WITH_GC_FOREGROUND (context, s); + if (macfont_info->synthetic_italic_p) + atfm = synthetic_italic_atfm; + else + atfm = CGAffineTransformIdentity; + if (macfont_info->synthetic_bold_p) + { + CGContextSetTextDrawingMode (context, kCGTextFillStroke); + CGContextSetLineWidth (context, synthetic_bold_factor * font_size); + CG_SET_STROKE_COLOR_WITH_GC_FOREGROUND (context, s); + } + if (no_antialias_p) + CGContextSetShouldAntialias (context, false); + + CGContextSetTextMatrix (context, atfm); + CGContextSetTextPosition (context, x, y_draw); + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 + if (macfont_info->color_bitmap_p +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + && CTFontDrawGlyphs != NULL +#endif + ) + { + if (len > 0) + { + CTFontDrawGlyphs (macfont, glyphs, positions, len, context); + } + } + else +#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 */ + { + CGContextSetFont (context, macfont_info->cgfont); + CGContextSetFontSize (context, font_size); + CGContextShowGlyphsAtPositions (context, glyphs, positions, len); + } + } + + CGContextRestoreGState (context); + + unblock_input (); + + return len; +} + +Lisp_Object +macfont_shape (Lisp_Object lgstring) +{ + struct font *font; + struct macfont_info *macfont_info; + FontRef macfont; + ptrdiff_t glyph_len, len, i, j; + CFIndex nonbmp_len; + UniChar *unichars; + CFIndex *nonbmp_indices; + CFStringRef string; + CFIndex used = 0; + struct mac_glyph_layout *glyph_layouts; + + CHECK_FONT_GET_OBJECT (LGSTRING_FONT (lgstring), font); + macfont_info = (struct macfont_info *) font; + macfont = macfont_info->macfont; + + glyph_len = LGSTRING_GLYPH_LEN (lgstring); + nonbmp_len = 0; + for (i = 0; i < glyph_len; i++) + { + Lisp_Object lglyph = LGSTRING_GLYPH (lgstring, i); + + if (NILP (lglyph)) + break; + if (LGLYPH_CHAR (lglyph) >= 0x10000) + nonbmp_len++; + } + + len = i; + assume (len <= TYPE_MAXIMUM (EMACS_INT) - 2); + + if (INT_MAX / 2 < len) + memory_full (SIZE_MAX); + + unichars = alloca (sizeof (UniChar) * (len + nonbmp_len)); + nonbmp_indices = alloca (sizeof (CFIndex) * (nonbmp_len + 1)); + for (i = j = 0; i < len; i++) + { + UTF32Char c = LGLYPH_CHAR (LGSTRING_GLYPH (lgstring, i)); + + if (macfont_store_utf32char_to_unichars (c, unichars + i + j) > 1) + { + nonbmp_indices[j] = i + j; + j++; + } + } + nonbmp_indices[j] = len + j; /* sentinel */ + + block_input (); + + string = CFStringCreateWithCharactersNoCopy (NULL, unichars, len + nonbmp_len, + kCFAllocatorNull); + if (string) + { + glyph_layouts = alloca (sizeof (struct mac_glyph_layout) * glyph_len); + if (macfont_info->screen_font) + used = mac_screen_font_shape (macfont_info->screen_font, string, + glyph_layouts, glyph_len); + else + used = mac_font_shape (macfont, string, glyph_layouts, glyph_len); + CFRelease (string); + } + + unblock_input (); + + if (used == 0) + return Qnil; + + block_input (); + + for (i = 0; i < used; i++) + { + Lisp_Object lglyph = LGSTRING_GLYPH (lgstring, i); + struct mac_glyph_layout *gl = glyph_layouts + i; + EMACS_INT from, to; + struct font_metrics metrics; + int xoff, yoff, wadjust; + + if (NILP (lglyph)) + { + lglyph = Fmake_vector (make_number (LGLYPH_SIZE), Qnil); + LGSTRING_SET_GLYPH (lgstring, i, lglyph); + } + + from = gl->comp_range.location; + /* Convert UTF-16 index to UTF-32. */ + j = 0; + while (nonbmp_indices[j] < from) + j++; + from -= j; + LGLYPH_SET_FROM (lglyph, from); + + to = gl->comp_range.location + gl->comp_range.length; + /* Convert UTF-16 index to UTF-32. */ + while (nonbmp_indices[j] < to) + j++; + to -= j; + LGLYPH_SET_TO (lglyph, to - 1); + + /* LGLYPH_CHAR is used in `describe-char' for checking whether + the composition is trivial. */ + { + UTF32Char c; + + if (unichars[gl->string_index] >= 0xD800 + && unichars[gl->string_index] < 0xDC00) + c = (((unichars[gl->string_index] - 0xD800) << 10) + + (unichars[gl->string_index + 1] - 0xDC00) + 0x10000); + else + c = unichars[gl->string_index]; + if (macfont_get_glyph_for_character (font, c) != gl->glyph_id) + c = 0; + LGLYPH_SET_CHAR (lglyph, c); + } + + { + unsigned long cc = gl->glyph_id; + LGLYPH_SET_CODE (lglyph, cc); + } + + macfont_glyph_extents (font, gl->glyph_id, &metrics, NULL, 0); + LGLYPH_SET_WIDTH (lglyph, metrics.width); + LGLYPH_SET_LBEARING (lglyph, metrics.lbearing); + LGLYPH_SET_RBEARING (lglyph, metrics.rbearing); + LGLYPH_SET_ASCENT (lglyph, metrics.ascent); + LGLYPH_SET_DESCENT (lglyph, metrics.descent); + + xoff = lround (gl->advance_delta); + yoff = lround (- gl->baseline_delta); + wadjust = lround (gl->advance); + if (xoff != 0 || yoff != 0 || wadjust != metrics.width) + { + Lisp_Object vec; + + vec = Fmake_vector (make_number (3), Qnil); + ASET (vec, 0, make_number (xoff)); + ASET (vec, 1, make_number (yoff)); + ASET (vec, 2, make_number (wadjust)); + LGLYPH_SET_ADJUSTMENT (lglyph, vec); + } + } + + unblock_input (); + + return make_number (used); +} + +/* Structures for the UVS subtable (format 14) in the cmap table. */ +typedef UInt8 UINT24[3]; + +#pragma pack(push, 1) +struct variation_selector_record +{ + UINT24 var_selector; + UInt32 default_uvs_offset, non_default_uvs_offset; +}; +struct uvs_table +{ + UInt16 format; + UInt32 length, num_var_selector_records; + struct variation_selector_record variation_selector_records[1]; +}; +#define SIZEOF_UVS_TABLE_HEADER \ + (sizeof (struct uvs_table) - sizeof (struct variation_selector_record)) + +struct unicode_value_range +{ + UINT24 start_unicode_value; + UInt8 additional_count; +}; +struct default_uvs_table { + UInt32 num_unicode_value_ranges; + struct unicode_value_range unicode_value_ranges[1]; +}; +#define SIZEOF_DEFAULT_UVS_TABLE_HEADER \ + (sizeof (struct default_uvs_table) - sizeof (struct unicode_value_range)) + +struct uvs_mapping +{ + UINT24 unicode_value; + UInt16 glyph_id; +}; +struct non_default_uvs_table +{ + UInt32 num_uvs_mappings; + struct uvs_mapping uvs_mappings[1]; +}; +#define SIZEOF_NON_DEFAULT_UVS_TABLE_HEADER \ + (sizeof (struct non_default_uvs_table) - sizeof (struct uvs_mapping)) +#pragma pack(pop) + +/* Read big endian values. The argument LVAL must be an lvalue. */ +/* I suppose OSReadBigInt* takes care of unaligned data. At least, we + can find "... = OSReadBigInt32(cdb, 2);" followed by "... = + OSReadBigInt16(cdb, 7);" in a sample code by Apple. */ +#define BUINT8_VALUE(lval) (*((UInt8 *) &(lval))) +#define BUINT16_VALUE(lval) OSReadBigInt16 (&(lval), 0) +/* Succeeding one byte should also be accessible. */ +#define BUINT24_VALUE(lval) (OSReadBigInt32 (&(lval), 0) >> 8) +#define BUINT32_VALUE(lval) OSReadBigInt32 (&(lval), 0) + +/* Return UVS subtable for the specified FONT. If the subtable is not + found or ill-formated, then return NULL. */ + +static CFDataRef +mac_font_copy_uvs_table (FontRef font) +{ + CFDataRef cmap_table, uvs_table = NULL; + + cmap_table = mac_font_copy_non_synthetic_table (font, cmapFontTableTag); + if (cmap_table) + { + sfntCMapHeader *cmap = (sfntCMapHeader *) CFDataGetBytePtr (cmap_table); + struct uvs_table *uvs; + struct variation_selector_record *records; + UInt32 cmap_len, ntables, i, uvs_offset, uvs_len, nrecords; + +#if __LP64__ + if (CFDataGetLength (cmap_table) > UINT32_MAX) + goto finish; +#endif + + cmap_len = CFDataGetLength (cmap_table); + if (sizeof_sfntCMapHeader > cmap_len) + goto finish; + + ntables = BUINT16_VALUE (cmap->numTables); + if (ntables > ((cmap_len - sizeof_sfntCMapHeader) + / sizeof_sfntCMapEncoding)) + goto finish; + + for (i = 0; i < ntables; i++) + if ((BUINT16_VALUE (cmap->encoding[i].platformID) + == kFontUnicodePlatform) + && (BUINT16_VALUE (cmap->encoding[i].scriptID) + == 5)) /* kFontUnicodeV4_0VariationSequenceSemantics */ + { + uvs_offset = BUINT32_VALUE (cmap->encoding[i].offset); + break; + } + if (i == ntables + || uvs_offset > cmap_len + || SIZEOF_UVS_TABLE_HEADER > cmap_len - uvs_offset) + goto finish; + + uvs = (struct uvs_table *) ((UInt8 *) cmap + uvs_offset); + uvs_len = BUINT32_VALUE (uvs->length); + if (uvs_len > cmap_len - uvs_offset + || SIZEOF_UVS_TABLE_HEADER > uvs_len) + goto finish; + + if (BUINT16_VALUE (uvs->format) != 14) + goto finish; + + nrecords = BUINT32_VALUE (uvs->num_var_selector_records); + if (nrecords > ((uvs_len - SIZEOF_UVS_TABLE_HEADER) + / sizeof (struct variation_selector_record))) + goto finish; + + records = uvs->variation_selector_records; + for (i = 0; i < nrecords; i++) + { + UInt32 default_uvs_offset, non_default_uvs_offset; + + default_uvs_offset = BUINT32_VALUE (records[i].default_uvs_offset); + if (default_uvs_offset) + { + struct default_uvs_table *default_uvs; + UInt32 nranges; + + if (default_uvs_offset > uvs_len + || (SIZEOF_DEFAULT_UVS_TABLE_HEADER + > uvs_len - default_uvs_offset)) + goto finish; + + default_uvs = ((struct default_uvs_table *) + ((UInt8 *) uvs + default_uvs_offset)); + nranges = BUINT32_VALUE (default_uvs->num_unicode_value_ranges); + if (nranges > ((uvs_len - default_uvs_offset + - SIZEOF_DEFAULT_UVS_TABLE_HEADER) + / sizeof (struct unicode_value_range))) + goto finish; + /* Now 2 * nranges can't overflow, so we can safely use + `(lo + hi) / 2' instead of `lo + (hi - lo) / 2' in + mac_font_get_glyphs_for_variants. */ + } + + non_default_uvs_offset = + BUINT32_VALUE (records[i].non_default_uvs_offset); + if (non_default_uvs_offset) + { + struct non_default_uvs_table *non_default_uvs; + UInt32 nmappings; + + if (non_default_uvs_offset > uvs_len + || (SIZEOF_NON_DEFAULT_UVS_TABLE_HEADER + > uvs_len - non_default_uvs_offset)) + goto finish; + + non_default_uvs = ((struct non_default_uvs_table *) + ((UInt8 *) uvs + non_default_uvs_offset)); + nmappings = BUINT32_VALUE (non_default_uvs->num_uvs_mappings); + if (nmappings > ((uvs_len - non_default_uvs_offset + - SIZEOF_NON_DEFAULT_UVS_TABLE_HEADER) + / sizeof (struct uvs_mapping))) + goto finish; + /* Now 2 * nmappings can't overflow, so we can safely + use `(lo + hi) / 2' instead of `lo + (hi - lo) / 2' + in mac_font_get_glyphs_for_variants. */ + } + } + + uvs_table = CFDataCreate (NULL, (UInt8 *) uvs, uvs_len); + + finish: + CFRelease (cmap_table); + } + + return uvs_table; +} + +/* Find an entry in the given UVS subtable UVS_TABLE for a variation + sequence consisting of the given base character C and each + variation selector SELECTORS[i] for 0 <= i < COUNT, and store the + result (explained below) into the corresponding GLYPHS[i]. If the + entry is found in the Default UVS Table, then the result is 0. If + the entry is found in the Non-Default UVS Table, then the result is + the associated glyph ID. Otherwise, kCGFontIndexInvalid. The + elements in SELECTORS must be sorted in strictly increasing + order. */ + +static void +mac_font_get_glyphs_for_variants (CFDataRef uvs_table, UTF32Char c, + const UTF32Char selectors[], CGGlyph glyphs[], + CFIndex count) +{ + struct uvs_table *uvs = (struct uvs_table *) CFDataGetBytePtr (uvs_table); + struct variation_selector_record *records = uvs->variation_selector_records; + CFIndex i; + UInt32 ir, nrecords; +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + dispatch_queue_t queue = + dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + dispatch_group_t group = dispatch_group_create (); +#endif + + nrecords = BUINT32_VALUE (uvs->num_var_selector_records); + i = 0; + ir = 0; + while (i < count && ir < nrecords) + { + UInt32 default_uvs_offset, non_default_uvs_offset; + + if (selectors[i] < BUINT24_VALUE (records[ir].var_selector)) + { + glyphs[i++] = kCGFontIndexInvalid; + continue; + } + else if (selectors[i] > BUINT24_VALUE (records[ir].var_selector)) + { + ir++; + continue; + } + + /* selectors[i] == BUINT24_VALUE (records[ir].var_selector) */ + default_uvs_offset = BUINT32_VALUE (records[ir].default_uvs_offset); + non_default_uvs_offset = + BUINT32_VALUE (records[ir].non_default_uvs_offset); +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + dispatch_group_async (group, queue, ^{ +#endif + glyphs[i] = kCGFontIndexInvalid; + + if (default_uvs_offset) + { + struct default_uvs_table *default_uvs = + (struct default_uvs_table *) ((UInt8 *) uvs + + default_uvs_offset); + struct unicode_value_range *ranges = + default_uvs->unicode_value_ranges; + UInt32 lo, hi; + + lo = 0; + hi = BUINT32_VALUE (default_uvs->num_unicode_value_ranges); + while (lo < hi) + { + UInt32 mid = (lo + hi) / 2; + + if (c < BUINT24_VALUE (ranges[mid].start_unicode_value)) + hi = mid; + else + lo = mid + 1; + } + if (hi > 0 + && (c <= (BUINT24_VALUE (ranges[hi - 1].start_unicode_value) + + BUINT8_VALUE (ranges[hi - 1].additional_count)))) + glyphs[i] = 0; + } + + if (glyphs[i] == kCGFontIndexInvalid && non_default_uvs_offset) + { + struct non_default_uvs_table *non_default_uvs = + (struct non_default_uvs_table *) ((UInt8 *) uvs + + non_default_uvs_offset); + struct uvs_mapping *mappings = non_default_uvs->uvs_mappings; + UInt32 lo, hi; + + lo = 0; + hi = BUINT32_VALUE (non_default_uvs->num_uvs_mappings); + while (lo < hi) + { + UInt32 mid = (lo + hi) / 2; + + if (c < BUINT24_VALUE (mappings[mid].unicode_value)) + hi = mid; + else + lo = mid + 1; + } + if (hi > 0 && + BUINT24_VALUE (mappings[hi - 1].unicode_value) == c) + glyphs[i] = BUINT16_VALUE (mappings[hi - 1].glyph_id); + } +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + }); +#endif + i++; + ir++; + } + while (i < count) + glyphs[i++] = kCGFontIndexInvalid; +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + dispatch_group_wait (group, DISPATCH_TIME_FOREVER); + dispatch_release (group); +#endif +} + +static int +macfont_variation_glyphs (struct font *font, int c, unsigned variations[256]) +{ + CFDataRef uvs_table; + CharacterCollection uvs_collection; + int i, n = 0; + + block_input (); + uvs_table = macfont_get_uvs_table (font, &uvs_collection); + + if (uvs_table) + { + UTF32Char selectors[256]; + CGGlyph glyphs[256]; + + for (i = 0; i < 16; i++) + selectors[i] = 0xFE00 + i; + for (; i < 256; i++) + selectors[i] = 0xE0100 + (i - 16); + mac_font_get_glyphs_for_variants (uvs_table, c, selectors, glyphs, 256); + for (i = 0; i < 256; i++) + { + CGGlyph glyph = glyphs[i]; + + if (uvs_collection != MAC_CHARACTER_COLLECTION_IDENTITY_MAPPING + && glyph != kCGFontIndexInvalid) + glyph = macfont_get_glyph_for_cid (font, uvs_collection, glyph); + if (glyph == kCGFontIndexInvalid) + variations[i] = 0; + else + { + variations[i] = (glyph ? glyph + : macfont_get_glyph_for_character (font, c)); + n++; + } + } + } + unblock_input (); + + return n; +} + +static const char *const macfont_booleans[] = { + ":antialias", + ":minspace", + NULL, +}; + +static const char *const macfont_non_booleans[] = { + ":lang", + ":script", + ":destination", + NULL, +}; + +static void +macfont_filter_properties (Lisp_Object font, Lisp_Object alist) +{ + font_filter_properties (font, alist, macfont_booleans, macfont_non_booleans); +} + +static Boolean +mac_ctfont_descriptor_supports_languages (CTFontDescriptorRef descriptor, + CFArrayRef languages) +{ + Boolean result = true; + CFArrayRef desc_languages = + CTFontDescriptorCopyAttribute (descriptor, kCTFontLanguagesAttribute); + + if (desc_languages == NULL) + result = false; + else + { + CFIndex desc_languages_count, i, languages_count; + + desc_languages_count = CFArrayGetCount (desc_languages); + languages_count = CFArrayGetCount (languages); + for (i = 0; i < languages_count; i++) + if (!CFArrayContainsValue (desc_languages, + CFRangeMake (0, desc_languages_count), + CFArrayGetValueAtIndex (languages, i))) + { + result = false; + break; + } + CFRelease (desc_languages); + } + + return result; +} + +static CFStringRef +mac_ctfont_create_preferred_family_for_attributes (CFDictionaryRef attributes) +{ + CFStringRef result = NULL; + CFStringRef charset_string = + CFDictionaryGetValue (attributes, MAC_FONT_CHARACTER_SET_STRING_ATTRIBUTE); + CFIndex length; + + if (charset_string + && (length = CFStringGetLength (charset_string)) > 0) + { + CFAttributedStringRef attr_string = NULL; + CTLineRef ctline = NULL; + CFDictionaryRef attrs = + CFDictionaryCreate (NULL, NULL, NULL, 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + + if (attrs) + { + attr_string = CFAttributedStringCreate (NULL, charset_string, attrs); + CFRelease (attrs); + } + if (attr_string) + { + ctline = CTLineCreateWithAttributedString (attr_string); + CFRelease (attr_string); + } + if (ctline) + { + CFArrayRef runs = CTLineGetGlyphRuns (ctline); + CFIndex i, nruns = CFArrayGetCount (runs); + CTFontRef font; + + for (i = 0; i < nruns; i++) + { + CTRunRef run = CFArrayGetValueAtIndex (runs, i); + CFDictionaryRef attributes = CTRunGetAttributes (run); + CTFontRef font_in_run; + + if (attributes == NULL) + break; + font_in_run = + CFDictionaryGetValue (attributes, kCTFontAttributeName); + if (font_in_run == NULL) + break; + if (i == 0) + font = font_in_run; + else if (!mac_ctfont_equal_in_postscript_name (font, font_in_run)) + break; + } + if (nruns > 0 && i == nruns) + result = CTFontCopyAttribute (font, kCTFontFamilyNameAttribute); + CFRelease (ctline); + } + } + + return result; +} + +static inline double +mac_ctfont_get_advance_width_for_glyph (CTFontRef font, CGGlyph glyph) +{ + return CTFontGetAdvancesForGlyphs (font, kCTFontDefaultOrientation, + &glyph, NULL, 1); +} + +static inline CGRect +mac_ctfont_get_bounding_rect_for_glyph (CTFontRef font, CGGlyph glyph) +{ + return CTFontGetBoundingRectsForGlyphs (font, kCTFontDefaultOrientation, + &glyph, NULL, 1); +} + +static CFArrayRef +mac_ctfont_create_available_families (void) +{ + CFMutableArrayRef families = NULL; + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060 +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 + if (CTFontManagerCopyAvailableFontFamilyNames != NULL) +#endif + { + CFArrayRef orig_families = CTFontManagerCopyAvailableFontFamilyNames (); + + if (orig_families) + { + CFIndex i, count = CFArrayGetCount (orig_families); + + families = CFArrayCreateMutable (NULL, count, &kCFTypeArrayCallBacks); + if (families) + for (i = 0; i < count; i++) + { + CFStringRef family = CFArrayGetValueAtIndex (orig_families, i); + + if (!CFStringHasPrefix (family, CFSTR (".")) + && (CTFontManagerCompareFontFamilyNames (family, + CFSTR ("LastResort"), + NULL) + != kCFCompareEqualTo)) + CFArrayAppendValue (families, family); + } + CFRelease (orig_families); + } + } +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 + else /* CTFontManagerCopyAvailableFontFamilyNames == NULL */ +#endif +#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 1060 */ +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 + { + CTFontCollectionRef collection; + CFArrayRef descs = NULL; + + collection = CTFontCollectionCreateFromAvailableFonts (NULL); + if (collection) + { + descs = CTFontCollectionCreateMatchingFontDescriptors (collection); + CFRelease (collection); + } + if (descs) + { + CFIndex i, count = CFArrayGetCount (descs); + + families = CFArrayCreateMutable (NULL, count, &kCFTypeArrayCallBacks); + if (families) + for (i = 0; i < count; i++) + { + FontDescriptorRef desc = CFArrayGetValueAtIndex (descs, i); + CFStringRef name = + mac_font_descriptor_copy_attribute (desc, + MAC_FONT_FAMILY_NAME_ATTRIBUTE); + + if (name) + { + CFIndex p, limit = CFArrayGetCount (families); + + p = CFArrayBSearchValues (families, CFRangeMake (0, limit), + (const void *) name, + mac_font_family_compare, NULL); + if (p >= limit) + CFArrayAppendValue (families, name); + else if (mac_font_family_compare + (CFArrayGetValueAtIndex (families, p), + name, NULL) != kCFCompareEqualTo) + CFArrayInsertValueAtIndex (families, p, name); + CFRelease (name); + } + } + CFRelease (descs); + } + } +#endif + + return families; +} + +static Boolean +mac_ctfont_equal_in_postscript_name (CTFontRef font1, CTFontRef font2) +{ + Boolean result; + CFStringRef name1, name2; + + if (font1 == font2) + return true; + + result = false; + name1 = CTFontCopyPostScriptName (font1); + if (name1) + { + name2 = CTFontCopyPostScriptName (font2); + if (name2) + { + result = (CFStringCompare (name1, name2, 0) == kCFCompareEqualTo); + CFRelease (name2); + } + CFRelease (name1); + } + + return result; +} + +static CTLineRef +mac_ctfont_create_line_with_string_and_font (CFStringRef string, + CTFontRef macfont) +{ + CFStringRef keys[] = {kCTFontAttributeName, kCTKernAttributeName}; + CFTypeRef values[] = {NULL, NULL}; + CFDictionaryRef attributes = NULL; + CFAttributedStringRef attr_string = NULL; + CTLineRef ctline = NULL; + float float_zero = 0.0f; + + values[0] = macfont; + values[1] = CFNumberCreate (NULL, kCFNumberFloatType, &float_zero); + if (values[1]) + { + attributes = CFDictionaryCreate (NULL, (const void **) keys, + (const void **) values, + sizeof (keys) / sizeof (keys[0]), + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + CFRelease (values[1]); + } + if (attributes) + { + attr_string = CFAttributedStringCreate (NULL, string, attributes); + CFRelease (attributes); + } + if (attr_string) + { + ctline = CTLineCreateWithAttributedString (attr_string); + CFRelease (attr_string); + } + if (ctline) + { + /* Abandon if ctline contains some fonts other than the + specified one. */ + CFArrayRef runs = CTLineGetGlyphRuns (ctline); + CFIndex i, nruns = CFArrayGetCount (runs); + + for (i = 0; i < nruns; i++) + { + CTRunRef run = CFArrayGetValueAtIndex (runs, i); + CFDictionaryRef attributes = CTRunGetAttributes (run); + CTFontRef font_in_run; + + if (attributes == NULL) + break; + font_in_run = + CFDictionaryGetValue (attributes, kCTFontAttributeName); + if (font_in_run == NULL) + break; + if (!mac_ctfont_equal_in_postscript_name (macfont, font_in_run)) + break; + } + if (i < nruns) + { + CFRelease (ctline); + ctline = NULL; + } + } + + return ctline; +} + +CFIndex +mac_ctfont_shape (CTFontRef font, CFStringRef string, + struct mac_glyph_layout *glyph_layouts, CFIndex glyph_len) +{ + CFIndex used, result = 0; + CTLineRef ctline = mac_ctfont_create_line_with_string_and_font (string, font); + + if (ctline == NULL) + return 0; + + used = CTLineGetGlyphCount (ctline); + if (used <= glyph_len) + { + CFArrayRef ctruns = CTLineGetGlyphRuns (ctline); + CFIndex k, ctrun_count = CFArrayGetCount (ctruns); + CGFloat total_advance = 0; + CFIndex total_glyph_count = 0; + + for (k = 0; k < ctrun_count; k++) + { + CTRunRef ctrun = CFArrayGetValueAtIndex (ctruns, k); + CFIndex i, min_location, glyph_count = CTRunGetGlyphCount (ctrun); + struct mac_glyph_layout *glbuf = glyph_layouts + total_glyph_count; + CFRange string_range, comp_range, range; + CFIndex *permutation; + + if (CTRunGetStatus (ctrun) & kCTRunStatusRightToLeft) + permutation = xmalloc (sizeof (CFIndex) * glyph_count); + else + permutation = NULL; + +#define RIGHT_TO_LEFT_P permutation + + /* Now the `comp_range' member of struct mac_glyph_layout is + temporarily used as a work area such that: + glbuf[i].comp_range.location = + min {compRange[i + 1].location, ..., + compRange[glyph_count - 1].location, + maxRange (stringRangeForCTRun)} + glbuf[i].comp_range.length = maxRange (compRange[i]) + where compRange[i] is the range of composed characters + containing i-th glyph. */ + string_range = CTRunGetStringRange (ctrun); + min_location = string_range.location + string_range.length; + for (i = 0; i < glyph_count; i++) + { + struct mac_glyph_layout *gl = glbuf + glyph_count - i - 1; + CFIndex glyph_index; + CFRange rng; + + if (!RIGHT_TO_LEFT_P) + glyph_index = glyph_count - i - 1; + else + glyph_index = i; + CTRunGetStringIndices (ctrun, CFRangeMake (glyph_index, 1), + &gl->string_index); + rng = + CFStringGetRangeOfComposedCharactersAtIndex (string, + gl->string_index); + gl->comp_range.location = min_location; + gl->comp_range.length = rng.location + rng.length; + if (rng.location < min_location) + min_location = rng.location; + } + + /* Fill the `comp_range' member of struct mac_glyph_layout, + and setup a permutation for right-to-left text. */ + comp_range = CFRangeMake (string_range.location, 0); + range = CFRangeMake (0, 0); + while (1) + { + struct mac_glyph_layout *gl = + glbuf + range.location + range.length; + + if (gl->comp_range.length + > comp_range.location + comp_range.length) + comp_range.length = gl->comp_range.length - comp_range.location; + min_location = gl->comp_range.location; + range.length++; + + if (min_location >= comp_range.location + comp_range.length) + { + comp_range.length = min_location - comp_range.location; + for (i = 0; i < range.length; i++) + { + glbuf[range.location + i].comp_range = comp_range; + if (RIGHT_TO_LEFT_P) + permutation[range.location + i] = + range.location + range.length - i - 1; + } + + comp_range = CFRangeMake (min_location, 0); + range.location += range.length; + range.length = 0; + if (range.location == glyph_count) + break; + } + } + + /* Then fill the remaining members. */ + for (range = CFRangeMake (0, 1); range.location < glyph_count; + range.location++) + { + struct mac_glyph_layout *gl; + CGPoint position; + + if (!RIGHT_TO_LEFT_P) + gl = glbuf + range.location; + else + { + CFIndex src, dest; + + src = glyph_count - 1 - range.location; + dest = permutation[src]; + gl = glbuf + dest; + if (src < dest) + { + CFIndex tmp = gl->string_index; + + gl->string_index = glbuf[src].string_index; + glbuf[src].string_index = tmp; + } + } + CTRunGetGlyphs (ctrun, range, &gl->glyph_id); + + CTRunGetPositions (ctrun, range, &position); + gl->advance_delta = position.x - total_advance; + gl->baseline_delta = position.y; + gl->advance = (gl->advance_delta + + CTRunGetTypographicBounds (ctrun, range, + NULL, NULL, NULL)); + total_advance += gl->advance; + } + + if (RIGHT_TO_LEFT_P) + xfree (permutation); + +#undef RIGHT_TO_LEFT_P + + total_glyph_count += glyph_count; + } + + result = used; + } + CFRelease (ctline); + + return result; +} + +/* The function below seems to cause a memory leak for the CFString + created by CFStringCreateWithCharacters as of Mac OS X 10.5.8 and + 10.6.3. For now, we use the NSGlyphInfo version instead. */ +#if USE_CT_GLYPH_INFO +CGGlyph +mac_ctfont_get_glyph_for_cid (CTFontRef font, CTCharacterCollection collection, + CGFontIndex cid) +{ + CGGlyph result = kCGFontIndexInvalid; + UniChar characters[] = {0xfffd}; + CFStringRef string; + CFAttributedStringRef attr_string = NULL; + CTLineRef ctline = NULL; + + string = CFStringCreateWithCharacters (NULL, characters, + sizeof (characters) + / sizeof (characters[0])); + if (string) + { + CTGlyphInfoRef glyph_info = + CTGlyphInfoCreateWithCharacterIdentifier (cid, collection, string); + CFDictionaryRef attributes = NULL; + + if (glyph_info) + { + CFStringRef keys[] = {kCTFontAttributeName, + kCTGlyphInfoAttributeName}; + CFTypeRef values[] = {font, glyph_info}; + + attributes = CFDictionaryCreate (NULL, (const void **) keys, + (const void **) values, + sizeof (keys) / sizeof (keys[0]), + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + CFRelease (glyph_info); + } + if (attributes) + { + attr_string = CFAttributedStringCreate (NULL, string, attributes); + CFRelease (attributes); + } + CFRelease (string); + } + if (attr_string) + { + ctline = CTLineCreateWithAttributedString (attr_string); + CFRelease (attr_string); + } + if (ctline) + { + CFArrayRef runs = CTLineGetGlyphRuns (ctline); + + if (CFArrayGetCount (runs) > 0) + { + CTRunRef run = CFArrayGetValueAtIndex (runs, 0); + CFDictionaryRef attributes = CTRunGetAttributes (run); + + if (attributes) + { + CTFontRef font_in_run = + CFDictionaryGetValue (attributes, kCTFontAttributeName); + + if (font_in_run + && mac_ctfont_equal_in_postscript_name (font_in_run, font)) + { + CTRunGetGlyphs (run, CFRangeMake (0, 1), &result); + if (result >= CTFontGetGlyphCount (font)) + result = kCGFontIndexInvalid; + } + } + } + CFRelease (ctline); + } + + return result; +} +#endif + +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 +static inline int +mac_font_family_group (CFStringRef family) +{ + if (CFStringHasPrefix (family, CFSTR ("#"))) + return 2; + else + { + CFRange range; + + range = CFStringFind (family, CFSTR ("Apple"), + kCFCompareCaseInsensitive | kCFCompareAnchored); + if (range.location != kCFNotFound) + return 1; + + return 0; + } +} + +CFComparisonResult +mac_font_family_compare (const void *val1, const void *val2, void *context) +{ + CFStringRef family1 = (CFStringRef) val1, family2 = (CFStringRef) val2; + int group1, group2; + + group1 = mac_font_family_group (family1); + group2 = mac_font_family_group (family2); + if (group1 < group2) + return kCFCompareLessThan; + if (group1 > group2) + return kCFCompareGreaterThan; + return CFStringCompare (family1, family2, kCFCompareCaseInsensitive); +} +#endif /* MAC_OS_X_VERSION_MIN_REQUIRED < 1060 */ + +void * +macfont_get_nsctfont (struct font *font) +{ + struct macfont_info *macfont_info = (struct macfont_info *) font; + FontRef macfont = macfont_info->macfont; + + return (void *) macfont; +} + +void +mac_register_font_driver (struct frame *f) +{ + register_font_driver (&macfont_driver, f); +} + +#endif // MAC_OS_X_VERSION_MAX_ALLOWED >= 1050 + + +void +syms_of_macfont (void) +{ +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1050 + static struct font_driver mac_font_driver; + + DEFSYM (Qmac_ct, "mac-ct"); + macfont_driver.type = Qmac_ct; + register_font_driver (&macfont_driver, NULL); + + DEFSYM (QCdestination, ":destination"); + DEFSYM (QCminspace, ":minspace"); +#endif +} diff --git a/src/macuvs.h b/src/macuvs.h new file mode 100644 index 00000000000..20879888f9a --- /dev/null +++ b/src/macuvs.h @@ -0,0 +1,9215 @@ +/* UVS (Unicode Variation Sequence) table definitions. + +This file is part of GNU Emacs. */ + +/* This was generated from the Ideographic Variation Database file at + http://www.unicode.org/ivd/data/2012-03-02/IVD_Sequences.txt + using admin/mac/uvs.el in GNU Emacs, and distributed under + the Terms of Use in http://www.unicode.org/terms_of_use.html. */ +static const unsigned char mac_uvs_table_adobe_japan1_bytes[] = + { + 0x00, 0x0e, 0x00, 0x01, 0x1f, 0x9e, 0x00, 0x00, + 0x00, 0x0f, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xaf, 0x0e, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x9a, + 0x0e, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x1c, 0x31, 0x0e, 0x01, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x1e, 0xb0, 0x0e, 0x01, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, + 0x09, 0x0e, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x1f, 0x2b, 0x0e, 0x01, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0x43, 0x0e, + 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x1f, 0x51, 0x0e, 0x01, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x1f, 0x5f, 0x0e, 0x01, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0x68, + 0x0e, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x1f, 0x71, 0x0e, 0x01, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x1f, 0x7a, 0x0e, 0x01, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, + 0x83, 0x0e, 0x01, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x1f, 0x8c, 0x0e, 0x01, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0x95, 0x00, + 0x00, 0x33, 0xfb, 0x00, 0x34, 0x02, 0x35, 0x82, + 0x00, 0x34, 0x05, 0x3c, 0x1b, 0x00, 0x34, 0x06, + 0x43, 0x5a, 0x00, 0x34, 0x27, 0x36, 0x56, 0x00, + 0x34, 0x2c, 0x43, 0x5e, 0x00, 0x34, 0x2e, 0x37, + 0x88, 0x00, 0x34, 0x68, 0x36, 0xdf, 0x00, 0x34, + 0x6a, 0x43, 0x75, 0x00, 0x34, 0x88, 0x3c, 0x52, + 0x00, 0x34, 0x92, 0x43, 0x8e, 0x00, 0x34, 0xb5, + 0x41, 0x99, 0x00, 0x34, 0xbc, 0x43, 0x97, 0x00, + 0x34, 0xc1, 0x47, 0xd0, 0x00, 0x34, 0xc7, 0x43, + 0x9b, 0x00, 0x34, 0xdb, 0x3c, 0x41, 0x00, 0x35, + 0x1f, 0x36, 0x29, 0x00, 0x35, 0x3e, 0x37, 0x1e, + 0x00, 0x35, 0x5d, 0x43, 0xbd, 0x00, 0x35, 0x5e, + 0x43, 0xbe, 0x00, 0x35, 0x63, 0x43, 0xc0, 0x00, + 0x35, 0x6e, 0x43, 0xc4, 0x00, 0x35, 0xa6, 0x43, + 0xd9, 0x00, 0x35, 0xa8, 0x43, 0xdb, 0x00, 0x35, + 0xc5, 0x43, 0xe1, 0x00, 0x35, 0xda, 0x43, 0xea, + 0x00, 0x35, 0xde, 0x4e, 0x63, 0x00, 0x35, 0xf4, + 0x43, 0xf3, 0x00, 0x36, 0x05, 0x43, 0xfa, 0x00, + 0x36, 0x14, 0x4a, 0xbb, 0x00, 0x36, 0x4a, 0x44, + 0x21, 0x00, 0x36, 0x91, 0x44, 0x41, 0x00, 0x36, + 0x96, 0x44, 0x45, 0x00, 0x36, 0x99, 0x44, 0x43, + 0x00, 0x36, 0xcf, 0x44, 0x56, 0x00, 0x37, 0x61, + 0x44, 0x78, 0x00, 0x37, 0x62, 0x44, 0x79, 0x00, + 0x37, 0x6b, 0x44, 0x7d, 0x00, 0x37, 0x6c, 0x44, + 0x7c, 0x00, 0x37, 0x75, 0x44, 0x80, 0x00, 0x37, + 0x8d, 0x36, 0x1a, 0x00, 0x37, 0xc1, 0x44, 0x8e, + 0x00, 0x37, 0xe2, 0x37, 0x2b, 0x00, 0x37, 0xe8, + 0x44, 0xa2, 0x00, 0x37, 0xf4, 0x44, 0xa5, 0x00, + 0x37, 0xfd, 0x44, 0xa8, 0x00, 0x38, 0x00, 0x44, + 0xaa, 0x00, 0x38, 0x2f, 0x44, 0xb4, 0x00, 0x38, + 0x36, 0x44, 0xb5, 0x00, 0x38, 0x40, 0x44, 0xb6, + 0x00, 0x38, 0x5c, 0x44, 0xba, 0x00, 0x38, 0x61, + 0x44, 0xbc, 0x00, 0x38, 0xa1, 0x4e, 0xcb, 0x00, + 0x38, 0xad, 0x4a, 0xbc, 0x00, 0x38, 0xfa, 0x36, + 0x1c, 0x00, 0x39, 0x17, 0x44, 0xd9, 0x00, 0x39, + 0x1a, 0x44, 0xdc, 0x00, 0x39, 0x6f, 0x44, 0xeb, + 0x00, 0x39, 0xa4, 0x4e, 0x9a, 0x00, 0x39, 0xb8, + 0x4e, 0x9b, 0x00, 0x3a, 0x5c, 0x4e, 0x9f, 0x00, + 0x3a, 0x6e, 0x45, 0x31, 0x00, 0x3a, 0x73, 0x45, + 0x34, 0x00, 0x3a, 0x85, 0x4e, 0xae, 0x00, 0x3a, + 0xc4, 0x4e, 0xa7, 0x00, 0x3a, 0xcb, 0x4e, 0xa8, + 0x00, 0x3a, 0xd6, 0x45, 0x43, 0x00, 0x3a, 0xd7, + 0x45, 0x5e, 0x00, 0x3a, 0xea, 0x45, 0x4d, 0x00, + 0x3a, 0xf3, 0x3c, 0x40, 0x00, 0x3b, 0x0e, 0x45, + 0x58, 0x00, 0x3b, 0x1a, 0x45, 0x5c, 0x00, 0x3b, + 0x1c, 0x45, 0x5d, 0x00, 0x3b, 0x22, 0x3c, 0x49, + 0x00, 0x3b, 0x6d, 0x45, 0x8c, 0x00, 0x3b, 0x77, + 0x45, 0x85, 0x00, 0x3b, 0x87, 0x45, 0xa2, 0x00, + 0x3b, 0x88, 0x36, 0x8d, 0x00, 0x3b, 0x8d, 0x45, + 0xa4, 0x00, 0x3b, 0xa4, 0x45, 0xaa, 0x00, 0x3b, + 0xb6, 0x42, 0x0e, 0x00, 0x3b, 0xc3, 0x42, 0x0f, + 0x00, 0x3b, 0xcd, 0x45, 0xb8, 0x00, 0x3b, 0xf0, + 0x45, 0xc9, 0x00, 0x3b, 0xf3, 0x4e, 0xb7, 0x00, + 0x3c, 0x0f, 0x42, 0x17, 0x00, 0x3c, 0x26, 0x45, + 0xdf, 0x00, 0x3c, 0xc3, 0x45, 0xfc, 0x00, 0x3c, + 0xd2, 0x46, 0x01, 0x00, 0x3d, 0x11, 0x46, 0x25, + 0x00, 0x3d, 0x1e, 0x46, 0x30, 0x00, 0x3d, 0x31, + 0x4e, 0xbe, 0x00, 0x3d, 0x4e, 0x1d, 0xe7, 0x00, + 0x3d, 0x64, 0x46, 0x4a, 0x00, 0x3d, 0x9a, 0x46, + 0x58, 0x00, 0x3d, 0xc0, 0x46, 0x6a, 0x00, 0x3d, + 0xcc, 0x4a, 0xbd, 0x00, 0x3d, 0xd4, 0x46, 0x6f, + 0x00, 0x3e, 0x05, 0x46, 0x7b, 0x00, 0x3e, 0x3f, + 0x42, 0x48, 0x00, 0x3e, 0x40, 0x4e, 0xca, 0x00, + 0x3e, 0x60, 0x46, 0x8b, 0x00, 0x3e, 0x66, 0x46, + 0x8d, 0x00, 0x3e, 0x68, 0x46, 0x8e, 0x00, 0x3e, + 0x83, 0x46, 0x95, 0x00, 0x3e, 0x8a, 0x3c, 0x43, + 0x00, 0x3e, 0x94, 0x46, 0x9b, 0x00, 0x3e, 0xda, + 0x3c, 0x48, 0x00, 0x3f, 0x57, 0x46, 0xcb, 0x00, + 0x3f, 0x72, 0x42, 0x58, 0x00, 0x3f, 0x75, 0x46, + 0xd9, 0x00, 0x3f, 0x77, 0x46, 0xdb, 0x00, 0x3f, + 0xae, 0x46, 0xed, 0x00, 0x3f, 0xb1, 0x37, 0x54, + 0x00, 0x3f, 0xc9, 0x46, 0xf8, 0x00, 0x3f, 0xd7, + 0x46, 0xfd, 0x00, 0x3f, 0xdc, 0x4a, 0xbe, 0x00, + 0x40, 0x39, 0x47, 0x0f, 0x00, 0x40, 0x58, 0x47, + 0x16, 0x00, 0x40, 0x93, 0x3c, 0x4c, 0x00, 0x41, + 0x03, 0x3c, 0x4f, 0x00, 0x41, 0x05, 0x47, 0x3b, + 0x00, 0x41, 0x48, 0x47, 0x47, 0x00, 0x41, 0x4f, + 0x47, 0x4a, 0x00, 0x41, 0x63, 0x47, 0x4e, 0x00, + 0x41, 0xb4, 0x47, 0x5d, 0x00, 0x41, 0xbf, 0x47, + 0x60, 0x00, 0x41, 0xe6, 0x47, 0x6b, 0x00, 0x41, + 0xee, 0x47, 0x6f, 0x00, 0x41, 0xf3, 0x47, 0x6c, + 0x00, 0x42, 0x07, 0x47, 0x76, 0x00, 0x42, 0x0e, + 0x47, 0x79, 0x00, 0x42, 0x64, 0x37, 0x60, 0x00, + 0x42, 0x93, 0x3c, 0x50, 0x00, 0x42, 0xc6, 0x47, + 0x9f, 0x00, 0x42, 0xd6, 0x47, 0xaa, 0x00, 0x42, + 0xdd, 0x47, 0xae, 0x00, 0x43, 0x02, 0x47, 0xbc, + 0x00, 0x43, 0x2b, 0x47, 0xc9, 0x00, 0x43, 0x43, + 0x47, 0xcb, 0x00, 0x43, 0xee, 0x47, 0xf7, 0x00, + 0x43, 0xf0, 0x47, 0xfa, 0x00, 0x44, 0x08, 0x48, + 0x00, 0x00, 0x44, 0x0c, 0x3c, 0x42, 0x00, 0x44, + 0x17, 0x48, 0x02, 0x00, 0x44, 0x1c, 0x48, 0x03, + 0x00, 0x44, 0x22, 0x48, 0x05, 0x00, 0x44, 0x53, + 0x37, 0x73, 0x00, 0x44, 0x5b, 0x42, 0xa4, 0x00, + 0x44, 0x76, 0x48, 0x1c, 0x00, 0x44, 0x7a, 0x48, + 0x1d, 0x00, 0x44, 0x91, 0x48, 0x23, 0x00, 0x44, + 0xb3, 0x48, 0x3e, 0x00, 0x44, 0xbe, 0x48, 0x3c, + 0x00, 0x44, 0xd4, 0x48, 0x3d, 0x00, 0x45, 0x08, + 0x48, 0x5c, 0x00, 0x45, 0x0d, 0x48, 0x58, 0x00, + 0x45, 0x25, 0x37, 0x7e, 0x00, 0x45, 0x43, 0x48, + 0x6c, 0x00, 0x45, 0x7a, 0x3c, 0x4b, 0x00, 0x45, + 0x9d, 0x42, 0xd4, 0x00, 0x45, 0xb8, 0x48, 0xa0, + 0x00, 0x45, 0xbe, 0x4a, 0xbf, 0x00, 0x45, 0xe5, + 0x48, 0xba, 0x00, 0x45, 0xea, 0x42, 0xd9, 0x00, + 0x46, 0x0f, 0x48, 0xca, 0x00, 0x46, 0x10, 0x4a, + 0xc0, 0x00, 0x46, 0x41, 0x48, 0xd8, 0x00, 0x46, + 0x65, 0x3c, 0x4e, 0x00, 0x46, 0xa1, 0x48, 0xe9, + 0x00, 0x46, 0xae, 0x3c, 0x51, 0x00, 0x46, 0xaf, + 0x48, 0xed, 0x00, 0x47, 0x0c, 0x49, 0x02, 0x00, + 0x47, 0x1f, 0x4e, 0xfb, 0x00, 0x47, 0x64, 0x49, + 0x18, 0x00, 0x47, 0xe6, 0x37, 0x90, 0x00, 0x47, + 0xfd, 0x49, 0x24, 0x00, 0x48, 0x16, 0x49, 0x2e, + 0x00, 0x48, 0x1e, 0x4f, 0x01, 0x00, 0x48, 0x44, + 0x42, 0xf5, 0x00, 0x48, 0x4e, 0x49, 0x3a, 0x00, + 0x48, 0xb5, 0x49, 0x5b, 0x00, 0x49, 0xb0, 0x43, + 0x1f, 0x00, 0x49, 0xe7, 0x49, 0xd2, 0x00, 0x49, + 0xfa, 0x49, 0xd6, 0x00, 0x4a, 0x04, 0x49, 0xdb, + 0x00, 0x4a, 0x29, 0x49, 0xde, 0x00, 0x4a, 0xbc, + 0x49, 0xf6, 0x00, 0x4b, 0x38, 0x35, 0xdf, 0x00, + 0x4b, 0x3b, 0x4a, 0x0e, 0x00, 0x4b, 0x7e, 0x4a, + 0xc1, 0x00, 0x4b, 0xc2, 0x4a, 0x33, 0x00, 0x4b, + 0xca, 0x4a, 0x35, 0x00, 0x4b, 0xd2, 0x4a, 0x37, + 0x00, 0x4b, 0xe8, 0x3c, 0x46, 0x00, 0x4c, 0x17, + 0x43, 0x34, 0x00, 0x4c, 0x20, 0x4a, 0x48, 0x00, + 0x4c, 0x38, 0x4a, 0xc2, 0x00, 0x4c, 0xc4, 0x4a, + 0x84, 0x00, 0x4c, 0xd1, 0x4a, 0x87, 0x00, 0x4c, + 0xe1, 0x4a, 0xc3, 0x00, 0x4d, 0x07, 0x4a, 0x9b, + 0x00, 0x4d, 0x77, 0x4a, 0xab, 0x00, 0x4e, 0x00, + 0x04, 0xb0, 0x00, 0x4e, 0x01, 0x0b, 0xb8, 0x00, + 0x4e, 0x02, 0x43, 0x52, 0x00, 0x4e, 0x03, 0x08, + 0xe3, 0x00, 0x4e, 0x04, 0x37, 0xd8, 0x00, 0x4e, + 0x05, 0x37, 0xd9, 0x00, 0x4e, 0x07, 0x0e, 0xaa, + 0x00, 0x4e, 0x08, 0x09, 0xce, 0x00, 0x4e, 0x09, + 0x08, 0x7e, 0x00, 0x4e, 0x0a, 0x09, 0xcd, 0x00, + 0x4e, 0x0b, 0x05, 0x3c, 0x00, 0x4e, 0x0c, 0x4a, + 0xc4, 0x00, 0x4e, 0x0d, 0x0d, 0xc6, 0x00, 0x4e, + 0x0e, 0x0f, 0x29, 0x00, 0x4e, 0x0f, 0x43, 0x53, + 0x00, 0x4e, 0x10, 0x0f, 0xfb, 0x00, 0x4e, 0x11, + 0x04, 0xd1, 0x00, 0x4e, 0x12, 0x43, 0x54, 0x00, + 0x4e, 0x14, 0x05, 0xcc, 0x00, 0x4e, 0x15, 0x0f, + 0xfc, 0x00, 0x4e, 0x16, 0x0a, 0x48, 0x00, 0x4e, + 0x17, 0x10, 0xd7, 0x00, 0x4e, 0x18, 0x06, 0x70, + 0x00, 0x4e, 0x19, 0x0e, 0x0a, 0x00, 0x4e, 0x1e, + 0x09, 0xcf, 0x00, 0x4e, 0x1f, 0x37, 0xda, 0x00, + 0x4e, 0x21, 0x0f, 0x86, 0x00, 0x4e, 0x23, 0x4a, + 0xc5, 0x00, 0x4e, 0x24, 0x4a, 0xc6, 0x00, 0x4e, + 0x26, 0x0e, 0x12, 0x00, 0x4e, 0x28, 0x20, 0xb3, + 0x00, 0x4e, 0x29, 0x43, 0x55, 0x00, 0x4e, 0x2a, + 0x0f, 0xfd, 0x00, 0x4e, 0x2b, 0x37, 0xdb, 0x00, + 0x4e, 0x2c, 0x37, 0x4d, 0x00, 0x4e, 0x2d, 0x0b, + 0xa4, 0x00, 0x4e, 0x2e, 0x43, 0x56, 0x00, 0x4e, + 0x2f, 0x37, 0xdc, 0x00, 0x4e, 0x30, 0x37, 0xdd, + 0x00, 0x4e, 0x31, 0x0f, 0xfe, 0x00, 0x4e, 0x32, + 0x06, 0xf2, 0x00, 0x4e, 0x35, 0x52, 0x53, 0x00, + 0x4e, 0x36, 0x0f, 0xff, 0x00, 0x4e, 0x37, 0x36, + 0x9d, 0x00, 0x4e, 0x38, 0x06, 0x19, 0x00, 0x4e, + 0x39, 0x0b, 0x6e, 0x00, 0x4e, 0x3b, 0x09, 0x13, + 0x00, 0x4e, 0x3c, 0x10, 0x00, 0x00, 0x4e, 0x3f, + 0x10, 0x01, 0x00, 0x4e, 0x40, 0x37, 0xde, 0x00, + 0x4e, 0x41, 0x37, 0xdf, 0x00, 0x4e, 0x42, 0x10, + 0x02, 0x00, 0x4e, 0x43, 0x0c, 0xeb, 0x00, 0x4e, + 0x44, 0x37, 0xe0, 0x00, 0x4e, 0x45, 0x06, 0x71, + 0x00, 0x4e, 0x47, 0x43, 0x57, 0x00, 0x4e, 0x48, + 0x37, 0x2e, 0x00, 0x4e, 0x4b, 0x0c, 0xed, 0x00, + 0x4e, 0x4d, 0x0c, 0xbb, 0x00, 0x4e, 0x4e, 0x07, + 0x77, 0x00, 0x4e, 0x4f, 0x0e, 0x61, 0x00, 0x4e, + 0x51, 0x43, 0x59, 0x00, 0x4e, 0x55, 0x19, 0x50, + 0x00, 0x4e, 0x56, 0x10, 0x03, 0x00, 0x4e, 0x57, + 0x09, 0xd0, 0x00, 0x4e, 0x58, 0x10, 0x04, 0x00, + 0x4e, 0x59, 0x05, 0x35, 0x00, 0x4e, 0x5a, 0x37, + 0xe1, 0x00, 0x4e, 0x5c, 0x52, 0x54, 0x00, 0x4e, + 0x5d, 0x06, 0xdd, 0x00, 0x4e, 0x5e, 0x07, 0xa4, + 0x00, 0x4e, 0x5f, 0x0e, 0xf5, 0x00, 0x4e, 0x62, + 0x12, 0x33, 0x00, 0x4e, 0x63, 0x52, 0x55, 0x00, + 0x4e, 0x68, 0x52, 0x56, 0x00, 0x4e, 0x69, 0x43, + 0x5c, 0x00, 0x4e, 0x71, 0x0f, 0x5a, 0x00, 0x4e, + 0x73, 0x0c, 0xd5, 0x00, 0x4e, 0x74, 0x52, 0x57, + 0x00, 0x4e, 0x75, 0x52, 0x58, 0x00, 0x4e, 0x79, + 0x4a, 0xc7, 0x00, 0x4e, 0x7e, 0x05, 0xe1, 0x00, + 0x4e, 0x7f, 0x37, 0xe2, 0x00, 0x4e, 0x80, 0x06, + 0x4f, 0x00, 0x4e, 0x82, 0x10, 0x05, 0x00, 0x4e, + 0x85, 0x10, 0x06, 0x00, 0x4e, 0x86, 0x0f, 0x83, + 0x00, 0x4e, 0x88, 0x0f, 0x27, 0x00, 0x4e, 0x89, + 0x0a, 0xea, 0x00, 0x4e, 0x8a, 0x10, 0x08, 0x00, + 0x4e, 0x8b, 0x08, 0xc4, 0x00, 0x4e, 0x8c, 0x0c, + 0xcb, 0x00, 0x4e, 0x8d, 0x37, 0xe3, 0x00, 0x4e, + 0x8e, 0x10, 0x0b, 0x00, 0x4e, 0x91, 0x04, 0xe0, + 0x00, 0x4e, 0x92, 0x07, 0x93, 0x00, 0x4e, 0x94, + 0x07, 0x92, 0x00, 0x4e, 0x95, 0x04, 0xaa, 0x00, + 0x4e, 0x96, 0x37, 0xe4, 0x00, 0x4e, 0x97, 0x52, + 0x59, 0x00, 0x4e, 0x98, 0x0f, 0xf1, 0x00, 0x4e, + 0x99, 0x0f, 0xf0, 0x00, 0x4e, 0x9b, 0x08, 0x23, + 0x00, 0x4e, 0x9c, 0x04, 0x65, 0x00, 0x4e, 0x9d, + 0x43, 0x5d, 0x00, 0x4e, 0x9e, 0x10, 0x0c, 0x00, + 0x4e, 0x9f, 0x10, 0x0d, 0x00, 0x4e, 0xa0, 0x10, + 0x0e, 0x00, 0x4e, 0xa1, 0x0e, 0x62, 0x00, 0x4e, + 0xa2, 0x10, 0x0f, 0x00, 0x4e, 0xa4, 0x07, 0xa6, + 0x00, 0x4e, 0xa5, 0x04, 0xab, 0x00, 0x4e, 0xa6, + 0x0e, 0xa0, 0x00, 0x4e, 0xa8, 0x06, 0x96, 0x00, + 0x4e, 0xab, 0x06, 0x97, 0x00, 0x4e, 0xac, 0x06, + 0x98, 0x00, 0x4e, 0xad, 0x0b, 0xfe, 0x00, 0x4e, + 0xae, 0x0f, 0x84, 0x00, 0x4e, 0xaf, 0x52, 0x5a, + 0x00, 0x4e, 0xb0, 0x10, 0x10, 0x00, 0x4e, 0xb3, + 0x10, 0x11, 0x00, 0x4e, 0xb6, 0x10, 0x12, 0x00, + 0x4e, 0xb9, 0x37, 0xe5, 0x00, 0x4e, 0xba, 0x0a, + 0x13, 0x00, 0x4e, 0xbb, 0x36, 0x20, 0x00, 0x4e, + 0xbc, 0x43, 0x5f, 0x00, 0x4e, 0xc0, 0x09, 0x44, + 0x00, 0x4e, 0xc1, 0x0a, 0x14, 0x00, 0x4e, 0xc2, + 0x10, 0x17, 0x00, 0x4e, 0xc3, 0x43, 0x60, 0x00, + 0x4e, 0xc4, 0x10, 0x15, 0x00, 0x4e, 0xc6, 0x10, + 0x16, 0x00, 0x4e, 0xc7, 0x06, 0x72, 0x00, 0x4e, + 0xc8, 0x43, 0x61, 0x00, 0x4e, 0xca, 0x08, 0x13, + 0x00, 0x4e, 0xcb, 0x05, 0x70, 0x00, 0x4e, 0xcd, + 0x10, 0x14, 0x00, 0x4e, 0xce, 0x10, 0x13, 0x00, + 0x4e, 0xcf, 0x0d, 0xf9, 0x00, 0x4e, 0xd0, 0x37, + 0xe6, 0x00, 0x4e, 0xd4, 0x08, 0x94, 0x00, 0x4e, + 0xd5, 0x08, 0x93, 0x00, 0x4e, 0xd6, 0x0b, 0x1e, + 0x00, 0x4e, 0xd7, 0x10, 0x18, 0x00, 0x4e, 0xd8, + 0x0d, 0xc7, 0x00, 0x4e, 0xd9, 0x0a, 0x8b, 0x00, + 0x4e, 0xda, 0x43, 0x63, 0x00, 0x4e, 0xdb, 0x52, + 0x5b, 0x00, 0x4e, 0xdd, 0x02, 0x90, 0x00, 0x4e, + 0xde, 0x10, 0x19, 0x00, 0x4e, 0xdf, 0x10, 0x1b, + 0x00, 0x4e, 0xe0, 0x37, 0xe7, 0x00, 0x4e, 0xe1, + 0x20, 0xb4, 0x00, 0x4e, 0xe2, 0x52, 0x5c, 0x00, + 0x4e, 0xe3, 0x0b, 0x45, 0x00, 0x4e, 0xe4, 0x0f, + 0xa9, 0x00, 0x4e, 0xe5, 0x04, 0x8e, 0x00, 0x4e, + 0xe8, 0x52, 0x5d, 0x00, 0x4e, 0xeb, 0x43, 0x62, + 0x00, 0x4e, 0xed, 0x10, 0x1a, 0x00, 0x4e, 0xee, + 0x05, 0x3e, 0x00, 0x4e, 0xef, 0x52, 0x5e, 0x00, + 0x4e, 0xf0, 0x06, 0xbc, 0x00, 0x4e, 0xf1, 0x43, + 0x64, 0x00, 0x4e, 0xf2, 0x0b, 0xa5, 0x00, 0x4e, + 0xf3, 0x4a, 0xc8, 0x00, 0x4e, 0xf5, 0x43, 0x65, + 0x00, 0x4e, 0xf6, 0x07, 0x45, 0x00, 0x4e, 0xf7, + 0x10, 0x1c, 0x00, 0x4e, 0xfb, 0x0c, 0xda, 0x00, + 0x4e, 0xfc, 0x20, 0xb5, 0x00, 0x4e, 0xfd, 0x37, + 0xe8, 0x00, 0x4e, 0xfe, 0x52, 0x5f, 0x00, 0x4e, + 0xff, 0x37, 0xe9, 0x00, 0x4f, 0x00, 0x20, 0xb6, + 0x00, 0x4f, 0x01, 0x06, 0x27, 0x00, 0x4f, 0x02, + 0x52, 0x60, 0x00, 0x4f, 0x03, 0x20, 0xb7, 0x00, + 0x4f, 0x08, 0x52, 0x61, 0x00, 0x4f, 0x09, 0x10, + 0x1d, 0x00, 0x4f, 0x0a, 0x04, 0x8f, 0x00, 0x4f, + 0x0b, 0x37, 0xea, 0x00, 0x4f, 0x0c, 0x4a, 0xc9, + 0x00, 0x4f, 0x0d, 0x07, 0x94, 0x00, 0x4f, 0x0e, + 0x06, 0x28, 0x00, 0x4f, 0x0f, 0x0d, 0xec, 0x00, + 0x4f, 0x10, 0x0d, 0x46, 0x00, 0x4f, 0x11, 0x06, + 0x73, 0x00, 0x4f, 0x12, 0x52, 0x62, 0x00, 0x4f, + 0x15, 0x37, 0xeb, 0x00, 0x4f, 0x16, 0x43, 0x66, + 0x00, 0x4f, 0x17, 0x52, 0x63, 0x00, 0x4f, 0x19, + 0x4a, 0xca, 0x00, 0x4f, 0x1a, 0x05, 0x71, 0x00, + 0x4f, 0x1c, 0x10, 0x40, 0x00, 0x4f, 0x1d, 0x0c, + 0x3b, 0x00, 0x4f, 0x2b, 0x4a, 0xcb, 0x00, 0x4f, + 0x2e, 0x4a, 0xcc, 0x00, 0x4f, 0x2f, 0x0d, 0x22, + 0x00, 0x4f, 0x30, 0x10, 0x1f, 0x00, 0x4f, 0x31, + 0x4a, 0xcd, 0x00, 0x4f, 0x33, 0x52, 0x64, 0x00, + 0x4f, 0x34, 0x0d, 0x50, 0x00, 0x4f, 0x35, 0x52, + 0x65, 0x00, 0x4f, 0x36, 0x0f, 0xaa, 0x00, 0x4f, + 0x37, 0x43, 0x68, 0x00, 0x4f, 0x38, 0x09, 0xf3, + 0x00, 0x4f, 0x39, 0x20, 0xb8, 0x00, 0x4f, 0x3a, + 0x08, 0x95, 0x00, 0x4f, 0x3b, 0x37, 0xed, 0x00, + 0x4f, 0x3c, 0x08, 0xc5, 0x00, 0x4f, 0x3d, 0x05, + 0x40, 0x00, 0x4f, 0x3e, 0x43, 0x69, 0x00, 0x4f, + 0x40, 0x52, 0x66, 0x00, 0x4f, 0x42, 0x52, 0x67, + 0x00, 0x4f, 0x43, 0x0b, 0xed, 0x00, 0x4f, 0x46, + 0x0b, 0x60, 0x00, 0x4f, 0x47, 0x10, 0x23, 0x00, + 0x4f, 0x48, 0x41, 0x8b, 0x00, 0x4f, 0x49, 0x37, + 0xee, 0x00, 0x4f, 0x4b, 0x52, 0x68, 0x00, 0x4f, + 0x4c, 0x52, 0x69, 0x00, 0x4f, 0x4d, 0x04, 0x90, + 0x00, 0x4f, 0x4e, 0x0b, 0xff, 0x00, 0x4f, 0x4f, + 0x09, 0x45, 0x00, 0x4f, 0x50, 0x08, 0x24, 0x00, + 0x4f, 0x51, 0x0f, 0x0e, 0x00, 0x4f, 0x52, 0x52, + 0x6a, 0x00, 0x4f, 0x53, 0x0b, 0x2e, 0x00, 0x4f, + 0x54, 0x37, 0xef, 0x00, 0x4f, 0x55, 0x05, 0x3f, + 0x00, 0x4f, 0x56, 0x20, 0xb9, 0x00, 0x4f, 0x57, + 0x10, 0x22, 0x00, 0x4f, 0x58, 0x43, 0x6a, 0x00, + 0x4f, 0x59, 0x0f, 0x28, 0x00, 0x4f, 0x5a, 0x10, + 0x1e, 0x00, 0x4f, 0x5b, 0x10, 0x20, 0x00, 0x4f, + 0x5c, 0x08, 0x5e, 0x00, 0x4f, 0x5d, 0x10, 0x21, + 0x00, 0x4f, 0x5e, 0x11, 0xd3, 0x00, 0x4f, 0x5f, + 0x41, 0x8c, 0x00, 0x4f, 0x60, 0x37, 0xec, 0x00, + 0x4f, 0x63, 0x52, 0x6b, 0x00, 0x4f, 0x64, 0x43, + 0x67, 0x00, 0x4f, 0x69, 0x10, 0x29, 0x00, 0x4f, + 0x6a, 0x41, 0x8d, 0x00, 0x4f, 0x6c, 0x41, 0x8e, + 0x00, 0x4f, 0x6e, 0x52, 0x6c, 0x00, 0x4f, 0x6f, + 0x10, 0x2c, 0x00, 0x4f, 0x70, 0x10, 0x2a, 0x00, + 0x4f, 0x71, 0x52, 0x6d, 0x00, 0x4f, 0x73, 0x05, + 0x42, 0x00, 0x4f, 0x75, 0x0e, 0x0b, 0x00, 0x4f, + 0x76, 0x10, 0x24, 0x00, 0x4f, 0x77, 0x43, 0x6c, + 0x00, 0x4f, 0x78, 0x43, 0x6d, 0x00, 0x4f, 0x79, + 0x52, 0x6e, 0x00, 0x4f, 0x7a, 0x37, 0xf0, 0x00, + 0x4f, 0x7b, 0x10, 0x28, 0x00, 0x4f, 0x7c, 0x07, + 0xa7, 0x00, 0x4f, 0x7d, 0x37, 0xf1, 0x00, 0x4f, + 0x7e, 0x37, 0xf2, 0x00, 0x4f, 0x7f, 0x08, 0x96, + 0x00, 0x4f, 0x81, 0x52, 0x6f, 0x00, 0x4f, 0x82, + 0x43, 0x6e, 0x00, 0x4f, 0x83, 0x05, 0xe2, 0x00, + 0x4f, 0x84, 0x4a, 0xce, 0x00, 0x4f, 0x85, 0x43, + 0x6f, 0x00, 0x4f, 0x86, 0x10, 0x2d, 0x00, 0x4f, + 0x88, 0x10, 0x25, 0x00, 0x4f, 0x89, 0x52, 0x70, + 0x00, 0x4f, 0x8a, 0x20, 0xbb, 0x00, 0x4f, 0x8b, + 0x0f, 0xab, 0x00, 0x4f, 0x8c, 0x52, 0x71, 0x00, + 0x4f, 0x8d, 0x08, 0xc6, 0x00, 0x4f, 0x8e, 0x52, + 0x72, 0x00, 0x4f, 0x8f, 0x10, 0x26, 0x00, 0x4f, + 0x90, 0x52, 0x73, 0x00, 0x4f, 0x91, 0x10, 0x2b, + 0x00, 0x4f, 0x92, 0x20, 0xba, 0x00, 0x4f, 0x93, + 0x52, 0x74, 0x00, 0x4f, 0x94, 0x20, 0xbd, 0x00, + 0x4f, 0x96, 0x10, 0x2e, 0x00, 0x4f, 0x97, 0x37, + 0xf3, 0x00, 0x4f, 0x98, 0x10, 0x27, 0x00, 0x4f, + 0x99, 0x52, 0x75, 0x00, 0x4f, 0x9a, 0x20, 0xbc, + 0x00, 0x4f, 0x9b, 0x06, 0x99, 0x00, 0x4f, 0x9d, + 0x04, 0x91, 0x00, 0x4f, 0x9e, 0x4a, 0xcf, 0x00, + 0x4f, 0x9f, 0x52, 0x76, 0x00, 0x4f, 0xa0, 0x06, + 0x9a, 0x00, 0x4f, 0xa1, 0x05, 0x41, 0x00, 0x4f, + 0xab, 0x11, 0xd4, 0x00, 0x4f, 0xad, 0x0e, 0xa7, + 0x00, 0x4f, 0xae, 0x0d, 0xe0, 0x00, 0x4f, 0xaf, + 0x07, 0xa8, 0x00, 0x4f, 0xb2, 0x43, 0x71, 0x00, + 0x4f, 0xb5, 0x09, 0xf5, 0x00, 0x4f, 0xb6, 0x0f, + 0x7f, 0x00, 0x4f, 0xb7, 0x4a, 0xd0, 0x00, 0x4f, + 0xb9, 0x52, 0x77, 0x00, 0x4f, 0xbb, 0x52, 0x78, + 0x00, 0x4f, 0xbc, 0x52, 0x79, 0x00, 0x4f, 0xbd, + 0x52, 0x7a, 0x00, 0x4f, 0xbe, 0x37, 0xf4, 0x00, + 0x4f, 0xbf, 0x0e, 0x28, 0x00, 0x4f, 0xc0, 0x52, + 0x7b, 0x00, 0x4f, 0xc1, 0x52, 0x7c, 0x00, 0x4f, + 0xc2, 0x07, 0x0e, 0x00, 0x4f, 0xc3, 0x0b, 0x05, + 0x00, 0x4f, 0xc4, 0x05, 0x64, 0x00, 0x4f, 0xc5, + 0x43, 0x72, 0x00, 0x4f, 0xc6, 0x52, 0x7d, 0x00, + 0x4f, 0xc8, 0x52, 0x7e, 0x00, 0x4f, 0xc9, 0x20, + 0xac, 0x00, 0x4f, 0xca, 0x09, 0x5d, 0x00, 0x4f, + 0xcb, 0x43, 0x73, 0x00, 0x4f, 0xcc, 0x52, 0x7f, + 0x00, 0x4f, 0xcd, 0x20, 0xbe, 0x00, 0x4f, 0xce, + 0x10, 0x32, 0x00, 0x4f, 0xcf, 0x37, 0xf5, 0x00, + 0x4f, 0xd0, 0x10, 0x37, 0x00, 0x4f, 0xd1, 0x10, + 0x35, 0x00, 0x4f, 0xd2, 0x43, 0x74, 0x00, 0x4f, + 0xd3, 0x3c, 0x2f, 0x00, 0x4f, 0xd4, 0x10, 0x30, + 0x00, 0x4f, 0xd7, 0x0b, 0x0f, 0x00, 0x4f, 0xd8, + 0x10, 0x33, 0x00, 0x4f, 0xda, 0x10, 0x36, 0x00, + 0x4f, 0xdb, 0x10, 0x34, 0x00, 0x4f, 0xdc, 0x52, + 0x80, 0x00, 0x4f, 0xdd, 0x0e, 0x2d, 0x00, 0x4f, + 0xdf, 0x10, 0x31, 0x00, 0x4f, 0xe0, 0x1d, 0xec, + 0x00, 0x4f, 0xe1, 0x09, 0xf4, 0x00, 0x4f, 0xe2, + 0x52, 0x81, 0x00, 0x4f, 0xe3, 0x0e, 0xa1, 0x00, + 0x4f, 0xe4, 0x10, 0x38, 0x00, 0x4f, 0xe5, 0x10, + 0x39, 0x00, 0x4f, 0xe6, 0x43, 0x70, 0x00, 0x4f, + 0xee, 0x09, 0x2e, 0x00, 0x4f, 0xef, 0x10, 0x46, + 0x00, 0x4f, 0xf0, 0x52, 0x82, 0x00, 0x4f, 0xf1, + 0x35, 0xa3, 0x00, 0x4f, 0xf2, 0x43, 0x76, 0x00, + 0x4f, 0xf3, 0x0d, 0x06, 0x00, 0x4f, 0xf5, 0x0d, + 0xa8, 0x00, 0x4f, 0xf6, 0x10, 0x41, 0x00, 0x4f, + 0xf8, 0x0e, 0x40, 0x00, 0x4f, 0xfa, 0x05, 0x36, + 0x00, 0x4f, 0xfc, 0x52, 0x83, 0x00, 0x4f, 0xfd, + 0x37, 0xf6, 0x00, 0x4f, 0xfe, 0x10, 0x45, 0x00, + 0x4f, 0xff, 0x20, 0xc1, 0x00, 0x50, 0x00, 0x37, + 0xf7, 0x00, 0x50, 0x01, 0x37, 0xf8, 0x00, 0x50, + 0x02, 0x4f, 0x4b, 0x00, 0x50, 0x04, 0x4a, 0xd1, + 0x00, 0x50, 0x05, 0x10, 0x3f, 0x00, 0x50, 0x06, + 0x10, 0x48, 0x00, 0x50, 0x07, 0x52, 0x84, 0x00, + 0x50, 0x09, 0x0a, 0xd4, 0x00, 0x50, 0x0a, 0x52, + 0x85, 0x00, 0x50, 0x0b, 0x07, 0x78, 0x00, 0x50, + 0x0c, 0x4a, 0xd2, 0x00, 0x50, 0x0d, 0x0d, 0x12, + 0x00, 0x50, 0x0e, 0x41, 0x8f, 0x00, 0x50, 0x0f, + 0x16, 0x00, 0x00, 0x50, 0x10, 0x37, 0xf9, 0x00, + 0x50, 0x11, 0x10, 0x47, 0x00, 0x50, 0x12, 0x0c, + 0x57, 0x00, 0x50, 0x13, 0x43, 0x77, 0x00, 0x50, + 0x14, 0x10, 0x3c, 0x00, 0x50, 0x16, 0x07, 0xaa, + 0x00, 0x50, 0x17, 0x52, 0x86, 0x00, 0x50, 0x18, + 0x41, 0x90, 0x00, 0x50, 0x19, 0x07, 0xa9, 0x00, + 0x50, 0x1a, 0x10, 0x3a, 0x00, 0x50, 0x1b, 0x37, + 0xfa, 0x00, 0x50, 0x1c, 0x43, 0x78, 0x00, 0x50, + 0x1d, 0x52, 0x87, 0x00, 0x50, 0x1e, 0x20, 0xc2, + 0x00, 0x50, 0x1f, 0x09, 0x06, 0x00, 0x50, 0x21, + 0x10, 0x42, 0x00, 0x50, 0x22, 0x20, 0xc0, 0x00, + 0x50, 0x23, 0x0e, 0x3f, 0x00, 0x50, 0x24, 0x0b, + 0x8b, 0x00, 0x50, 0x25, 0x10, 0x3e, 0x00, 0x50, + 0x26, 0x07, 0x47, 0x00, 0x50, 0x27, 0x37, 0xfb, + 0x00, 0x50, 0x28, 0x10, 0x3b, 0x00, 0x50, 0x29, + 0x10, 0x43, 0x00, 0x50, 0x2a, 0x10, 0x3d, 0x00, + 0x50, 0x2b, 0x0f, 0x99, 0x00, 0x50, 0x2c, 0x10, + 0x44, 0x00, 0x50, 0x2d, 0x0f, 0xe7, 0x00, 0x50, + 0x2e, 0x37, 0xfc, 0x00, 0x50, 0x30, 0x52, 0x88, + 0x00, 0x50, 0x32, 0x52, 0x89, 0x00, 0x50, 0x33, + 0x52, 0x8a, 0x00, 0x50, 0x35, 0x52, 0x8b, 0x00, + 0x50, 0x36, 0x06, 0xde, 0x00, 0x50, 0x39, 0x07, + 0x46, 0x00, 0x50, 0x3b, 0x38, 0x00, 0x00, 0x50, + 0x40, 0x20, 0xbf, 0x00, 0x50, 0x41, 0x41, 0x91, + 0x00, 0x50, 0x42, 0x20, 0xc5, 0x00, 0x50, 0x43, + 0x10, 0x49, 0x00, 0x50, 0x45, 0x52, 0x8c, 0x00, + 0x50, 0x46, 0x20, 0xc3, 0x00, 0x50, 0x47, 0x10, + 0x4a, 0x00, 0x50, 0x48, 0x10, 0x4e, 0x00, 0x50, + 0x49, 0x04, 0x92, 0x00, 0x50, 0x4a, 0x52, 0x8d, + 0x00, 0x50, 0x4c, 0x4a, 0xd3, 0x00, 0x50, 0x4e, + 0x43, 0x79, 0x00, 0x50, 0x4f, 0x0e, 0x20, 0x00, + 0x50, 0x50, 0x10, 0x4d, 0x00, 0x50, 0x51, 0x52, + 0x8e, 0x00, 0x50, 0x52, 0x52, 0x8f, 0x00, 0x50, + 0x53, 0x43, 0x7a, 0x00, 0x50, 0x55, 0x10, 0x4c, + 0x00, 0x50, 0x56, 0x10, 0x50, 0x00, 0x50, 0x57, + 0x37, 0xfd, 0x00, 0x50, 0x59, 0x52, 0x90, 0x00, + 0x50, 0x5a, 0x10, 0x4f, 0x00, 0x50, 0x5c, 0x0c, + 0x00, 0x00, 0x50, 0x5f, 0x4a, 0xd4, 0x00, 0x50, + 0x60, 0x52, 0x91, 0x00, 0x50, 0x62, 0x4a, 0xd5, + 0x00, 0x50, 0x63, 0x43, 0x7b, 0x00, 0x50, 0x65, + 0x07, 0x48, 0x00, 0x50, 0x66, 0x37, 0xfe, 0x00, + 0x50, 0x67, 0x52, 0x92, 0x00, 0x50, 0x6a, 0x37, + 0xff, 0x00, 0x50, 0x6c, 0x10, 0x51, 0x00, 0x50, + 0x6d, 0x52, 0x93, 0x00, 0x50, 0x70, 0x20, 0xc4, + 0x00, 0x50, 0x71, 0x52, 0x94, 0x00, 0x50, 0x72, + 0x08, 0xf1, 0x00, 0x50, 0x74, 0x0b, 0x06, 0x00, + 0x50, 0x75, 0x0c, 0x01, 0x00, 0x50, 0x76, 0x06, + 0xee, 0x00, 0x50, 0x77, 0x4a, 0xd6, 0x00, 0x50, + 0x78, 0x10, 0x52, 0x00, 0x50, 0x7d, 0x06, 0x50, + 0x00, 0x50, 0x80, 0x10, 0x53, 0x00, 0x50, 0x81, + 0x52, 0x95, 0x00, 0x50, 0x83, 0x52, 0x96, 0x00, + 0x50, 0x84, 0x52, 0x97, 0x00, 0x50, 0x85, 0x10, + 0x55, 0x00, 0x50, 0x86, 0x52, 0x98, 0x00, 0x50, + 0x88, 0x43, 0x7d, 0x00, 0x50, 0x8a, 0x52, 0x99, + 0x00, 0x50, 0x8d, 0x0e, 0x63, 0x00, 0x50, 0x8e, + 0x4a, 0xd7, 0x00, 0x50, 0x8f, 0x38, 0x01, 0x00, + 0x50, 0x90, 0x52, 0x9a, 0x00, 0x50, 0x91, 0x07, + 0x3c, 0x00, 0x50, 0x92, 0x43, 0x7e, 0x00, 0x50, + 0x93, 0x43, 0x7f, 0x00, 0x50, 0x94, 0x20, 0xc6, + 0x00, 0x50, 0x95, 0x43, 0x80, 0x00, 0x50, 0x96, + 0x38, 0x02, 0x00, 0x50, 0x98, 0x08, 0x7f, 0x00, + 0x50, 0x99, 0x0d, 0x8b, 0x00, 0x50, 0x9a, 0x10, + 0x54, 0x00, 0x50, 0x9b, 0x52, 0x9b, 0x00, 0x50, + 0x9c, 0x38, 0x03, 0x00, 0x50, 0x9e, 0x4a, 0xd8, + 0x00, 0x50, 0x9f, 0x52, 0x9c, 0x00, 0x50, 0xa0, + 0x52, 0x9d, 0x00, 0x50, 0xa1, 0x52, 0x9e, 0x00, + 0x50, 0xa2, 0x4a, 0xd9, 0x00, 0x50, 0xa3, 0x43, + 0x7c, 0x00, 0x50, 0xaa, 0x43, 0x81, 0x00, 0x50, + 0xac, 0x08, 0x35, 0x00, 0x50, 0xad, 0x0f, 0x2d, + 0x00, 0x50, 0xaf, 0x52, 0x9f, 0x00, 0x50, 0xb0, + 0x52, 0xa0, 0x00, 0x50, 0xb1, 0x43, 0x83, 0x00, + 0x50, 0xb2, 0x10, 0x57, 0x00, 0x50, 0xb3, 0x10, + 0x5a, 0x00, 0x50, 0xb4, 0x10, 0x56, 0x00, 0x50, + 0xb5, 0x08, 0x34, 0x00, 0x50, 0xb7, 0x09, 0x87, + 0x00, 0x50, 0xb9, 0x52, 0xa1, 0x00, 0x50, 0xba, + 0x43, 0x84, 0x00, 0x50, 0xbb, 0x43, 0x85, 0x00, + 0x50, 0xbd, 0x52, 0xa2, 0x00, 0x50, 0xbe, 0x07, + 0x0f, 0x00, 0x50, 0xc0, 0x52, 0xa3, 0x00, 0x50, + 0xc2, 0x10, 0x5b, 0x00, 0x50, 0xc3, 0x4a, 0xda, + 0x00, 0x50, 0xc4, 0x43, 0x86, 0x00, 0x50, 0xc5, + 0x06, 0xc7, 0x00, 0x50, 0xc7, 0x43, 0x87, 0x00, + 0x50, 0xc9, 0x10, 0x58, 0x00, 0x50, 0xca, 0x10, + 0x59, 0x00, 0x50, 0xcc, 0x38, 0x04, 0x00, 0x50, + 0xcd, 0x0c, 0x87, 0x00, 0x50, 0xce, 0x43, 0x8a, + 0x00, 0x50, 0xcf, 0x0a, 0xfe, 0x00, 0x50, 0xd0, + 0x41, 0x93, 0x00, 0x50, 0xd1, 0x06, 0x9b, 0x00, + 0x50, 0xd3, 0x52, 0xa4, 0x00, 0x50, 0xd4, 0x43, + 0x8c, 0x00, 0x50, 0xd5, 0x0e, 0x7b, 0x00, 0x50, + 0xd6, 0x10, 0x5c, 0x00, 0x50, 0xd8, 0x20, 0xc8, + 0x00, 0x50, 0xd9, 0x3c, 0x30, 0x00, 0x50, 0xda, + 0x0f, 0x85, 0x00, 0x50, 0xdc, 0x52, 0xa5, 0x00, + 0x50, 0xdd, 0x52, 0xa6, 0x00, 0x50, 0xde, 0x10, + 0x5d, 0x00, 0x50, 0xdf, 0x52, 0xa7, 0x00, 0x50, + 0xe1, 0x43, 0x8d, 0x00, 0x50, 0xe2, 0x52, 0xa8, + 0x00, 0x50, 0xe3, 0x10, 0x60, 0x00, 0x50, 0xe4, + 0x52, 0xa9, 0x00, 0x50, 0xe5, 0x10, 0x5e, 0x00, + 0x50, 0xe6, 0x38, 0x05, 0x00, 0x50, 0xe7, 0x0a, + 0xd0, 0x00, 0x50, 0xe8, 0x4a, 0xdb, 0x00, 0x50, + 0xe9, 0x38, 0x06, 0x00, 0x50, 0xed, 0x10, 0x5f, + 0x00, 0x50, 0xee, 0x10, 0x61, 0x00, 0x50, 0xef, + 0x38, 0x07, 0x00, 0x50, 0xf0, 0x3c, 0x31, 0x00, + 0x50, 0xf1, 0x4a, 0xdc, 0x00, 0x50, 0xf2, 0x41, + 0x92, 0x00, 0x50, 0xf3, 0x43, 0x88, 0x00, 0x50, + 0xf4, 0x20, 0xc7, 0x00, 0x50, 0xf5, 0x10, 0x63, + 0x00, 0x50, 0xf6, 0x52, 0xaa, 0x00, 0x50, 0xf9, + 0x10, 0x62, 0x00, 0x50, 0xfa, 0x52, 0xab, 0x00, + 0x50, 0xfb, 0x0e, 0x18, 0x00, 0x50, 0xfe, 0x4a, + 0xdd, 0x00, 0x51, 0x00, 0x06, 0x51, 0x00, 0x51, + 0x01, 0x10, 0x65, 0x00, 0x51, 0x02, 0x10, 0x66, + 0x00, 0x51, 0x03, 0x41, 0x95, 0x00, 0x51, 0x04, + 0x05, 0x2f, 0x00, 0x51, 0x06, 0x41, 0x94, 0x00, + 0x51, 0x07, 0x4a, 0xde, 0x00, 0x51, 0x08, 0x38, + 0x08, 0x00, 0x51, 0x09, 0x10, 0x64, 0x00, 0x51, + 0x0b, 0x38, 0x09, 0x00, 0x51, 0x0c, 0x4a, 0xdf, + 0x00, 0x51, 0x0d, 0x4a, 0xe0, 0x00, 0x51, 0x0e, + 0x4a, 0xe1, 0x00, 0x51, 0x10, 0x38, 0x0a, 0x00, + 0x51, 0x12, 0x09, 0x20, 0x00, 0x51, 0x14, 0x10, + 0x69, 0x00, 0x51, 0x15, 0x10, 0x68, 0x00, 0x51, + 0x16, 0x10, 0x67, 0x00, 0x51, 0x17, 0x43, 0x90, + 0x00, 0x51, 0x18, 0x10, 0x2f, 0x00, 0x51, 0x19, + 0x52, 0xad, 0x00, 0x51, 0x1a, 0x10, 0x6a, 0x00, + 0x51, 0x1b, 0x38, 0x0b, 0x00, 0x51, 0x1c, 0x52, + 0xae, 0x00, 0x51, 0x1d, 0x52, 0xaf, 0x00, 0x51, + 0x1e, 0x38, 0x0c, 0x00, 0x51, 0x1f, 0x09, 0x88, + 0x00, 0x51, 0x21, 0x10, 0x6b, 0x00, 0x51, 0x23, + 0x52, 0xb0, 0x00, 0x51, 0x27, 0x52, 0xb1, 0x00, + 0x51, 0x28, 0x52, 0xb2, 0x00, 0x51, 0x2a, 0x0f, + 0x0f, 0x00, 0x51, 0x2c, 0x52, 0xb3, 0x00, 0x51, + 0x2d, 0x52, 0xb4, 0x00, 0x51, 0x2f, 0x52, 0xb5, + 0x00, 0x51, 0x31, 0x52, 0xb6, 0x00, 0x51, 0x32, + 0x0e, 0xe5, 0x00, 0x51, 0x33, 0x4a, 0xe2, 0x00, + 0x51, 0x34, 0x52, 0xb7, 0x00, 0x51, 0x35, 0x41, + 0x96, 0x00, 0x51, 0x37, 0x10, 0x6d, 0x00, 0x51, + 0x38, 0x4a, 0xe3, 0x00, 0x51, 0x39, 0x52, 0xb8, + 0x00, 0x51, 0x3a, 0x10, 0x6c, 0x00, 0x51, 0x3b, + 0x10, 0x6f, 0x00, 0x51, 0x3c, 0x10, 0x6e, 0x00, + 0x51, 0x3f, 0x10, 0x70, 0x00, 0x51, 0x40, 0x10, + 0x71, 0x00, 0x51, 0x41, 0x04, 0xb8, 0x00, 0x51, + 0x42, 0x52, 0xb9, 0x00, 0x51, 0x43, 0x07, 0x69, + 0x00, 0x51, 0x44, 0x07, 0x11, 0x00, 0x51, 0x45, + 0x09, 0x46, 0x00, 0x51, 0x46, 0x0b, 0xb9, 0x00, + 0x51, 0x47, 0x06, 0x9c, 0x00, 0x51, 0x48, 0x0a, + 0x8c, 0x00, 0x51, 0x49, 0x07, 0xab, 0x00, 0x51, + 0x4a, 0x20, 0xc9, 0x00, 0x51, 0x4b, 0x08, 0x00, + 0x00, 0x51, 0x4c, 0x10, 0x73, 0x00, 0x51, 0x4d, + 0x0e, 0xd4, 0x00, 0x51, 0x4e, 0x0c, 0x40, 0x00, + 0x51, 0x4f, 0x52, 0xba, 0x00, 0x51, 0x50, 0x08, + 0xc7, 0x00, 0x51, 0x52, 0x10, 0x72, 0x00, 0x51, + 0x53, 0x52, 0xbb, 0x00, 0x51, 0x54, 0x1e, 0x86, + 0x00, 0x51, 0x55, 0x41, 0x97, 0x00, 0x51, 0x57, + 0x41, 0x98, 0x00, 0x51, 0x58, 0x52, 0xbc, 0x00, + 0x51, 0x5a, 0x0c, 0x58, 0x00, 0x51, 0x5c, 0x05, + 0xd3, 0x00, 0x51, 0x5f, 0x38, 0x0d, 0x00, 0x51, + 0x60, 0x43, 0x92, 0x00, 0x51, 0x62, 0x10, 0x75, + 0x00, 0x51, 0x64, 0x20, 0xca, 0x00, 0x51, 0x65, + 0x0c, 0xd6, 0x00, 0x51, 0x66, 0x52, 0xbd, 0x00, + 0x51, 0x67, 0x36, 0x8e, 0x00, 0x51, 0x68, 0x0a, + 0xb6, 0x00, 0x51, 0x69, 0x10, 0x77, 0x00, 0x51, + 0x6a, 0x10, 0x78, 0x00, 0x51, 0x6b, 0x0d, 0x40, + 0x00, 0x51, 0x6c, 0x07, 0xac, 0x00, 0x51, 0x6d, + 0x0f, 0xe1, 0x00, 0x51, 0x6e, 0x10, 0x79, 0x00, + 0x51, 0x71, 0x06, 0x9e, 0x00, 0x51, 0x73, 0x43, + 0x94, 0x00, 0x51, 0x74, 0x4a, 0xe4, 0x00, 0x51, + 0x75, 0x0e, 0x0c, 0x00, 0x51, 0x76, 0x0b, 0x16, + 0x00, 0x51, 0x77, 0x06, 0xe9, 0x00, 0x51, 0x78, + 0x0c, 0x2f, 0x00, 0x51, 0x79, 0x37, 0x79, 0x00, + 0x51, 0x7b, 0x47, 0xd9, 0x00, 0x51, 0x7c, 0x07, + 0x49, 0x00, 0x51, 0x7e, 0x52, 0xbe, 0x00, 0x51, + 0x80, 0x10, 0x7a, 0x00, 0x51, 0x82, 0x10, 0x7b, + 0x00, 0x51, 0x83, 0x43, 0x95, 0x00, 0x51, 0x84, + 0x4a, 0xe5, 0x00, 0x51, 0x85, 0x0c, 0xba, 0x00, + 0x51, 0x86, 0x05, 0x01, 0x00, 0x51, 0x89, 0x10, + 0x7e, 0x00, 0x51, 0x8a, 0x08, 0x6d, 0x00, 0x51, + 0x8b, 0x43, 0x96, 0x00, 0x51, 0x8c, 0x10, 0x7d, + 0x00, 0x51, 0x8d, 0x4e, 0x5d, 0x00, 0x51, 0x8e, + 0x52, 0xbf, 0x00, 0x51, 0x8f, 0x10, 0x7f, 0x00, + 0x51, 0x90, 0x18, 0x5b, 0x00, 0x51, 0x91, 0x10, + 0x80, 0x00, 0x51, 0x92, 0x0e, 0x6f, 0x00, 0x51, + 0x93, 0x10, 0x81, 0x00, 0x51, 0x95, 0x1e, 0x88, + 0x00, 0x51, 0x96, 0x10, 0x83, 0x00, 0x51, 0x97, + 0x09, 0xd1, 0x00, 0x51, 0x98, 0x43, 0x98, 0x00, + 0x51, 0x99, 0x08, 0xf8, 0x00, 0x51, 0x9d, 0x20, + 0xcb, 0x00, 0x51, 0xa0, 0x05, 0xe3, 0x00, 0x51, + 0xa1, 0x38, 0x0e, 0x00, 0x51, 0xa2, 0x10, 0x86, + 0x00, 0x51, 0xa3, 0x43, 0x99, 0x00, 0x51, 0xa4, + 0x10, 0x84, 0x00, 0x51, 0xa5, 0x0e, 0xc9, 0x00, + 0x51, 0xa6, 0x10, 0x85, 0x00, 0x51, 0xa8, 0x0d, + 0xcc, 0x00, 0x51, 0xa9, 0x10, 0x87, 0x00, 0x51, + 0xaa, 0x10, 0x88, 0x00, 0x51, 0xab, 0x10, 0x89, + 0x00, 0x51, 0xac, 0x36, 0x82, 0x00, 0x51, 0xad, + 0x43, 0x9a, 0x00, 0x51, 0xb0, 0x10, 0x8d, 0x00, + 0x51, 0xb1, 0x10, 0x8b, 0x00, 0x51, 0xb2, 0x10, + 0x8c, 0x00, 0x51, 0xb3, 0x10, 0x8a, 0x00, 0x51, + 0xb4, 0x08, 0x53, 0x00, 0x51, 0xb5, 0x10, 0x8e, + 0x00, 0x51, 0xb6, 0x0e, 0xf6, 0x00, 0x51, 0xb7, + 0x0f, 0xac, 0x00, 0x51, 0xb8, 0x4a, 0xe6, 0x00, + 0x51, 0xba, 0x4a, 0xe7, 0x00, 0x51, 0xbc, 0x38, + 0x0f, 0x00, 0x51, 0xbd, 0x10, 0x8f, 0x00, 0x51, + 0xbe, 0x20, 0xcc, 0x00, 0x51, 0xbf, 0x52, 0xc0, + 0x00, 0x51, 0xc2, 0x52, 0xc1, 0x00, 0x51, 0xc3, + 0x3c, 0x32, 0x00, 0x51, 0xc4, 0x0a, 0x4c, 0x00, + 0x51, 0xc5, 0x10, 0x90, 0x00, 0x51, 0xc6, 0x09, + 0x64, 0x00, 0x51, 0xc8, 0x4a, 0xe8, 0x00, 0x51, + 0xc9, 0x10, 0x91, 0x00, 0x51, 0xca, 0x41, 0x9a, + 0x00, 0x51, 0xcb, 0x0b, 0xba, 0x00, 0x51, 0xcc, + 0x0f, 0x87, 0x00, 0x51, 0xcd, 0x0c, 0x5a, 0x00, + 0x51, 0xcf, 0x4a, 0xe9, 0x00, 0x51, 0xd1, 0x4a, + 0xea, 0x00, 0x51, 0xd2, 0x52, 0xc2, 0x00, 0x51, + 0xd3, 0x4a, 0xeb, 0x00, 0x51, 0xd4, 0x4a, 0xec, + 0x00, 0x51, 0xd5, 0x52, 0xc3, 0x00, 0x51, 0xd6, + 0x10, 0xda, 0x00, 0x51, 0xd8, 0x4a, 0xed, 0x00, + 0x51, 0xdb, 0x10, 0x92, 0x00, 0x51, 0xdc, 0x20, + 0x5c, 0x00, 0x51, 0xdd, 0x06, 0xbd, 0x00, 0x51, + 0xde, 0x4f, 0x4c, 0x00, 0x51, 0xdf, 0x4a, 0xee, + 0x00, 0x51, 0xe0, 0x10, 0x93, 0x00, 0x51, 0xe1, + 0x0e, 0x8c, 0x00, 0x51, 0xe2, 0x41, 0x9b, 0x00, + 0x51, 0xe5, 0x52, 0xc4, 0x00, 0x51, 0xe6, 0x09, + 0x72, 0x00, 0x51, 0xe7, 0x0b, 0x5c, 0x00, 0x51, + 0xe9, 0x10, 0x95, 0x00, 0x51, 0xea, 0x0c, 0xbc, + 0x00, 0x51, 0xec, 0x20, 0xcd, 0x00, 0x51, 0xed, + 0x10, 0x96, 0x00, 0x51, 0xee, 0x38, 0x11, 0x00, + 0x51, 0xf0, 0x10, 0x97, 0x00, 0x51, 0xf1, 0x05, + 0x8c, 0x00, 0x51, 0xf2, 0x52, 0xc5, 0x00, 0x51, + 0xf3, 0x43, 0x9d, 0x00, 0x51, 0xf4, 0x38, 0x12, + 0x00, 0x51, 0xf5, 0x10, 0x98, 0x00, 0x51, 0xf6, + 0x06, 0x9f, 0x00, 0x51, 0xf7, 0x52, 0xc6, 0x00, + 0x51, 0xf8, 0x0c, 0xa4, 0x00, 0x51, 0xf9, 0x05, + 0x1c, 0x00, 0x51, 0xfa, 0x09, 0x5a, 0x00, 0x51, + 0xfd, 0x0d, 0x35, 0x00, 0x51, 0xfe, 0x10, 0x99, + 0x00, 0x52, 0x00, 0x0c, 0x5b, 0x00, 0x52, 0x01, + 0x38, 0x13, 0x00, 0x52, 0x02, 0x38, 0x14, 0x00, + 0x52, 0x03, 0x0a, 0x15, 0x00, 0x52, 0x04, 0x10, + 0x9a, 0x00, 0x52, 0x05, 0x4a, 0xef, 0x00, 0x52, + 0x06, 0x0d, 0xfc, 0x00, 0x52, 0x07, 0x0a, 0x7e, + 0x00, 0x52, 0x08, 0x05, 0xde, 0x00, 0x52, 0x0a, + 0x05, 0xe5, 0x00, 0x52, 0x0b, 0x10, 0x9b, 0x00, + 0x52, 0x0e, 0x10, 0x9d, 0x00, 0x52, 0x11, 0x07, + 0x10, 0x00, 0x52, 0x12, 0x43, 0x9e, 0x00, 0x52, + 0x13, 0x38, 0x15, 0x00, 0x52, 0x14, 0x10, 0x9c, + 0x00, 0x52, 0x15, 0x20, 0xce, 0x00, 0x52, 0x16, + 0x43, 0x9f, 0x00, 0x52, 0x17, 0x0f, 0xbb, 0x00, + 0x52, 0x18, 0x52, 0xc7, 0x00, 0x52, 0x1d, 0x09, + 0x73, 0x00, 0x52, 0x22, 0x52, 0xc8, 0x00, 0x52, + 0x24, 0x0d, 0x51, 0x00, 0x52, 0x25, 0x0e, 0x1c, + 0x00, 0x52, 0x26, 0x4a, 0xf0, 0x00, 0x52, 0x27, + 0x10, 0x9e, 0x00, 0x52, 0x28, 0x4a, 0xf1, 0x00, + 0x52, 0x29, 0x0f, 0x62, 0x00, 0x52, 0x2a, 0x10, + 0x9f, 0x00, 0x52, 0x2b, 0x4a, 0xf2, 0x00, 0x52, + 0x2e, 0x10, 0xa0, 0x00, 0x52, 0x30, 0x0c, 0x78, + 0x00, 0x52, 0x31, 0x4a, 0xf3, 0x00, 0x52, 0x32, + 0x4a, 0xf4, 0x00, 0x52, 0x33, 0x10, 0xa1, 0x00, + 0x52, 0x35, 0x4a, 0xf5, 0x00, 0x52, 0x36, 0x0a, + 0x4d, 0x00, 0x52, 0x37, 0x08, 0x6e, 0x00, 0x52, + 0x38, 0x07, 0x4a, 0x00, 0x52, 0x39, 0x10, 0xa2, + 0x00, 0x52, 0x3a, 0x08, 0x97, 0x00, 0x52, 0x3b, + 0x08, 0x01, 0x00, 0x52, 0x3c, 0x4a, 0xf6, 0x00, + 0x52, 0x43, 0x0c, 0x02, 0x00, 0x52, 0x44, 0x10, + 0xa4, 0x00, 0x52, 0x45, 0x52, 0xc9, 0x00, 0x52, + 0x47, 0x0b, 0x07, 0x00, 0x52, 0x49, 0x38, 0x16, + 0x00, 0x52, 0x4a, 0x08, 0x5f, 0x00, 0x52, 0x4b, + 0x10, 0xa5, 0x00, 0x52, 0x4c, 0x10, 0xa6, 0x00, + 0x52, 0x4d, 0x0a, 0xb2, 0x00, 0x52, 0x4f, 0x10, + 0xa3, 0x00, 0x52, 0x54, 0x10, 0xa8, 0x00, 0x52, + 0x55, 0x43, 0xa1, 0x00, 0x52, 0x56, 0x0e, 0x64, + 0x00, 0x52, 0x57, 0x41, 0x9c, 0x00, 0x52, 0x58, + 0x52, 0xca, 0x00, 0x52, 0x5a, 0x4a, 0xf7, 0x00, + 0x52, 0x5b, 0x07, 0xf6, 0x00, 0x52, 0x5c, 0x43, + 0xa2, 0x00, 0x52, 0x5d, 0x1e, 0x5e, 0x00, 0x52, + 0x5e, 0x10, 0xa7, 0x00, 0x52, 0x5f, 0x52, 0xcb, + 0x00, 0x52, 0x60, 0x4a, 0xf8, 0x00, 0x52, 0x61, + 0x38, 0x17, 0x00, 0x52, 0x63, 0x07, 0x4b, 0x00, + 0x52, 0x64, 0x08, 0x4e, 0x00, 0x52, 0x65, 0x0d, + 0x23, 0x00, 0x52, 0x66, 0x38, 0x18, 0x00, 0x52, + 0x69, 0x10, 0xab, 0x00, 0x52, 0x6a, 0x10, 0xa9, + 0x00, 0x52, 0x6c, 0x43, 0xa3, 0x00, 0x52, 0x6e, + 0x4a, 0xf9, 0x00, 0x52, 0x6f, 0x0d, 0xed, 0x00, + 0x52, 0x70, 0x09, 0xd2, 0x00, 0x52, 0x71, 0x10, + 0xb2, 0x00, 0x52, 0x72, 0x35, 0x74, 0x00, 0x52, + 0x73, 0x10, 0xac, 0x00, 0x52, 0x74, 0x10, 0xaa, + 0x00, 0x52, 0x75, 0x0a, 0xd1, 0x00, 0x52, 0x77, + 0x43, 0xa4, 0x00, 0x52, 0x78, 0x4a, 0xfa, 0x00, + 0x52, 0x79, 0x4a, 0xfb, 0x00, 0x52, 0x7d, 0x10, + 0xae, 0x00, 0x52, 0x7f, 0x10, 0xad, 0x00, 0x52, + 0x80, 0x52, 0xcc, 0x00, 0x52, 0x82, 0x43, 0xa6, + 0x00, 0x52, 0x83, 0x05, 0xa2, 0x00, 0x52, 0x84, + 0x43, 0xa5, 0x00, 0x52, 0x85, 0x52, 0xcd, 0x00, + 0x52, 0x87, 0x07, 0x36, 0x00, 0x52, 0x88, 0x10, + 0xb3, 0x00, 0x52, 0x89, 0x0f, 0x75, 0x00, 0x52, + 0x8a, 0x4a, 0xfc, 0x00, 0x52, 0x8c, 0x4a, 0xfd, + 0x00, 0x52, 0x8d, 0x10, 0xaf, 0x00, 0x52, 0x91, + 0x10, 0xb4, 0x00, 0x52, 0x92, 0x10, 0xb1, 0x00, + 0x52, 0x93, 0x38, 0x19, 0x00, 0x52, 0x94, 0x10, + 0xb0, 0x00, 0x52, 0x95, 0x52, 0xce, 0x00, 0x52, + 0x96, 0x52, 0xcf, 0x00, 0x52, 0x97, 0x52, 0xd0, + 0x00, 0x52, 0x98, 0x43, 0xa8, 0x00, 0x52, 0x9a, + 0x52, 0xd1, 0x00, 0x52, 0x9b, 0x0f, 0x97, 0x00, + 0x52, 0x9c, 0x20, 0xcf, 0x00, 0x52, 0x9f, 0x07, + 0xad, 0x00, 0x52, 0xa0, 0x05, 0x43, 0x00, 0x52, + 0xa3, 0x0f, 0xbc, 0x00, 0x52, 0xa4, 0x43, 0xaa, + 0x00, 0x52, 0xa5, 0x52, 0xd2, 0x00, 0x52, 0xa6, + 0x20, 0xd0, 0x00, 0x52, 0xa7, 0x52, 0xd3, 0x00, + 0x52, 0xa9, 0x09, 0x7f, 0x00, 0x52, 0xaa, 0x0c, + 0x52, 0x00, 0x52, 0xab, 0x07, 0xf7, 0x00, 0x52, + 0xac, 0x10, 0xb7, 0x00, 0x52, 0xad, 0x10, 0xb8, + 0x00, 0x52, 0xaf, 0x21, 0x7d, 0x00, 0x52, 0xb0, + 0x52, 0xd4, 0x00, 0x52, 0xb1, 0x0f, 0xad, 0x00, + 0x52, 0xb4, 0x0f, 0xd1, 0x00, 0x52, 0xb5, 0x10, + 0xba, 0x00, 0x52, 0xb6, 0x52, 0xd5, 0x00, 0x52, + 0xb7, 0x52, 0xd6, 0x00, 0x52, 0xb8, 0x52, 0xd7, + 0x00, 0x52, 0xb9, 0x07, 0xae, 0x00, 0x52, 0xba, + 0x43, 0xab, 0x00, 0x52, 0xbb, 0x43, 0xac, 0x00, + 0x52, 0xbc, 0x10, 0xb9, 0x00, 0x52, 0xbd, 0x52, + 0xd8, 0x00, 0x52, 0xbe, 0x05, 0x8d, 0x00, 0x52, + 0xc0, 0x20, 0xd1, 0x00, 0x52, 0xc1, 0x10, 0xbb, + 0x00, 0x52, 0xc3, 0x0e, 0x84, 0x00, 0x52, 0xc4, + 0x52, 0xd9, 0x00, 0x52, 0xc5, 0x0b, 0xd8, 0x00, + 0x52, 0xc6, 0x52, 0xda, 0x00, 0x52, 0xc7, 0x0f, + 0x10, 0x00, 0x52, 0xc8, 0x38, 0x1a, 0x00, 0x52, + 0xc9, 0x34, 0x49, 0x00, 0x52, 0xca, 0x43, 0xad, + 0x00, 0x52, 0xcc, 0x41, 0x9d, 0x00, 0x52, 0xcd, + 0x10, 0xbc, 0x00, 0x52, 0xcf, 0x52, 0xdb, 0x00, + 0x52, 0xd0, 0x36, 0xe8, 0x00, 0x52, 0xd1, 0x43, + 0xae, 0x00, 0x52, 0xd2, 0x1b, 0xee, 0x00, 0x52, + 0xd4, 0x52, 0xdc, 0x00, 0x52, 0xd5, 0x0c, 0x88, + 0x00, 0x52, 0xd6, 0x41, 0x9e, 0x00, 0x52, 0xd7, + 0x10, 0xbd, 0x00, 0x52, 0xd8, 0x05, 0xe6, 0x00, + 0x52, 0xd9, 0x0e, 0xbf, 0x00, 0x52, 0xdb, 0x20, + 0xd2, 0x00, 0x52, 0xdc, 0x52, 0xdd, 0x00, 0x52, + 0xdd, 0x09, 0x89, 0x00, 0x52, 0xde, 0x10, 0xbe, + 0x00, 0x52, 0xdf, 0x0e, 0x37, 0x00, 0x52, 0xe0, + 0x10, 0xc2, 0x00, 0x52, 0xe1, 0x4a, 0xfe, 0x00, + 0x52, 0xe2, 0x0a, 0x4e, 0x00, 0x52, 0xe3, 0x10, + 0xbf, 0x00, 0x52, 0xe4, 0x06, 0xc8, 0x00, 0x52, + 0xe5, 0x52, 0xde, 0x00, 0x52, 0xe6, 0x10, 0xc0, + 0x00, 0x52, 0xe7, 0x05, 0xe7, 0x00, 0x52, 0xe8, + 0x52, 0xdf, 0x00, 0x52, 0xe9, 0x4a, 0xff, 0x00, + 0x52, 0xea, 0x52, 0xe0, 0x00, 0x52, 0xec, 0x52, + 0xe1, 0x00, 0x52, 0xf0, 0x38, 0x1b, 0x00, 0x52, + 0xf1, 0x4b, 0x00, 0x00, 0x52, 0xf2, 0x07, 0x04, + 0x00, 0x52, 0xf3, 0x10, 0xc3, 0x00, 0x52, 0xf4, + 0x52, 0xe2, 0x00, 0x52, 0xf5, 0x10, 0xc4, 0x00, + 0x52, 0xf6, 0x52, 0xe3, 0x00, 0x52, 0xf7, 0x43, + 0xb0, 0x00, 0x52, 0xf8, 0x10, 0xc5, 0x00, 0x52, + 0xf9, 0x10, 0xc6, 0x00, 0x52, 0xfa, 0x35, 0xef, + 0x00, 0x52, 0xfb, 0x41, 0x9f, 0x00, 0x52, 0xfe, + 0x07, 0xaf, 0x00, 0x52, 0xff, 0x0e, 0xea, 0x00, + 0x53, 0x00, 0x20, 0xd3, 0x00, 0x53, 0x01, 0x0e, + 0xf4, 0x00, 0x53, 0x02, 0x0c, 0xcf, 0x00, 0x53, + 0x03, 0x4b, 0x01, 0x00, 0x53, 0x05, 0x0e, 0x41, + 0x00, 0x53, 0x06, 0x10, 0xc7, 0x00, 0x53, 0x07, + 0x4f, 0x4d, 0x00, 0x53, 0x08, 0x10, 0xc8, 0x00, + 0x53, 0x0a, 0x38, 0x1c, 0x00, 0x53, 0x0b, 0x38, + 0x1d, 0x00, 0x53, 0x0c, 0x52, 0xe4, 0x00, 0x53, + 0x0d, 0x10, 0xca, 0x00, 0x53, 0x0f, 0x10, 0xcc, + 0x00, 0x53, 0x10, 0x10, 0xcb, 0x00, 0x53, 0x11, + 0x4b, 0x02, 0x00, 0x53, 0x13, 0x52, 0xe5, 0x00, + 0x53, 0x15, 0x10, 0xcd, 0x00, 0x53, 0x16, 0x05, + 0x3d, 0x00, 0x53, 0x17, 0x0e, 0x7a, 0x00, 0x53, + 0x18, 0x52, 0xe6, 0x00, 0x53, 0x19, 0x08, 0x6c, + 0x00, 0x53, 0x1a, 0x10, 0xce, 0x00, 0x53, 0x1b, + 0x52, 0xe7, 0x00, 0x53, 0x1c, 0x41, 0xa0, 0x00, + 0x53, 0x1d, 0x0a, 0xdb, 0x00, 0x53, 0x1e, 0x52, + 0xe8, 0x00, 0x53, 0x1f, 0x4b, 0x03, 0x00, 0x53, + 0x20, 0x09, 0x8a, 0x00, 0x53, 0x21, 0x06, 0xa1, + 0x00, 0x53, 0x23, 0x10, 0xcf, 0x00, 0x53, 0x24, + 0x20, 0xd5, 0x00, 0x53, 0x25, 0x52, 0xe9, 0x00, + 0x53, 0x27, 0x52, 0xea, 0x00, 0x53, 0x28, 0x52, + 0xeb, 0x00, 0x53, 0x29, 0x52, 0xec, 0x00, 0x53, + 0x2a, 0x0d, 0x6f, 0x00, 0x53, 0x2b, 0x52, 0xed, + 0x00, 0x53, 0x2c, 0x52, 0xee, 0x00, 0x53, 0x2d, + 0x4b, 0x04, 0x00, 0x53, 0x2f, 0x10, 0xd0, 0x00, + 0x53, 0x30, 0x52, 0xef, 0x00, 0x53, 0x31, 0x10, + 0xd1, 0x00, 0x53, 0x32, 0x4b, 0x05, 0x00, 0x53, + 0x33, 0x10, 0xd2, 0x00, 0x53, 0x35, 0x43, 0xb1, + 0x00, 0x53, 0x38, 0x10, 0xd3, 0x00, 0x53, 0x39, + 0x0d, 0x96, 0x00, 0x53, 0x3a, 0x06, 0xe0, 0x00, + 0x53, 0x3b, 0x04, 0xa9, 0x00, 0x53, 0x3c, 0x52, + 0xf0, 0x00, 0x53, 0x3d, 0x4b, 0x06, 0x00, 0x53, + 0x3e, 0x38, 0x1e, 0x00, 0x53, 0x3f, 0x0c, 0x97, + 0x00, 0x53, 0x40, 0x10, 0xd4, 0x00, 0x53, 0x41, + 0x09, 0x47, 0x00, 0x53, 0x42, 0x43, 0xb2, 0x00, + 0x53, 0x43, 0x0a, 0x8d, 0x00, 0x53, 0x45, 0x10, + 0xd6, 0x00, 0x53, 0x46, 0x10, 0xd5, 0x00, 0x53, + 0x47, 0x09, 0x8b, 0x00, 0x53, 0x48, 0x07, 0x95, + 0x00, 0x53, 0x49, 0x10, 0xd8, 0x00, 0x53, 0x4a, + 0x0d, 0x52, 0x00, 0x53, 0x4b, 0x38, 0x20, 0x00, + 0x53, 0x4c, 0x38, 0x1f, 0x00, 0x53, 0x4d, 0x10, + 0xd9, 0x00, 0x53, 0x51, 0x34, 0x42, 0x00, 0x53, + 0x52, 0x0b, 0x14, 0x00, 0x53, 0x53, 0x0b, 0x4e, + 0x00, 0x53, 0x54, 0x06, 0xa0, 0x00, 0x53, 0x57, + 0x0c, 0xc6, 0x00, 0x53, 0x58, 0x0b, 0x6f, 0x00, + 0x53, 0x59, 0x52, 0xf1, 0x00, 0x53, 0x5a, 0x0d, + 0x24, 0x00, 0x53, 0x5b, 0x52, 0xf2, 0x00, 0x53, + 0x5c, 0x0e, 0x7c, 0x00, 0x53, 0x5e, 0x10, 0xdb, + 0x00, 0x53, 0x60, 0x0a, 0x8e, 0x00, 0x53, 0x61, + 0x38, 0x21, 0x00, 0x53, 0x63, 0x41, 0xa1, 0x00, + 0x53, 0x65, 0x4b, 0x07, 0x00, 0x53, 0x66, 0x07, + 0x0b, 0x00, 0x53, 0x67, 0x43, 0xb5, 0x00, 0x53, + 0x69, 0x10, 0xdc, 0x00, 0x53, 0x6c, 0x38, 0x22, + 0x00, 0x53, 0x6d, 0x4b, 0x08, 0x00, 0x53, 0x6e, + 0x10, 0xdd, 0x00, 0x53, 0x6f, 0x04, 0xce, 0x00, + 0x53, 0x70, 0x04, 0xb9, 0x00, 0x53, 0x71, 0x06, + 0x29, 0x00, 0x53, 0x72, 0x20, 0xd6, 0x00, 0x53, + 0x73, 0x0b, 0x08, 0x00, 0x53, 0x74, 0x06, 0x6b, + 0x00, 0x53, 0x75, 0x0f, 0x5b, 0x00, 0x53, 0x77, + 0x10, 0xe0, 0x00, 0x53, 0x78, 0x05, 0x37, 0x00, + 0x53, 0x79, 0x4b, 0x09, 0x00, 0x53, 0x7a, 0x43, + 0xb6, 0x00, 0x53, 0x7b, 0x10, 0xdf, 0x00, 0x53, + 0x7d, 0x34, 0x35, 0x00, 0x53, 0x7e, 0x4b, 0x0a, + 0x00, 0x53, 0x7f, 0x35, 0x97, 0x00, 0x53, 0x82, + 0x10, 0xe1, 0x00, 0x53, 0x83, 0x52, 0xf4, 0x00, + 0x53, 0x84, 0x0e, 0xfd, 0x00, 0x53, 0x87, 0x52, + 0xf5, 0x00, 0x53, 0x88, 0x52, 0xf6, 0x00, 0x53, + 0x89, 0x37, 0xd0, 0x00, 0x53, 0x8e, 0x52, 0xf7, + 0x00, 0x53, 0x93, 0x20, 0xd7, 0x00, 0x53, 0x94, + 0x4b, 0x0b, 0x00, 0x53, 0x96, 0x10, 0xe2, 0x00, + 0x53, 0x98, 0x0f, 0x9a, 0x00, 0x53, 0x99, 0x4b, + 0x0c, 0x00, 0x53, 0x9a, 0x07, 0xb0, 0x00, 0x53, + 0x9d, 0x41, 0xa2, 0x00, 0x53, 0x9f, 0x07, 0x6a, + 0x00, 0x53, 0xa0, 0x10, 0xe3, 0x00, 0x53, 0xa1, + 0x52, 0xf8, 0x00, 0x53, 0xa4, 0x43, 0xb7, 0x00, + 0x53, 0xa5, 0x10, 0xe5, 0x00, 0x53, 0xa6, 0x10, + 0xe4, 0x00, 0x53, 0xa8, 0x0a, 0x25, 0x00, 0x53, + 0xa9, 0x04, 0xdb, 0x00, 0x53, 0xaa, 0x4b, 0x0d, + 0x00, 0x53, 0xab, 0x38, 0x23, 0x00, 0x53, 0xad, + 0x05, 0x00, 0x00, 0x53, 0xae, 0x10, 0xe6, 0x00, + 0x53, 0xaf, 0x4b, 0x0e, 0x00, 0x53, 0xb0, 0x10, + 0xe7, 0x00, 0x53, 0xb2, 0x20, 0xd8, 0x00, 0x53, + 0xb3, 0x07, 0x6b, 0x00, 0x53, 0xb4, 0x43, 0xb8, + 0x00, 0x53, 0xb5, 0x52, 0xf9, 0x00, 0x53, 0xb6, + 0x10, 0xe8, 0x00, 0x53, 0xb7, 0x43, 0xba, 0x00, + 0x53, 0xb8, 0x52, 0xfa, 0x00, 0x53, 0xba, 0x4b, + 0x0f, 0x00, 0x53, 0xbb, 0x06, 0x88, 0x00, 0x53, + 0xbd, 0x52, 0xfb, 0x00, 0x53, 0xc0, 0x43, 0xbb, + 0x00, 0x53, 0xc1, 0x4b, 0x10, 0x00, 0x53, 0xc2, + 0x08, 0x80, 0x00, 0x53, 0xc3, 0x10, 0xe9, 0x00, + 0x53, 0xc4, 0x4b, 0x11, 0x00, 0x53, 0xc5, 0x4b, + 0x12, 0x00, 0x53, 0xc8, 0x0e, 0xa2, 0x00, 0x53, + 0xc9, 0x08, 0x25, 0x00, 0x53, 0xca, 0x06, 0x74, + 0x00, 0x53, 0xcb, 0x0f, 0x11, 0x00, 0x53, 0xcc, + 0x0a, 0xd2, 0x00, 0x53, 0xcd, 0x0d, 0x53, 0x00, + 0x53, 0xce, 0x09, 0x29, 0x00, 0x53, 0xcf, 0x52, + 0xfc, 0x00, 0x53, 0xd2, 0x52, 0xfd, 0x00, 0x53, + 0xd3, 0x52, 0xfe, 0x00, 0x53, 0xd4, 0x09, 0x51, + 0x00, 0x53, 0xd5, 0x43, 0xbf, 0x00, 0x53, 0xd6, + 0x09, 0x14, 0x00, 0x53, 0xd7, 0x09, 0x21, 0x00, + 0x53, 0xd9, 0x09, 0x80, 0x00, 0x53, 0xda, 0x38, + 0x24, 0x00, 0x53, 0xdb, 0x0d, 0x54, 0x00, 0x53, + 0xdd, 0x20, 0xd9, 0x00, 0x53, 0xde, 0x52, 0xff, + 0x00, 0x53, 0xdf, 0x10, 0xec, 0x00, 0x53, 0xe0, + 0x4b, 0x13, 0x00, 0x53, 0xe1, 0x04, 0xe5, 0x00, + 0x53, 0xe2, 0x0a, 0xd3, 0x00, 0x53, 0xe3, 0x07, + 0xb1, 0x00, 0x53, 0xe4, 0x07, 0x79, 0x00, 0x53, + 0xe5, 0x06, 0xdf, 0x00, 0x53, 0xe6, 0x38, 0x25, + 0x00, 0x53, 0xe7, 0x53, 0x01, 0x00, 0x53, 0xe8, + 0x10, 0xf0, 0x00, 0x53, 0xe9, 0x0b, 0x5f, 0x00, + 0x53, 0xea, 0x0b, 0x5e, 0x00, 0x53, 0xeb, 0x06, + 0xa3, 0x00, 0x53, 0xec, 0x09, 0x8c, 0x00, 0x53, + 0xed, 0x10, 0xf1, 0x00, 0x53, 0xee, 0x10, 0xef, + 0x00, 0x53, 0xef, 0x05, 0x44, 0x00, 0x53, 0xf0, + 0x0b, 0x46, 0x00, 0x53, 0xf1, 0x08, 0xe4, 0x00, + 0x53, 0xf2, 0x08, 0x99, 0x00, 0x53, 0xf3, 0x04, + 0xc8, 0x00, 0x53, 0xf4, 0x43, 0xc1, 0x00, 0x53, + 0xf5, 0x38, 0x26, 0x00, 0x53, 0xf6, 0x05, 0xce, + 0x00, 0x53, 0xf7, 0x07, 0xf8, 0x00, 0x53, 0xf8, + 0x08, 0x98, 0x00, 0x53, 0xfa, 0x10, 0xf2, 0x00, + 0x54, 0x01, 0x10, 0xf3, 0x00, 0x54, 0x02, 0x53, + 0x02, 0x00, 0x54, 0x03, 0x06, 0x63, 0x00, 0x54, + 0x04, 0x05, 0xa4, 0x00, 0x54, 0x08, 0x07, 0xf9, + 0x00, 0x54, 0x09, 0x06, 0x62, 0x00, 0x54, 0x0a, + 0x0b, 0xfb, 0x00, 0x54, 0x0b, 0x04, 0xc7, 0x00, + 0x54, 0x0c, 0x0c, 0x89, 0x00, 0x54, 0x0d, 0x0e, + 0xca, 0x00, 0x54, 0x0e, 0x07, 0xb3, 0x00, 0x54, + 0x0f, 0x0f, 0x63, 0x00, 0x54, 0x10, 0x0c, 0x41, + 0x00, 0x54, 0x11, 0x07, 0xb2, 0x00, 0x54, 0x12, + 0x41, 0xa3, 0x00, 0x54, 0x13, 0x4b, 0x14, 0x00, + 0x54, 0x1a, 0x53, 0x03, 0x00, 0x54, 0x1b, 0x07, + 0x05, 0x00, 0x54, 0x1d, 0x10, 0xfc, 0x00, 0x54, + 0x1e, 0x36, 0x8c, 0x00, 0x54, 0x1f, 0x06, 0xdb, + 0x00, 0x54, 0x20, 0x0e, 0x78, 0x00, 0x54, 0x21, + 0x53, 0x04, 0x00, 0x54, 0x24, 0x43, 0xc2, 0x00, + 0x54, 0x26, 0x0d, 0x71, 0x00, 0x54, 0x27, 0x38, + 0x27, 0x00, 0x54, 0x28, 0x43, 0xc3, 0x00, 0x54, + 0x29, 0x10, 0xfb, 0x00, 0x54, 0x2a, 0x4b, 0x15, + 0x00, 0x54, 0x2b, 0x06, 0x1a, 0x00, 0x54, 0x2c, + 0x10, 0xf6, 0x00, 0x54, 0x2d, 0x10, 0xf7, 0x00, + 0x54, 0x2e, 0x10, 0xf9, 0x00, 0x54, 0x2f, 0x53, + 0x05, 0x00, 0x54, 0x31, 0x4b, 0x16, 0x00, 0x54, + 0x33, 0x35, 0xc0, 0x00, 0x54, 0x34, 0x4b, 0x17, + 0x00, 0x54, 0x35, 0x4b, 0x18, 0x00, 0x54, 0x36, + 0x10, 0xfa, 0x00, 0x54, 0x38, 0x06, 0x75, 0x00, + 0x54, 0x39, 0x0a, 0x27, 0x00, 0x54, 0x3b, 0x0d, + 0xfd, 0x00, 0x54, 0x3c, 0x10, 0xf8, 0x00, 0x54, + 0x3d, 0x10, 0xf4, 0x00, 0x54, 0x3e, 0x07, 0x97, + 0x00, 0x54, 0x3f, 0x35, 0xcf, 0x00, 0x54, 0x40, + 0x10, 0xf5, 0x00, 0x54, 0x42, 0x0f, 0xca, 0x00, + 0x54, 0x43, 0x43, 0xc5, 0x00, 0x54, 0x44, 0x53, + 0x06, 0x00, 0x54, 0x46, 0x0e, 0x42, 0x00, 0x54, + 0x47, 0x53, 0x07, 0x00, 0x54, 0x48, 0x0c, 0x04, + 0x00, 0x54, 0x49, 0x07, 0x96, 0x00, 0x54, 0x4a, + 0x08, 0x02, 0x00, 0x54, 0x4c, 0x4b, 0x19, 0x00, + 0x54, 0x4d, 0x38, 0x28, 0x00, 0x54, 0x4e, 0x10, + 0xfd, 0x00, 0x54, 0x4f, 0x53, 0x08, 0x00, 0x54, + 0x51, 0x0c, 0xb5, 0x00, 0x54, 0x55, 0x37, 0x23, + 0x00, 0x54, 0x5e, 0x53, 0x09, 0x00, 0x54, 0x5f, + 0x11, 0x01, 0x00, 0x54, 0x62, 0x43, 0xc6, 0x00, + 0x54, 0x64, 0x53, 0x0a, 0x00, 0x54, 0x66, 0x38, + 0x29, 0x00, 0x54, 0x67, 0x53, 0x0b, 0x00, 0x54, + 0x68, 0x35, 0xf7, 0x00, 0x54, 0x69, 0x53, 0x0c, + 0x00, 0x54, 0x6a, 0x09, 0x22, 0x00, 0x54, 0x6b, + 0x38, 0x2a, 0x00, 0x54, 0x6c, 0x43, 0xc7, 0x00, + 0x54, 0x6d, 0x53, 0x0d, 0x00, 0x54, 0x6e, 0x53, + 0x0e, 0x00, 0x54, 0x70, 0x11, 0x04, 0x00, 0x54, + 0x71, 0x11, 0x02, 0x00, 0x54, 0x73, 0x0e, 0xaf, + 0x00, 0x54, 0x74, 0x38, 0x2b, 0x00, 0x54, 0x75, + 0x10, 0xff, 0x00, 0x54, 0x76, 0x11, 0x08, 0x00, + 0x54, 0x77, 0x11, 0x03, 0x00, 0x54, 0x7b, 0x11, + 0x06, 0x00, 0x54, 0x7c, 0x07, 0x7a, 0x00, 0x54, + 0x7d, 0x0e, 0xcb, 0x00, 0x54, 0x7f, 0x41, 0xa4, + 0x00, 0x54, 0x80, 0x11, 0x07, 0x00, 0x54, 0x81, + 0x53, 0x0f, 0x00, 0x54, 0x83, 0x53, 0x10, 0x00, + 0x54, 0x84, 0x11, 0x09, 0x00, 0x54, 0x85, 0x53, + 0x11, 0x00, 0x54, 0x86, 0x11, 0x0b, 0x00, 0x54, + 0x88, 0x41, 0xa5, 0x00, 0x54, 0x89, 0x53, 0x12, + 0x00, 0x54, 0x8a, 0x20, 0xdc, 0x00, 0x54, 0x8b, + 0x08, 0x60, 0x00, 0x54, 0x8c, 0x0f, 0xe8, 0x00, + 0x54, 0x8d, 0x38, 0x2c, 0x00, 0x54, 0x8e, 0x11, + 0x00, 0x00, 0x54, 0x8f, 0x10, 0xfe, 0x00, 0x54, + 0x90, 0x11, 0x0a, 0x00, 0x54, 0x91, 0x53, 0x13, + 0x00, 0x54, 0x92, 0x11, 0x05, 0x00, 0x54, 0x95, + 0x43, 0xc8, 0x00, 0x54, 0x96, 0x38, 0x2d, 0x00, + 0x54, 0x9c, 0x20, 0xdb, 0x00, 0x54, 0x9f, 0x53, + 0x14, 0x00, 0x54, 0xa0, 0x43, 0xc9, 0x00, 0x54, + 0xa1, 0x38, 0x2e, 0x00, 0x54, 0xa2, 0x11, 0x0d, + 0x00, 0x54, 0xa4, 0x11, 0x16, 0x00, 0x54, 0xa5, + 0x11, 0x0f, 0x00, 0x54, 0xa6, 0x43, 0xca, 0x00, + 0x54, 0xa7, 0x4b, 0x1a, 0x00, 0x54, 0xa8, 0x11, + 0x13, 0x00, 0x54, 0xa9, 0x20, 0xdd, 0x00, 0x54, + 0xaa, 0x4b, 0x1b, 0x00, 0x54, 0xab, 0x11, 0x14, + 0x00, 0x54, 0xac, 0x11, 0x10, 0x00, 0x54, 0xad, + 0x38, 0x2f, 0x00, 0x54, 0xae, 0x43, 0xcb, 0x00, + 0x54, 0xaf, 0x11, 0x31, 0x00, 0x54, 0xb1, 0x4b, + 0x1c, 0x00, 0x54, 0xb2, 0x08, 0x59, 0x00, 0x54, + 0xb3, 0x05, 0x8f, 0x00, 0x54, 0xb7, 0x43, 0xcc, + 0x00, 0x54, 0xb8, 0x11, 0x0e, 0x00, 0x54, 0xb9, + 0x38, 0x30, 0x00, 0x54, 0xba, 0x43, 0xcd, 0x00, + 0x54, 0xbb, 0x4b, 0x1d, 0x00, 0x54, 0xbc, 0x11, + 0x18, 0x00, 0x54, 0xbd, 0x04, 0xba, 0x00, 0x54, + 0xbe, 0x11, 0x17, 0x00, 0x54, 0xbf, 0x38, 0x31, + 0x00, 0x54, 0xc0, 0x04, 0x69, 0x00, 0x54, 0xc1, + 0x0d, 0xbc, 0x00, 0x54, 0xc2, 0x11, 0x15, 0x00, + 0x54, 0xc3, 0x43, 0xce, 0x00, 0x54, 0xc4, 0x11, + 0x11, 0x00, 0x54, 0xc6, 0x38, 0x32, 0x00, 0x54, + 0xc7, 0x11, 0x0c, 0x00, 0x54, 0xc8, 0x11, 0x12, + 0x00, 0x54, 0xc9, 0x08, 0x38, 0x00, 0x54, 0xca, + 0x53, 0x15, 0x00, 0x54, 0xcd, 0x38, 0x33, 0x00, + 0x54, 0xce, 0x4b, 0x1e, 0x00, 0x54, 0xd8, 0x11, + 0x19, 0x00, 0x54, 0xe0, 0x53, 0x16, 0x00, 0x54, + 0xe1, 0x04, 0xbb, 0x00, 0x54, 0xe2, 0x11, 0x22, + 0x00, 0x54, 0xe5, 0x11, 0x1a, 0x00, 0x54, 0xe6, + 0x11, 0x1b, 0x00, 0x54, 0xe8, 0x09, 0x8d, 0x00, + 0x54, 0xe9, 0x0e, 0x97, 0x00, 0x54, 0xea, 0x4b, + 0x1f, 0x00, 0x54, 0xec, 0x43, 0xd0, 0x00, 0x54, + 0xed, 0x11, 0x20, 0x00, 0x54, 0xee, 0x11, 0x1f, + 0x00, 0x54, 0xef, 0x43, 0xd1, 0x00, 0x54, 0xf1, + 0x43, 0xd2, 0x00, 0x54, 0xf2, 0x0c, 0x29, 0x00, + 0x54, 0xf3, 0x43, 0xd3, 0x00, 0x54, 0xf6, 0x53, + 0x17, 0x00, 0x54, 0xfa, 0x11, 0x21, 0x00, 0x54, + 0xfc, 0x4b, 0x20, 0x00, 0x54, 0xfd, 0x11, 0x1e, + 0x00, 0x54, 0xfe, 0x53, 0x18, 0x00, 0x54, 0xff, + 0x20, 0xde, 0x00, 0x55, 0x00, 0x43, 0xd4, 0x00, + 0x55, 0x01, 0x43, 0xd5, 0x00, 0x55, 0x04, 0x04, + 0xd6, 0x00, 0x55, 0x05, 0x4b, 0x21, 0x00, 0x55, + 0x06, 0x08, 0x26, 0x00, 0x55, 0x07, 0x09, 0xf6, + 0x00, 0x55, 0x08, 0x4b, 0x22, 0x00, 0x55, 0x09, + 0x43, 0xd6, 0x00, 0x55, 0x0c, 0x53, 0x19, 0x00, + 0x55, 0x0d, 0x53, 0x1a, 0x00, 0x55, 0x0e, 0x38, + 0x34, 0x00, 0x55, 0x0f, 0x11, 0x1c, 0x00, 0x55, + 0x10, 0x0c, 0x5c, 0x00, 0x55, 0x14, 0x11, 0x1d, + 0x00, 0x55, 0x15, 0x4b, 0x23, 0x00, 0x55, 0x16, + 0x04, 0x66, 0x00, 0x55, 0x27, 0x4b, 0x24, 0x00, + 0x55, 0x2a, 0x4b, 0x25, 0x00, 0x55, 0x2b, 0x38, + 0x35, 0x00, 0x55, 0x2e, 0x11, 0x27, 0x00, 0x55, + 0x2f, 0x0f, 0x0d, 0x00, 0x55, 0x31, 0x09, 0x8f, + 0x00, 0x55, 0x32, 0x53, 0x1b, 0x00, 0x55, 0x33, + 0x11, 0x2d, 0x00, 0x55, 0x35, 0x38, 0x36, 0x00, + 0x55, 0x36, 0x4b, 0x26, 0x00, 0x55, 0x38, 0x11, + 0x2c, 0x00, 0x55, 0x39, 0x11, 0x23, 0x00, 0x55, + 0x3b, 0x53, 0x1c, 0x00, 0x55, 0x3c, 0x43, 0xd7, + 0x00, 0x55, 0x3d, 0x53, 0x1d, 0x00, 0x55, 0x3e, + 0x0b, 0x23, 0x00, 0x55, 0x40, 0x11, 0x24, 0x00, + 0x55, 0x41, 0x43, 0xd8, 0x00, 0x55, 0x44, 0x0b, + 0x4f, 0x00, 0x55, 0x45, 0x11, 0x29, 0x00, 0x55, + 0x46, 0x09, 0x8e, 0x00, 0x55, 0x47, 0x43, 0xda, + 0x00, 0x55, 0x49, 0x53, 0x1e, 0x00, 0x55, 0x4a, + 0x38, 0x37, 0x00, 0x55, 0x4c, 0x11, 0x26, 0x00, + 0x55, 0x4d, 0x53, 0x1f, 0x00, 0x55, 0x4f, 0x0e, + 0xf0, 0x00, 0x55, 0x50, 0x41, 0xa6, 0x00, 0x55, + 0x51, 0x4b, 0x27, 0x00, 0x55, 0x53, 0x07, 0x12, + 0x00, 0x55, 0x56, 0x11, 0x2a, 0x00, 0x55, 0x57, + 0x11, 0x2b, 0x00, 0x55, 0x58, 0x53, 0x20, 0x00, + 0x55, 0x5a, 0x53, 0x21, 0x00, 0x55, 0x5b, 0x53, + 0x22, 0x00, 0x55, 0x5c, 0x11, 0x28, 0x00, 0x55, + 0x5d, 0x11, 0x2e, 0x00, 0x55, 0x5e, 0x1d, 0xd1, + 0x00, 0x55, 0x60, 0x38, 0x38, 0x00, 0x55, 0x61, + 0x4f, 0x54, 0x00, 0x55, 0x63, 0x11, 0x25, 0x00, + 0x55, 0x64, 0x43, 0xdc, 0x00, 0x55, 0x66, 0x4b, + 0x28, 0x00, 0x55, 0x7b, 0x11, 0x34, 0x00, 0x55, + 0x7c, 0x11, 0x39, 0x00, 0x55, 0x7d, 0x43, 0xde, + 0x00, 0x55, 0x7e, 0x11, 0x35, 0x00, 0x55, 0x7f, + 0x53, 0x23, 0x00, 0x55, 0x80, 0x11, 0x30, 0x00, + 0x55, 0x81, 0x41, 0xa7, 0x00, 0x55, 0x82, 0x43, + 0xdf, 0x00, 0x55, 0x83, 0x11, 0x3a, 0x00, 0x55, + 0x84, 0x0a, 0xb3, 0x00, 0x55, 0x86, 0x20, 0xdf, + 0x00, 0x55, 0x87, 0x11, 0x3c, 0x00, 0x55, 0x88, + 0x38, 0x3a, 0x00, 0x55, 0x89, 0x07, 0xb4, 0x00, + 0x55, 0x8a, 0x11, 0x32, 0x00, 0x55, 0x8b, 0x0b, + 0xbb, 0x00, 0x55, 0x8e, 0x38, 0x3b, 0x00, 0x55, + 0x8f, 0x4b, 0x29, 0x00, 0x55, 0x91, 0x43, 0xe0, + 0x00, 0x55, 0x92, 0x4b, 0x2a, 0x00, 0x55, 0x93, + 0x53, 0x24, 0x00, 0x55, 0x94, 0x4b, 0x2b, 0x00, + 0x55, 0x97, 0x53, 0x25, 0x00, 0x55, 0x98, 0x11, + 0x36, 0x00, 0x55, 0x99, 0x11, 0x2f, 0x00, 0x55, + 0x9a, 0x05, 0xe9, 0x00, 0x55, 0x9c, 0x06, 0x2a, + 0x00, 0x55, 0x9d, 0x05, 0xc3, 0x00, 0x55, 0x9e, + 0x11, 0x37, 0x00, 0x55, 0x9f, 0x11, 0x33, 0x00, + 0x55, 0xa3, 0x53, 0x26, 0x00, 0x55, 0xa4, 0x4b, + 0x2c, 0x00, 0x55, 0xa7, 0x07, 0x4c, 0x00, 0x55, + 0xa8, 0x11, 0x3d, 0x00, 0x55, 0xa9, 0x11, 0x3b, + 0x00, 0x55, 0xaa, 0x0a, 0xd5, 0x00, 0x55, 0xab, + 0x06, 0x64, 0x00, 0x55, 0xac, 0x06, 0xa4, 0x00, + 0x55, 0xad, 0x41, 0xa8, 0x00, 0x55, 0xae, 0x11, + 0x38, 0x00, 0x55, 0xb0, 0x06, 0xec, 0x00, 0x55, + 0xb2, 0x4b, 0x2d, 0x00, 0x55, 0xb6, 0x04, 0xe6, + 0x00, 0x55, 0xbf, 0x43, 0xe5, 0x00, 0x55, 0xc1, + 0x53, 0x27, 0x00, 0x55, 0xc3, 0x4b, 0x2e, 0x00, + 0x55, 0xc4, 0x11, 0x41, 0x00, 0x55, 0xc5, 0x11, + 0x3f, 0x00, 0x55, 0xc6, 0x4b, 0x2f, 0x00, 0x55, + 0xc7, 0x11, 0x78, 0x00, 0x55, 0xc9, 0x43, 0xe6, + 0x00, 0x55, 0xcb, 0x53, 0x28, 0x00, 0x55, 0xcc, + 0x43, 0xe7, 0x00, 0x55, 0xce, 0x41, 0xa9, 0x00, + 0x55, 0xd1, 0x43, 0xe8, 0x00, 0x55, 0xd2, 0x43, + 0xe2, 0x00, 0x55, 0xd3, 0x4b, 0x30, 0x00, 0x55, + 0xd4, 0x11, 0x44, 0x00, 0x55, 0xd7, 0x53, 0x29, + 0x00, 0x55, 0xd8, 0x53, 0x2a, 0x00, 0x55, 0xda, + 0x11, 0x3e, 0x00, 0x55, 0xdb, 0x4b, 0x31, 0x00, + 0x55, 0xdc, 0x11, 0x42, 0x00, 0x55, 0xdd, 0x43, + 0xe9, 0x00, 0x55, 0xde, 0x53, 0x2b, 0x00, 0x55, + 0xdf, 0x11, 0x40, 0x00, 0x55, 0xe2, 0x43, 0xeb, + 0x00, 0x55, 0xe3, 0x08, 0x9a, 0x00, 0x55, 0xe4, + 0x11, 0x43, 0x00, 0x55, 0xe9, 0x43, 0xed, 0x00, + 0x55, 0xec, 0x4b, 0x32, 0x00, 0x55, 0xee, 0x4b, + 0x33, 0x00, 0x55, 0xf1, 0x4b, 0x34, 0x00, 0x55, + 0xf6, 0x4b, 0x35, 0x00, 0x55, 0xf7, 0x11, 0x46, + 0x00, 0x55, 0xf8, 0x4b, 0x36, 0x00, 0x55, 0xf9, + 0x11, 0x4b, 0x00, 0x55, 0xfd, 0x11, 0x49, 0x00, + 0x55, 0xfe, 0x11, 0x48, 0x00, 0x55, 0xff, 0x53, + 0x2c, 0x00, 0x56, 0x05, 0x4b, 0x37, 0x00, 0x56, + 0x06, 0x34, 0x36, 0x00, 0x56, 0x07, 0x43, 0xf0, + 0x00, 0x56, 0x08, 0x38, 0x3c, 0x00, 0x56, 0x09, + 0x05, 0x45, 0x00, 0x56, 0x0a, 0x53, 0x2e, 0x00, + 0x56, 0x0d, 0x4b, 0x38, 0x00, 0x56, 0x0e, 0x38, + 0x3d, 0x00, 0x56, 0x0f, 0x38, 0x3e, 0x00, 0x56, + 0x10, 0x43, 0xf1, 0x00, 0x56, 0x11, 0x4b, 0x39, + 0x00, 0x56, 0x12, 0x4b, 0x3a, 0x00, 0x56, 0x14, + 0x11, 0x45, 0x00, 0x56, 0x16, 0x11, 0x47, 0x00, + 0x56, 0x17, 0x09, 0x90, 0x00, 0x56, 0x18, 0x04, + 0xd5, 0x00, 0x56, 0x19, 0x53, 0x2f, 0x00, 0x56, + 0x1b, 0x11, 0x4a, 0x00, 0x56, 0x20, 0x3c, 0x1d, + 0x00, 0x56, 0x28, 0x43, 0xee, 0x00, 0x56, 0x29, + 0x05, 0x5e, 0x00, 0x56, 0x2c, 0x4b, 0x3b, 0x00, + 0x56, 0x2f, 0x11, 0x55, 0x00, 0x56, 0x30, 0x43, + 0xf2, 0x00, 0x56, 0x31, 0x09, 0xe4, 0x00, 0x56, + 0x32, 0x11, 0x51, 0x00, 0x56, 0x33, 0x53, 0x30, + 0x00, 0x56, 0x34, 0x11, 0x4f, 0x00, 0x56, 0x35, + 0x4b, 0x3c, 0x00, 0x56, 0x36, 0x11, 0x50, 0x00, + 0x56, 0x37, 0x38, 0x3f, 0x00, 0x56, 0x38, 0x11, + 0x52, 0x00, 0x56, 0x39, 0x4b, 0x3d, 0x00, 0x56, + 0x3b, 0x41, 0xaa, 0x00, 0x56, 0x3c, 0x53, 0x31, + 0x00, 0x56, 0x3d, 0x43, 0xf4, 0x00, 0x56, 0x3f, + 0x38, 0x40, 0x00, 0x56, 0x40, 0x43, 0xf5, 0x00, + 0x56, 0x41, 0x53, 0x32, 0x00, 0x56, 0x42, 0x04, + 0xdf, 0x00, 0x56, 0x43, 0x53, 0x33, 0x00, 0x56, + 0x44, 0x53, 0x34, 0x00, 0x56, 0x46, 0x53, 0x35, + 0x00, 0x56, 0x47, 0x43, 0xf6, 0x00, 0x56, 0x49, + 0x38, 0x41, 0x00, 0x56, 0x4b, 0x38, 0x42, 0x00, + 0x56, 0x4c, 0x0a, 0xbb, 0x00, 0x56, 0x4d, 0x4b, + 0x3e, 0x00, 0x56, 0x4e, 0x11, 0x4c, 0x00, 0x56, + 0x4f, 0x38, 0x43, 0x00, 0x56, 0x50, 0x11, 0x4d, + 0x00, 0x56, 0x53, 0x1f, 0x1b, 0x00, 0x56, 0x54, + 0x4b, 0x3f, 0x00, 0x56, 0x5b, 0x05, 0xd8, 0x00, + 0x56, 0x5e, 0x43, 0xf7, 0x00, 0x56, 0x60, 0x43, + 0xf8, 0x00, 0x56, 0x61, 0x53, 0x36, 0x00, 0x56, + 0x62, 0x53, 0x37, 0x00, 0x56, 0x63, 0x53, 0x38, + 0x00, 0x56, 0x64, 0x11, 0x54, 0x00, 0x56, 0x66, + 0x38, 0x44, 0x00, 0x56, 0x68, 0x06, 0x2b, 0x00, + 0x56, 0x69, 0x38, 0x45, 0x00, 0x56, 0x6a, 0x11, + 0x57, 0x00, 0x56, 0x6b, 0x11, 0x53, 0x00, 0x56, + 0x6c, 0x11, 0x56, 0x00, 0x56, 0x6d, 0x43, 0xf9, + 0x00, 0x56, 0x6f, 0x38, 0x46, 0x00, 0x56, 0x71, + 0x38, 0x47, 0x00, 0x56, 0x72, 0x38, 0x48, 0x00, + 0x56, 0x74, 0x0d, 0xfe, 0x00, 0x56, 0x75, 0x53, + 0x39, 0x00, 0x56, 0x76, 0x3c, 0x33, 0x00, 0x56, + 0x78, 0x0c, 0xad, 0x00, 0x56, 0x7a, 0x0d, 0x4c, + 0x00, 0x56, 0x80, 0x11, 0x59, 0x00, 0x56, 0x84, + 0x53, 0x3a, 0x00, 0x56, 0x85, 0x4b, 0x40, 0x00, + 0x56, 0x86, 0x11, 0x58, 0x00, 0x56, 0x87, 0x05, + 0xa3, 0x00, 0x56, 0x88, 0x43, 0xfb, 0x00, 0x56, + 0x8a, 0x11, 0x5a, 0x00, 0x56, 0x8b, 0x53, 0x3b, + 0x00, 0x56, 0x8c, 0x43, 0xfc, 0x00, 0x56, 0x8f, + 0x11, 0x5d, 0x00, 0x56, 0x94, 0x11, 0x5c, 0x00, + 0x56, 0x95, 0x38, 0x49, 0x00, 0x56, 0x99, 0x1d, + 0xe6, 0x00, 0x56, 0x9a, 0x38, 0x4a, 0x00, 0x56, + 0x9d, 0x43, 0xfd, 0x00, 0x56, 0x9e, 0x41, 0xab, + 0x00, 0x56, 0x9f, 0x4b, 0x41, 0x00, 0x56, 0xa0, + 0x11, 0x5b, 0x00, 0x56, 0xa2, 0x0c, 0xef, 0x00, + 0x56, 0xa5, 0x11, 0x5e, 0x00, 0x56, 0xa6, 0x4b, + 0x42, 0x00, 0x56, 0xa7, 0x53, 0x3c, 0x00, 0x56, + 0xa8, 0x43, 0xfe, 0x00, 0x56, 0xa9, 0x41, 0xac, + 0x00, 0x56, 0xab, 0x53, 0x3d, 0x00, 0x56, 0xac, + 0x38, 0x4b, 0x00, 0x56, 0xad, 0x38, 0x4c, 0x00, + 0x56, 0xae, 0x11, 0x5f, 0x00, 0x56, 0xb1, 0x38, + 0x4d, 0x00, 0x56, 0xb2, 0x43, 0xff, 0x00, 0x56, + 0xb3, 0x41, 0xad, 0x00, 0x56, 0xb4, 0x11, 0x61, + 0x00, 0x56, 0xb6, 0x11, 0x60, 0x00, 0x56, 0xb7, + 0x4b, 0x43, 0x00, 0x56, 0xbc, 0x11, 0x63, 0x00, + 0x56, 0xbe, 0x53, 0x3e, 0x00, 0x56, 0xc0, 0x11, + 0x66, 0x00, 0x56, 0xc1, 0x11, 0x64, 0x00, 0x56, + 0xc2, 0x11, 0x62, 0x00, 0x56, 0xc3, 0x11, 0x65, + 0x00, 0x56, 0xc5, 0x44, 0x00, 0x00, 0x56, 0xc8, + 0x11, 0x67, 0x00, 0x56, 0xc9, 0x38, 0x4e, 0x00, + 0x56, 0xca, 0x1e, 0x5a, 0x00, 0x56, 0xcb, 0x53, + 0x3f, 0x00, 0x56, 0xcc, 0x4b, 0x44, 0x00, 0x56, + 0xcd, 0x44, 0x01, 0x00, 0x56, 0xce, 0x11, 0x68, + 0x00, 0x56, 0xcf, 0x4b, 0x45, 0x00, 0x56, 0xd0, + 0x53, 0x40, 0x00, 0x56, 0xd1, 0x11, 0x69, 0x00, + 0x56, 0xd3, 0x11, 0x6a, 0x00, 0x56, 0xd7, 0x11, + 0x6b, 0x00, 0x56, 0xd8, 0x10, 0x7c, 0x00, 0x56, + 0xd9, 0x4b, 0x46, 0x00, 0x56, 0xda, 0x09, 0x28, + 0x00, 0x56, 0xdb, 0x08, 0x9b, 0x00, 0x56, 0xdc, + 0x53, 0x41, 0x00, 0x56, 0xdd, 0x38, 0x4f, 0x00, + 0x56, 0xde, 0x05, 0x73, 0x00, 0x56, 0xdf, 0x44, + 0x02, 0x00, 0x56, 0xe0, 0x04, 0xbc, 0x00, 0x56, + 0xe1, 0x4b, 0x47, 0x00, 0x56, 0xe3, 0x0b, 0x82, + 0x00, 0x56, 0xe4, 0x38, 0x50, 0x00, 0x56, 0xe5, + 0x53, 0x42, 0x00, 0x56, 0xe6, 0x53, 0x43, 0x00, + 0x56, 0xe7, 0x53, 0x44, 0x00, 0x56, 0xe8, 0x44, + 0x03, 0x00, 0x56, 0xeb, 0x4b, 0x48, 0x00, 0x56, + 0xed, 0x4b, 0x49, 0x00, 0x56, 0xee, 0x11, 0x6c, + 0x00, 0x56, 0xf0, 0x08, 0x14, 0x00, 0x56, 0xf1, + 0x4b, 0x4a, 0x00, 0x56, 0xf2, 0x04, 0x93, 0x00, + 0x56, 0xf3, 0x0a, 0x24, 0x00, 0x56, 0xf6, 0x44, + 0x04, 0x00, 0x56, 0xf7, 0x44, 0x05, 0x00, 0x56, + 0xf9, 0x11, 0x6d, 0x00, 0x56, 0xfa, 0x07, 0x7b, + 0x00, 0x56, 0xfd, 0x08, 0x03, 0x00, 0x56, 0xff, + 0x11, 0x6f, 0x00, 0x57, 0x00, 0x11, 0x6e, 0x00, + 0x57, 0x01, 0x53, 0x45, 0x00, 0x57, 0x02, 0x53, + 0x46, 0x00, 0x57, 0x03, 0x0e, 0x30, 0x00, 0x57, + 0x04, 0x11, 0x70, 0x00, 0x57, 0x07, 0x4b, 0x4b, + 0x00, 0x57, 0x08, 0x11, 0x72, 0x00, 0x57, 0x09, + 0x11, 0x71, 0x00, 0x57, 0x0a, 0x38, 0x51, 0x00, + 0x57, 0x0b, 0x11, 0x73, 0x00, 0x57, 0x0c, 0x4b, + 0x4c, 0x00, 0x57, 0x0d, 0x11, 0x74, 0x00, 0x57, + 0x0f, 0x07, 0x4d, 0x00, 0x57, 0x11, 0x53, 0x47, + 0x00, 0x57, 0x12, 0x05, 0x02, 0x00, 0x57, 0x13, + 0x11, 0x75, 0x00, 0x57, 0x15, 0x38, 0x52, 0x00, + 0x57, 0x16, 0x11, 0x77, 0x00, 0x57, 0x18, 0x11, + 0x76, 0x00, 0x57, 0x1a, 0x4b, 0x4d, 0x00, 0x57, + 0x1b, 0x4b, 0x4e, 0x00, 0x57, 0x1c, 0x11, 0x79, + 0x00, 0x57, 0x1d, 0x4b, 0x4f, 0x00, 0x57, 0x1f, + 0x0c, 0x54, 0x00, 0x57, 0x20, 0x53, 0x48, 0x00, + 0x57, 0x21, 0x36, 0x80, 0x00, 0x57, 0x22, 0x53, + 0x49, 0x00, 0x57, 0x23, 0x38, 0x53, 0x00, 0x57, + 0x24, 0x53, 0x4a, 0x00, 0x57, 0x25, 0x53, 0x4b, + 0x00, 0x57, 0x26, 0x11, 0x7a, 0x00, 0x57, 0x27, + 0x04, 0x79, 0x00, 0x57, 0x28, 0x08, 0x4f, 0x00, + 0x57, 0x29, 0x44, 0x08, 0x00, 0x57, 0x2a, 0x53, + 0x4c, 0x00, 0x57, 0x2c, 0x4b, 0x50, 0x00, 0x57, + 0x2d, 0x07, 0x13, 0x00, 0x57, 0x2e, 0x4b, 0x51, + 0x00, 0x57, 0x2f, 0x38, 0x54, 0x00, 0x57, 0x30, + 0x0b, 0x8d, 0x00, 0x57, 0x33, 0x38, 0x55, 0x00, + 0x57, 0x34, 0x38, 0x56, 0x00, 0x57, 0x37, 0x11, + 0x7b, 0x00, 0x57, 0x38, 0x11, 0x7c, 0x00, 0x57, + 0x3b, 0x11, 0x7e, 0x00, 0x57, 0x3d, 0x4b, 0x52, + 0x00, 0x57, 0x3e, 0x4b, 0x53, 0x00, 0x57, 0x3f, + 0x53, 0x4d, 0x00, 0x57, 0x40, 0x11, 0x7f, 0x00, + 0x57, 0x42, 0x08, 0x54, 0x00, 0x57, 0x45, 0x44, + 0x0a, 0x00, 0x57, 0x46, 0x44, 0x0b, 0x00, 0x57, + 0x47, 0x06, 0xc9, 0x00, 0x57, 0x4a, 0x0e, 0x65, + 0x00, 0x57, 0x4c, 0x38, 0x57, 0x00, 0x57, 0x4d, + 0x44, 0x0c, 0x00, 0x57, 0x4e, 0x11, 0x7d, 0x00, + 0x57, 0x4f, 0x11, 0x80, 0x00, 0x57, 0x50, 0x08, + 0x31, 0x00, 0x57, 0x51, 0x07, 0xb5, 0x00, 0x57, + 0x52, 0x53, 0x4e, 0x00, 0x57, 0x59, 0x20, 0xe0, + 0x00, 0x57, 0x5f, 0x4b, 0x54, 0x00, 0x57, 0x61, + 0x11, 0x84, 0x00, 0x57, 0x62, 0x53, 0x4f, 0x00, + 0x57, 0x64, 0x08, 0x15, 0x00, 0x57, 0x65, 0x20, + 0xe1, 0x00, 0x57, 0x66, 0x0b, 0x71, 0x00, 0x57, + 0x67, 0x53, 0x50, 0x00, 0x57, 0x68, 0x44, 0x0e, + 0x00, 0x57, 0x69, 0x11, 0x81, 0x00, 0x57, 0x6a, + 0x0b, 0xf6, 0x00, 0x57, 0x6b, 0x4b, 0x55, 0x00, + 0x57, 0x6d, 0x4b, 0x56, 0x00, 0x57, 0x6e, 0x53, + 0x51, 0x00, 0x57, 0x6f, 0x44, 0x0f, 0x00, 0x57, + 0x70, 0x38, 0x58, 0x00, 0x57, 0x71, 0x53, 0x52, + 0x00, 0x57, 0x73, 0x44, 0x10, 0x00, 0x57, 0x74, + 0x44, 0x11, 0x00, 0x57, 0x75, 0x44, 0x12, 0x00, + 0x57, 0x77, 0x41, 0xae, 0x00, 0x57, 0x79, 0x53, + 0x53, 0x00, 0x57, 0x7a, 0x4b, 0x57, 0x00, 0x57, + 0x7b, 0x44, 0x13, 0x00, 0x57, 0x7c, 0x41, 0xaf, + 0x00, 0x57, 0x7e, 0x53, 0x54, 0x00, 0x57, 0x7f, + 0x11, 0x85, 0x00, 0x57, 0x81, 0x53, 0x55, 0x00, + 0x57, 0x82, 0x0a, 0x28, 0x00, 0x57, 0x83, 0x4b, + 0x58, 0x00, 0x57, 0x88, 0x11, 0x83, 0x00, 0x57, + 0x89, 0x11, 0x86, 0x00, 0x57, 0x8b, 0x07, 0x15, + 0x00, 0x57, 0x8c, 0x38, 0x59, 0x00, 0x57, 0x93, + 0x11, 0x87, 0x00, 0x57, 0x94, 0x53, 0x56, 0x00, + 0x57, 0x95, 0x53, 0x5a, 0x00, 0x57, 0x97, 0x4b, + 0x59, 0x00, 0x57, 0x99, 0x53, 0x57, 0x00, 0x57, + 0x9a, 0x44, 0x16, 0x00, 0x57, 0x9c, 0x38, 0x5a, + 0x00, 0x57, 0x9d, 0x44, 0x17, 0x00, 0x57, 0x9e, + 0x44, 0x18, 0x00, 0x57, 0x9f, 0x53, 0x58, 0x00, + 0x57, 0xa0, 0x11, 0x88, 0x00, 0x57, 0xa1, 0x53, + 0x59, 0x00, 0x57, 0xa2, 0x07, 0xb6, 0x00, 0x57, + 0xa3, 0x05, 0x9e, 0x00, 0x57, 0xa4, 0x11, 0x8a, + 0x00, 0x57, 0xa7, 0x53, 0x5b, 0x00, 0x57, 0xa8, + 0x44, 0x19, 0x00, 0x57, 0xa9, 0x53, 0x5c, 0x00, + 0x57, 0xaa, 0x11, 0x8b, 0x00, 0x57, 0xac, 0x20, + 0xe2, 0x00, 0x57, 0xae, 0x4b, 0x5a, 0x00, 0x57, + 0xb0, 0x11, 0x8c, 0x00, 0x57, 0xb3, 0x11, 0x89, + 0x00, 0x57, 0xb8, 0x38, 0x5b, 0x00, 0x57, 0xbd, + 0x53, 0x5d, 0x00, 0x57, 0xc0, 0x11, 0x82, 0x00, + 0x57, 0xc3, 0x11, 0x8d, 0x00, 0x57, 0xc6, 0x11, + 0x8e, 0x00, 0x57, 0xc7, 0x20, 0xe4, 0x00, 0x57, + 0xc8, 0x20, 0xe3, 0x00, 0x57, 0xcb, 0x0e, 0x92, + 0x00, 0x57, 0xcc, 0x44, 0x1c, 0x00, 0x57, 0xce, + 0x36, 0x11, 0x00, 0x57, 0xcf, 0x41, 0xb1, 0x00, + 0x57, 0xd2, 0x11, 0x90, 0x00, 0x57, 0xd3, 0x11, + 0x91, 0x00, 0x57, 0xd4, 0x11, 0x8f, 0x00, 0x57, + 0xd5, 0x4b, 0x5b, 0x00, 0x57, 0xd6, 0x11, 0x93, + 0x00, 0x57, 0xd7, 0x44, 0x1a, 0x00, 0x57, 0xdc, + 0x0c, 0xee, 0x00, 0x57, 0xdd, 0x53, 0x5e, 0x00, + 0x57, 0xde, 0x44, 0x1f, 0x00, 0x57, 0xdf, 0x04, + 0xac, 0x00, 0x57, 0xe0, 0x0d, 0xc8, 0x00, 0x57, + 0xe1, 0x53, 0x63, 0x00, 0x57, 0xe3, 0x11, 0x94, + 0x00, 0x57, 0xe4, 0x41, 0xb2, 0x00, 0x57, 0xe6, + 0x38, 0x5c, 0x00, 0x57, 0xe7, 0x4b, 0x5c, 0x00, + 0x57, 0xe9, 0x53, 0x5f, 0x00, 0x57, 0xed, 0x38, + 0x5d, 0x00, 0x57, 0xf0, 0x44, 0x20, 0x00, 0x57, + 0xf4, 0x09, 0xe5, 0x00, 0x57, 0xf5, 0x38, 0x5e, + 0x00, 0x57, 0xf6, 0x38, 0x5f, 0x00, 0x57, 0xf7, + 0x08, 0xe5, 0x00, 0x57, 0xf8, 0x44, 0x22, 0x00, + 0x57, 0xf9, 0x0d, 0x13, 0x00, 0x57, 0xfa, 0x06, + 0x2c, 0x00, 0x57, 0xfb, 0x44, 0x23, 0x00, 0x57, + 0xfc, 0x08, 0x5b, 0x00, 0x57, 0xfd, 0x44, 0x24, + 0x00, 0x57, 0xfe, 0x53, 0x60, 0x00, 0x57, 0xff, + 0x38, 0x60, 0x00, 0x58, 0x00, 0x0e, 0x87, 0x00, + 0x58, 0x02, 0x0c, 0x8a, 0x00, 0x58, 0x03, 0x53, + 0x61, 0x00, 0x58, 0x04, 0x44, 0x25, 0x00, 0x58, + 0x05, 0x07, 0x4e, 0x00, 0x58, 0x06, 0x0b, 0x2f, + 0x00, 0x58, 0x08, 0x53, 0x62, 0x00, 0x58, 0x09, + 0x38, 0x61, 0x00, 0x58, 0x0a, 0x11, 0x92, 0x00, + 0x58, 0x0b, 0x11, 0x95, 0x00, 0x58, 0x0c, 0x53, + 0x64, 0x00, 0x58, 0x0d, 0x4b, 0x5d, 0x00, 0x58, + 0x15, 0x0b, 0x24, 0x00, 0x58, 0x19, 0x11, 0x96, + 0x00, 0x58, 0x1b, 0x53, 0x65, 0x00, 0x58, 0x1d, + 0x11, 0x97, 0x00, 0x58, 0x1e, 0x44, 0x26, 0x00, + 0x58, 0x1f, 0x53, 0x66, 0x00, 0x58, 0x20, 0x38, + 0x62, 0x00, 0x58, 0x21, 0x11, 0x99, 0x00, 0x58, + 0x24, 0x0c, 0x05, 0x00, 0x58, 0x26, 0x4b, 0x5e, + 0x00, 0x58, 0x27, 0x44, 0x27, 0x00, 0x58, 0x2a, + 0x05, 0xea, 0x00, 0x58, 0x2d, 0x53, 0x67, 0x00, + 0x58, 0x2f, 0x1d, 0x32, 0x00, 0x58, 0x30, 0x05, + 0x03, 0x00, 0x58, 0x31, 0x0e, 0x43, 0x00, 0x58, + 0x32, 0x38, 0x63, 0x00, 0x58, 0x34, 0x09, 0xd4, + 0x00, 0x58, 0x35, 0x0c, 0x42, 0x00, 0x58, 0x39, + 0x44, 0x28, 0x00, 0x58, 0x3a, 0x08, 0x56, 0x00, + 0x58, 0x3d, 0x11, 0x9f, 0x00, 0x58, 0x3f, 0x53, + 0x68, 0x00, 0x58, 0x40, 0x0e, 0x0d, 0x00, 0x58, + 0x41, 0x0f, 0xa5, 0x00, 0x58, 0x49, 0x44, 0x2a, + 0x00, 0x58, 0x4a, 0x05, 0x74, 0x00, 0x58, 0x4b, + 0x11, 0x9b, 0x00, 0x58, 0x4c, 0x44, 0x2b, 0x00, + 0x58, 0x4d, 0x4b, 0x5f, 0x00, 0x58, 0x4f, 0x4b, + 0x60, 0x00, 0x58, 0x50, 0x53, 0x69, 0x00, 0x58, + 0x51, 0x0a, 0xbc, 0x00, 0x58, 0x52, 0x11, 0x9e, + 0x00, 0x58, 0x54, 0x0c, 0x5d, 0x00, 0x58, 0x55, + 0x53, 0x6a, 0x00, 0x58, 0x57, 0x0c, 0x43, 0x00, + 0x58, 0x58, 0x0c, 0x5e, 0x00, 0x58, 0x59, 0x0d, + 0x4d, 0x00, 0x58, 0x5a, 0x0b, 0xe9, 0x00, 0x58, + 0x5e, 0x08, 0x39, 0x00, 0x58, 0x5f, 0x4b, 0x61, + 0x00, 0x58, 0x61, 0x1e, 0x47, 0x00, 0x58, 0x62, + 0x11, 0x9a, 0x00, 0x58, 0x64, 0x41, 0xb3, 0x00, + 0x58, 0x67, 0x44, 0x2c, 0x00, 0x58, 0x68, 0x53, + 0x6b, 0x00, 0x58, 0x69, 0x05, 0x18, 0x00, 0x58, + 0x6b, 0x0c, 0x30, 0x00, 0x58, 0x6d, 0x4b, 0x62, + 0x00, 0x58, 0x70, 0x11, 0x9c, 0x00, 0x58, 0x72, + 0x11, 0x98, 0x00, 0x58, 0x75, 0x0a, 0x16, 0x00, + 0x58, 0x78, 0x53, 0x6c, 0x00, 0x58, 0x79, 0x11, + 0xa0, 0x00, 0x58, 0x7c, 0x38, 0x64, 0x00, 0x58, + 0x7e, 0x09, 0x58, 0x00, 0x58, 0x7f, 0x4b, 0x63, + 0x00, 0x58, 0x80, 0x38, 0x65, 0x00, 0x58, 0x81, + 0x4b, 0x64, 0x00, 0x58, 0x83, 0x06, 0xa5, 0x00, + 0x58, 0x85, 0x11, 0xa1, 0x00, 0x58, 0x87, 0x53, + 0x6d, 0x00, 0x58, 0x88, 0x53, 0x6e, 0x00, 0x58, + 0x89, 0x41, 0xb4, 0x00, 0x58, 0x8a, 0x44, 0x2d, + 0x00, 0x58, 0x8b, 0x44, 0x2e, 0x00, 0x58, 0x8c, + 0x53, 0x6f, 0x00, 0x58, 0x8d, 0x44, 0x2f, 0x00, + 0x58, 0x8f, 0x44, 0x30, 0x00, 0x58, 0x90, 0x44, + 0x31, 0x00, 0x58, 0x93, 0x0e, 0x38, 0x00, 0x58, + 0x94, 0x44, 0x32, 0x00, 0x58, 0x96, 0x53, 0x70, + 0x00, 0x58, 0x97, 0x0a, 0xff, 0x00, 0x58, 0x98, + 0x4b, 0x65, 0x00, 0x58, 0x9c, 0x0b, 0xe2, 0x00, + 0x58, 0x9d, 0x44, 0x33, 0x00, 0x58, 0x9e, 0x20, + 0xe7, 0x00, 0x58, 0x9f, 0x11, 0xa3, 0x00, 0x58, + 0xa0, 0x53, 0x71, 0x00, 0x58, 0xa1, 0x53, 0x72, + 0x00, 0x58, 0xa2, 0x53, 0x73, 0x00, 0x58, 0xa6, + 0x53, 0x74, 0x00, 0x58, 0xa8, 0x34, 0x4b, 0x00, + 0x58, 0xa9, 0x38, 0x66, 0x00, 0x58, 0xaa, 0x44, + 0x34, 0x00, 0x58, 0xab, 0x11, 0xa4, 0x00, 0x58, + 0xae, 0x11, 0xa9, 0x00, 0x58, 0xb1, 0x44, 0x35, + 0x00, 0x58, 0xb2, 0x20, 0xe8, 0x00, 0x58, 0xb3, + 0x0d, 0xff, 0x00, 0x58, 0xb8, 0x11, 0xa8, 0x00, + 0x58, 0xb9, 0x11, 0xa2, 0x00, 0x58, 0xba, 0x11, + 0xa5, 0x00, 0x58, 0xbb, 0x11, 0xa7, 0x00, 0x58, + 0xbc, 0x4b, 0x66, 0x00, 0x58, 0xbe, 0x08, 0x16, + 0x00, 0x58, 0xc1, 0x0e, 0x19, 0x00, 0x58, 0xc2, + 0x53, 0x76, 0x00, 0x58, 0xc3, 0x44, 0x37, 0x00, + 0x58, 0xc4, 0x53, 0x75, 0x00, 0x58, 0xc5, 0x11, + 0xaa, 0x00, 0x58, 0xc7, 0x0b, 0x83, 0x00, 0x58, + 0xc8, 0x53, 0x77, 0x00, 0x58, 0xca, 0x05, 0x75, + 0x00, 0x58, 0xcc, 0x09, 0xd5, 0x00, 0x58, 0xcd, + 0x44, 0x38, 0x00, 0x58, 0xce, 0x38, 0x67, 0x00, + 0x58, 0xd0, 0x38, 0x68, 0x00, 0x58, 0xd1, 0x11, + 0xac, 0x00, 0x58, 0xd2, 0x41, 0xb6, 0x00, 0x58, + 0xd3, 0x11, 0xab, 0x00, 0x58, 0xd4, 0x38, 0x69, + 0x00, 0x58, 0xd5, 0x07, 0xfa, 0x00, 0x58, 0xd6, + 0x53, 0x78, 0x00, 0x58, 0xd7, 0x11, 0xad, 0x00, + 0x58, 0xd8, 0x11, 0xaf, 0x00, 0x58, 0xd9, 0x11, + 0xae, 0x00, 0x58, 0xda, 0x38, 0x6a, 0x00, 0x58, + 0xdc, 0x11, 0xb1, 0x00, 0x58, 0xdd, 0x53, 0x79, + 0x00, 0x58, 0xde, 0x11, 0xa6, 0x00, 0x58, 0xdf, + 0x11, 0xb3, 0x00, 0x58, 0xe0, 0x41, 0xb7, 0x00, + 0x58, 0xe1, 0x53, 0x7a, 0x00, 0x58, 0xe2, 0x44, + 0x39, 0x00, 0x58, 0xe4, 0x11, 0xb2, 0x00, 0x58, + 0xe5, 0x11, 0xb0, 0x00, 0x58, 0xe9, 0x38, 0x6b, + 0x00, 0x58, 0xeb, 0x08, 0x9c, 0x00, 0x58, 0xec, + 0x0a, 0x17, 0x00, 0x58, 0xee, 0x0a, 0xd6, 0x00, + 0x58, 0xef, 0x11, 0xb4, 0x00, 0x58, 0xf0, 0x0a, + 0x60, 0x00, 0x58, 0xf1, 0x04, 0xb1, 0x00, 0x58, + 0xf2, 0x0d, 0x1a, 0x00, 0x58, 0xf3, 0x44, 0x3a, + 0x00, 0x58, 0xf4, 0x44, 0x3b, 0x00, 0x58, 0xf7, + 0x0b, 0xf7, 0x00, 0x58, 0xf9, 0x11, 0xb6, 0x00, + 0x58, 0xfa, 0x11, 0xb5, 0x00, 0x58, 0xfb, 0x11, + 0xb7, 0x00, 0x58, 0xfc, 0x11, 0xb8, 0x00, 0x58, + 0xfd, 0x11, 0xb9, 0x00, 0x59, 0x02, 0x11, 0xba, + 0x00, 0x59, 0x05, 0x44, 0x3c, 0x00, 0x59, 0x06, + 0x44, 0x3d, 0x00, 0x59, 0x09, 0x0e, 0x21, 0x00, + 0x59, 0x0a, 0x11, 0xbb, 0x00, 0x59, 0x0b, 0x20, + 0xe9, 0x00, 0x59, 0x0c, 0x38, 0x6c, 0x00, 0x59, + 0x0d, 0x44, 0x3e, 0x00, 0x59, 0x0f, 0x05, 0x46, + 0x00, 0x59, 0x10, 0x11, 0xbc, 0x00, 0x59, 0x12, + 0x53, 0x7c, 0x00, 0x59, 0x13, 0x53, 0x7d, 0x00, + 0x59, 0x14, 0x44, 0x3f, 0x00, 0x59, 0x15, 0x0f, + 0x26, 0x00, 0x59, 0x16, 0x05, 0x8e, 0x00, 0x59, + 0x18, 0x10, 0xde, 0x00, 0x59, 0x19, 0x09, 0x52, + 0x00, 0x59, 0x1a, 0x0b, 0x1f, 0x00, 0x59, 0x1b, + 0x11, 0xbd, 0x00, 0x59, 0x1c, 0x0e, 0xf7, 0x00, + 0x59, 0x1d, 0x53, 0x7e, 0x00, 0x59, 0x1f, 0x4b, + 0x67, 0x00, 0x59, 0x21, 0x53, 0x7f, 0x00, 0x59, + 0x22, 0x0e, 0xc0, 0x00, 0x59, 0x23, 0x4b, 0x68, + 0x00, 0x59, 0x24, 0x38, 0x6d, 0x00, 0x59, 0x25, + 0x11, 0xbf, 0x00, 0x59, 0x27, 0x0b, 0x47, 0x00, + 0x59, 0x28, 0x53, 0x80, 0x00, 0x59, 0x29, 0x0c, + 0x31, 0x00, 0x59, 0x2a, 0x0b, 0x20, 0x00, 0x59, + 0x2b, 0x0d, 0xc9, 0x00, 0x59, 0x2c, 0x11, 0xc0, + 0x00, 0x59, 0x2d, 0x11, 0xc1, 0x00, 0x59, 0x2e, + 0x05, 0x1d, 0x00, 0x59, 0x2f, 0x38, 0x6e, 0x00, + 0x59, 0x30, 0x53, 0x81, 0x00, 0x59, 0x31, 0x08, + 0xe6, 0x00, 0x59, 0x32, 0x11, 0xc2, 0x00, 0x59, + 0x33, 0x53, 0x82, 0x00, 0x59, 0x35, 0x53, 0x83, + 0x00, 0x59, 0x36, 0x53, 0x84, 0x00, 0x59, 0x37, + 0x04, 0x94, 0x00, 0x59, 0x38, 0x11, 0xc3, 0x00, + 0x59, 0x39, 0x37, 0x25, 0x00, 0x59, 0x3d, 0x44, + 0x42, 0x00, 0x59, 0x3e, 0x11, 0xc4, 0x00, 0x59, + 0x3f, 0x53, 0x85, 0x00, 0x59, 0x43, 0x53, 0x86, + 0x00, 0x59, 0x44, 0x05, 0x04, 0x00, 0x59, 0x46, + 0x44, 0x44, 0x00, 0x59, 0x47, 0x06, 0x2d, 0x00, + 0x59, 0x48, 0x0c, 0xb8, 0x00, 0x59, 0x49, 0x0e, + 0x44, 0x00, 0x59, 0x4e, 0x11, 0xc8, 0x00, 0x59, + 0x4f, 0x0a, 0xd7, 0x00, 0x59, 0x50, 0x11, 0xc7, + 0x00, 0x59, 0x51, 0x07, 0x16, 0x00, 0x59, 0x52, + 0x53, 0x87, 0x00, 0x59, 0x53, 0x20, 0xea, 0x00, + 0x59, 0x54, 0x0e, 0x89, 0x00, 0x59, 0x55, 0x11, + 0xc6, 0x00, 0x59, 0x57, 0x0c, 0x5f, 0x00, 0x59, + 0x58, 0x11, 0xca, 0x00, 0x59, 0x59, 0x4b, 0x69, + 0x00, 0x59, 0x5a, 0x11, 0xc9, 0x00, 0x59, 0x5b, + 0x20, 0xeb, 0x00, 0x59, 0x5d, 0x20, 0xec, 0x00, + 0x59, 0x5e, 0x53, 0x88, 0x00, 0x59, 0x5f, 0x44, + 0x47, 0x00, 0x59, 0x60, 0x11, 0xcc, 0x00, 0x59, + 0x61, 0x38, 0x6f, 0x00, 0x59, 0x62, 0x11, 0xcb, + 0x00, 0x59, 0x63, 0x20, 0xed, 0x00, 0x59, 0x65, + 0x05, 0x1e, 0x00, 0x59, 0x67, 0x11, 0xcd, 0x00, + 0x59, 0x68, 0x09, 0x91, 0x00, 0x59, 0x69, 0x11, + 0xcf, 0x00, 0x59, 0x6a, 0x0b, 0x63, 0x00, 0x59, + 0x6b, 0x53, 0x89, 0x00, 0x59, 0x6c, 0x11, 0xce, + 0x00, 0x59, 0x6d, 0x38, 0x70, 0x00, 0x59, 0x6e, + 0x0e, 0x03, 0x00, 0x59, 0x6f, 0x53, 0x8a, 0x00, + 0x59, 0x72, 0x53, 0x8b, 0x00, 0x59, 0x73, 0x09, + 0x81, 0x00, 0x59, 0x74, 0x0c, 0x55, 0x00, 0x59, + 0x75, 0x44, 0x49, 0x00, 0x59, 0x76, 0x44, 0x4a, + 0x00, 0x59, 0x78, 0x11, 0xd0, 0x00, 0x59, 0x79, + 0x4b, 0x6a, 0x00, 0x59, 0x7b, 0x53, 0x8c, 0x00, + 0x59, 0x7c, 0x44, 0x4b, 0x00, 0x59, 0x7d, 0x07, + 0xb7, 0x00, 0x59, 0x81, 0x11, 0xd1, 0x00, 0x59, + 0x82, 0x0c, 0xd7, 0x00, 0x59, 0x83, 0x0d, 0x72, + 0x00, 0x59, 0x84, 0x0e, 0xdd, 0x00, 0x59, 0x8a, + 0x0c, 0xdb, 0x00, 0x59, 0x8b, 0x41, 0xb9, 0x00, + 0x59, 0x8c, 0x53, 0x8d, 0x00, 0x59, 0x8d, 0x11, + 0xda, 0x00, 0x59, 0x8e, 0x53, 0x8e, 0x00, 0x59, + 0x92, 0x41, 0xba, 0x00, 0x59, 0x93, 0x06, 0x52, + 0x00, 0x59, 0x95, 0x53, 0x8f, 0x00, 0x59, 0x96, + 0x0f, 0x2f, 0x00, 0x59, 0x97, 0x4b, 0x6b, 0x00, + 0x59, 0x99, 0x0e, 0xbb, 0x00, 0x59, 0x9b, 0x12, + 0x39, 0x00, 0x59, 0x9d, 0x11, 0xd2, 0x00, 0x59, + 0x9f, 0x44, 0x4c, 0x00, 0x59, 0xa3, 0x11, 0xd5, + 0x00, 0x59, 0xa4, 0x20, 0xee, 0x00, 0x59, 0xa5, + 0x0b, 0x25, 0x00, 0x59, 0xa7, 0x53, 0x90, 0x00, + 0x59, 0xa8, 0x0e, 0x66, 0x00, 0x59, 0xac, 0x0c, + 0x44, 0x00, 0x59, 0xad, 0x53, 0x91, 0x00, 0x59, + 0xae, 0x44, 0x4d, 0x00, 0x59, 0xaf, 0x4b, 0x6c, + 0x00, 0x59, 0xb0, 0x53, 0x92, 0x00, 0x59, 0xb2, + 0x11, 0xd6, 0x00, 0x59, 0xb3, 0x4b, 0x6d, 0x00, + 0x59, 0xb7, 0x53, 0x93, 0x00, 0x59, 0xb9, 0x0e, + 0x93, 0x00, 0x59, 0xba, 0x20, 0xef, 0x00, 0x59, + 0xbb, 0x08, 0x3a, 0x00, 0x59, 0xbc, 0x44, 0x4e, + 0x00, 0x59, 0xbe, 0x09, 0x92, 0x00, 0x59, 0xc1, + 0x53, 0x94, 0x00, 0x59, 0xc3, 0x41, 0xbb, 0x00, + 0x59, 0xc4, 0x53, 0x95, 0x00, 0x59, 0xc6, 0x11, + 0xd7, 0x00, 0x59, 0xc8, 0x44, 0x4f, 0x00, 0x59, + 0xc9, 0x08, 0x9e, 0x00, 0x59, 0xca, 0x38, 0x71, + 0x00, 0x59, 0xcb, 0x08, 0x9d, 0x00, 0x59, 0xcd, + 0x44, 0x50, 0x00, 0x59, 0xd0, 0x04, 0x7d, 0x00, + 0x59, 0xd1, 0x07, 0x7c, 0x00, 0x59, 0xd2, 0x38, + 0x72, 0x00, 0x59, 0xd3, 0x0a, 0x4f, 0x00, 0x59, + 0xd4, 0x04, 0x95, 0x00, 0x59, 0xd9, 0x11, 0xdb, + 0x00, 0x59, 0xda, 0x11, 0xdc, 0x00, 0x59, 0xdc, + 0x11, 0xd9, 0x00, 0x59, 0xdd, 0x38, 0x73, 0x00, + 0x59, 0xde, 0x44, 0x51, 0x00, 0x59, 0xdf, 0x4b, + 0x6e, 0x00, 0x59, 0xe3, 0x38, 0x74, 0x00, 0x59, + 0xe4, 0x38, 0x75, 0x00, 0x59, 0xe5, 0x04, 0xda, + 0x00, 0x59, 0xe6, 0x05, 0xeb, 0x00, 0x59, 0xe7, + 0x44, 0x52, 0x00, 0x59, 0xe8, 0x11, 0xd8, 0x00, + 0x59, 0xea, 0x0e, 0xd1, 0x00, 0x59, 0xeb, 0x0d, + 0xa3, 0x00, 0x59, 0xec, 0x36, 0xad, 0x00, 0x59, + 0xee, 0x44, 0x53, 0x00, 0x59, 0xef, 0x53, 0x96, + 0x00, 0x59, 0xf1, 0x4b, 0x6f, 0x00, 0x59, 0xf2, + 0x53, 0x97, 0x00, 0x59, 0xf4, 0x53, 0x98, 0x00, + 0x59, 0xf6, 0x04, 0x6c, 0x00, 0x59, 0xf7, 0x53, + 0x99, 0x00, 0x59, 0xf8, 0x4b, 0x70, 0x00, 0x59, + 0xfb, 0x04, 0xbd, 0x00, 0x59, 0xff, 0x08, 0x9f, + 0x00, 0x5a, 0x00, 0x53, 0x9a, 0x00, 0x5a, 0x01, + 0x04, 0x96, 0x00, 0x5a, 0x03, 0x04, 0x67, 0x00, + 0x5a, 0x04, 0x38, 0x76, 0x00, 0x5a, 0x09, 0x11, + 0xe1, 0x00, 0x5a, 0x0c, 0x38, 0x77, 0x00, 0x5a, + 0x0d, 0x44, 0x57, 0x00, 0x5a, 0x0e, 0x53, 0x9b, + 0x00, 0x5a, 0x11, 0x11, 0xdf, 0x00, 0x5a, 0x12, + 0x53, 0x9c, 0x00, 0x5a, 0x13, 0x41, 0xbc, 0x00, + 0x5a, 0x17, 0x44, 0x58, 0x00, 0x5a, 0x18, 0x0e, + 0xc8, 0x00, 0x5a, 0x1a, 0x11, 0xe2, 0x00, 0x5a, + 0x1b, 0x35, 0xc1, 0x00, 0x5a, 0x1c, 0x11, 0xe0, + 0x00, 0x5a, 0x1e, 0x53, 0x9d, 0x00, 0x5a, 0x1f, + 0x11, 0xde, 0x00, 0x5a, 0x20, 0x09, 0xf7, 0x00, + 0x5a, 0x23, 0x38, 0x78, 0x00, 0x5a, 0x24, 0x53, + 0x9e, 0x00, 0x5a, 0x25, 0x11, 0xdd, 0x00, 0x5a, + 0x27, 0x44, 0x59, 0x00, 0x5a, 0x28, 0x53, 0x9f, + 0x00, 0x5a, 0x29, 0x0e, 0x2a, 0x00, 0x5a, 0x2a, + 0x53, 0xa0, 0x00, 0x5a, 0x2d, 0x44, 0x5a, 0x00, + 0x5a, 0x2f, 0x07, 0x98, 0x00, 0x5a, 0x30, 0x53, + 0xa1, 0x00, 0x5a, 0x35, 0x11, 0xe6, 0x00, 0x5a, + 0x36, 0x11, 0xe7, 0x00, 0x5a, 0x3c, 0x09, 0x93, + 0x00, 0x5a, 0x40, 0x11, 0xe3, 0x00, 0x5a, 0x41, + 0x0f, 0xd2, 0x00, 0x5a, 0x44, 0x53, 0xa2, 0x00, + 0x5a, 0x45, 0x53, 0xa3, 0x00, 0x5a, 0x46, 0x0d, + 0x02, 0x00, 0x5a, 0x47, 0x38, 0x79, 0x00, 0x5a, + 0x48, 0x53, 0xa4, 0x00, 0x5a, 0x49, 0x11, 0xe5, + 0x00, 0x5a, 0x4c, 0x53, 0xa5, 0x00, 0x5a, 0x50, + 0x53, 0xa6, 0x00, 0x5a, 0x55, 0x38, 0x7a, 0x00, + 0x5a, 0x5a, 0x08, 0x17, 0x00, 0x5a, 0x5e, 0x53, + 0xa7, 0x00, 0x5a, 0x62, 0x11, 0xe8, 0x00, 0x5a, + 0x63, 0x38, 0x7b, 0x00, 0x5a, 0x65, 0x44, 0x5b, + 0x00, 0x5a, 0x66, 0x0d, 0xca, 0x00, 0x5a, 0x67, + 0x41, 0xbd, 0x00, 0x5a, 0x6a, 0x11, 0xe9, 0x00, + 0x5a, 0x6c, 0x11, 0xe4, 0x00, 0x5a, 0x6d, 0x38, + 0x7c, 0x00, 0x5a, 0x77, 0x41, 0xbe, 0x00, 0x5a, + 0x7a, 0x44, 0x5c, 0x00, 0x5a, 0x7b, 0x53, 0xa8, + 0x00, 0x5a, 0x7e, 0x38, 0x7d, 0x00, 0x5a, 0x7f, + 0x0e, 0xc7, 0x00, 0x5a, 0x84, 0x41, 0xbf, 0x00, + 0x5a, 0x8b, 0x44, 0x5d, 0x00, 0x5a, 0x90, 0x53, + 0xa9, 0x00, 0x5a, 0x92, 0x0d, 0x14, 0x00, 0x5a, + 0x93, 0x53, 0xaa, 0x00, 0x5a, 0x96, 0x53, 0xab, + 0x00, 0x5a, 0x99, 0x53, 0xac, 0x00, 0x5a, 0x9a, + 0x11, 0xea, 0x00, 0x5a, 0x9b, 0x0d, 0xa4, 0x00, + 0x5a, 0x9c, 0x44, 0x5e, 0x00, 0x5a, 0x9e, 0x38, + 0x7e, 0x00, 0x5a, 0x9f, 0x44, 0x5f, 0x00, 0x5a, + 0xa0, 0x44, 0x60, 0x00, 0x5a, 0xa2, 0x44, 0x61, + 0x00, 0x5a, 0xa7, 0x38, 0x7f, 0x00, 0x5a, 0xac, + 0x38, 0x80, 0x00, 0x5a, 0xb1, 0x44, 0x62, 0x00, + 0x5a, 0xb2, 0x4b, 0x71, 0x00, 0x5a, 0xb3, 0x38, + 0x81, 0x00, 0x5a, 0xb5, 0x44, 0x63, 0x00, 0x5a, + 0xb8, 0x4b, 0x72, 0x00, 0x5a, 0xba, 0x44, 0x64, + 0x00, 0x5a, 0xbb, 0x53, 0xad, 0x00, 0x5a, 0xbc, + 0x11, 0xeb, 0x00, 0x5a, 0xbd, 0x11, 0xef, 0x00, + 0x5a, 0xbe, 0x11, 0xec, 0x00, 0x5a, 0xbf, 0x44, + 0x65, 0x00, 0x5a, 0xc1, 0x05, 0x47, 0x00, 0x5a, + 0xc2, 0x11, 0xee, 0x00, 0x5a, 0xc4, 0x41, 0xc0, + 0x00, 0x5a, 0xc6, 0x53, 0xae, 0x00, 0x5a, 0xc8, + 0x53, 0xaf, 0x00, 0x5a, 0xc9, 0x08, 0xe7, 0x00, + 0x5a, 0xcb, 0x11, 0xed, 0x00, 0x5a, 0xcc, 0x07, + 0x4f, 0x00, 0x5a, 0xcf, 0x53, 0xb0, 0x00, 0x5a, + 0xd0, 0x11, 0xfb, 0x00, 0x5a, 0xd6, 0x11, 0xf4, + 0x00, 0x5a, 0xd7, 0x11, 0xf1, 0x00, 0x5a, 0xda, + 0x44, 0x66, 0x00, 0x5a, 0xdc, 0x44, 0x67, 0x00, + 0x5a, 0xe0, 0x38, 0x82, 0x00, 0x5a, 0xe1, 0x0b, + 0xa2, 0x00, 0x5a, 0xe3, 0x11, 0xf0, 0x00, 0x5a, + 0xe5, 0x44, 0x68, 0x00, 0x5a, 0xe6, 0x11, 0xf2, + 0x00, 0x5a, 0xe9, 0x11, 0xf3, 0x00, 0x5a, 0xea, + 0x4b, 0x73, 0x00, 0x5a, 0xee, 0x44, 0x6a, 0x00, + 0x5a, 0xf0, 0x44, 0x69, 0x00, 0x5a, 0xf5, 0x44, + 0x6b, 0x00, 0x5a, 0xf6, 0x4b, 0x74, 0x00, 0x5a, + 0xfa, 0x11, 0xf5, 0x00, 0x5a, 0xfb, 0x11, 0xf6, + 0x00, 0x5a, 0xfd, 0x53, 0xb1, 0x00, 0x5b, 0x00, + 0x38, 0x83, 0x00, 0x5b, 0x01, 0x53, 0xb2, 0x00, + 0x5b, 0x08, 0x44, 0x6c, 0x00, 0x5b, 0x09, 0x06, + 0x2e, 0x00, 0x5b, 0x0b, 0x11, 0xf8, 0x00, 0x5b, + 0x0c, 0x11, 0xf7, 0x00, 0x5b, 0x16, 0x11, 0xf9, + 0x00, 0x5b, 0x17, 0x44, 0x6d, 0x00, 0x5b, 0x19, + 0x38, 0x84, 0x00, 0x5b, 0x1b, 0x4b, 0x75, 0x00, + 0x5b, 0x1d, 0x4b, 0x76, 0x00, 0x5b, 0x21, 0x4b, + 0x77, 0x00, 0x5b, 0x22, 0x09, 0xd6, 0x00, 0x5b, + 0x25, 0x38, 0x85, 0x00, 0x5b, 0x2a, 0x11, 0xfc, + 0x00, 0x5b, 0x2c, 0x0b, 0xf8, 0x00, 0x5b, 0x2d, + 0x38, 0x86, 0x00, 0x5b, 0x30, 0x04, 0xe7, 0x00, + 0x5b, 0x32, 0x11, 0xfa, 0x00, 0x5b, 0x34, 0x44, + 0x6e, 0x00, 0x5b, 0x36, 0x11, 0xfd, 0x00, 0x5b, + 0x38, 0x4b, 0x78, 0x00, 0x5b, 0x3e, 0x11, 0xfe, + 0x00, 0x5b, 0x40, 0x12, 0x01, 0x00, 0x5b, 0x41, + 0x38, 0x87, 0x00, 0x5b, 0x43, 0x11, 0xff, 0x00, + 0x5b, 0x45, 0x12, 0x00, 0x00, 0x5b, 0x4b, 0x53, + 0xb3, 0x00, 0x5b, 0x4c, 0x44, 0x6f, 0x00, 0x5b, + 0x50, 0x08, 0xa0, 0x00, 0x5b, 0x51, 0x12, 0x02, + 0x00, 0x5b, 0x52, 0x44, 0x70, 0x00, 0x5b, 0x54, + 0x07, 0xb8, 0x00, 0x5b, 0x55, 0x12, 0x03, 0x00, + 0x5b, 0x56, 0x20, 0xf0, 0x00, 0x5b, 0x57, 0x08, + 0xc8, 0x00, 0x5b, 0x58, 0x0b, 0x18, 0x00, 0x5b, + 0x5a, 0x12, 0x04, 0x00, 0x5b, 0x5b, 0x12, 0x05, + 0x00, 0x5b, 0x5c, 0x08, 0xa8, 0x00, 0x5b, 0x5d, + 0x07, 0xb9, 0x00, 0x5b, 0x5e, 0x53, 0xb4, 0x00, + 0x5b, 0x5f, 0x0e, 0xde, 0x00, 0x5b, 0x63, 0x06, + 0x42, 0x00, 0x5b, 0x64, 0x07, 0x7d, 0x00, 0x5b, + 0x65, 0x12, 0x06, 0x00, 0x5b, 0x66, 0x05, 0xb6, + 0x00, 0x5b, 0x68, 0x44, 0x71, 0x00, 0x5b, 0x69, + 0x12, 0x07, 0x00, 0x5b, 0x6b, 0x0b, 0x19, 0x00, + 0x5b, 0x6e, 0x53, 0xb5, 0x00, 0x5b, 0x6f, 0x44, + 0x72, 0x00, 0x5b, 0x70, 0x12, 0x08, 0x00, 0x5b, + 0x71, 0x12, 0x30, 0x00, 0x5b, 0x73, 0x12, 0x09, + 0x00, 0x5b, 0x75, 0x12, 0x0a, 0x00, 0x5b, 0x76, + 0x37, 0x28, 0x00, 0x5b, 0x78, 0x12, 0x0b, 0x00, + 0x5b, 0x7a, 0x12, 0x0d, 0x00, 0x5b, 0x7c, 0x38, + 0x88, 0x00, 0x5b, 0x7d, 0x41, 0xc2, 0x00, 0x5b, + 0x7e, 0x38, 0x89, 0x00, 0x5b, 0x7f, 0x38, 0x8a, + 0x00, 0x5b, 0x80, 0x12, 0x0e, 0x00, 0x5b, 0x81, + 0x44, 0x73, 0x00, 0x5b, 0x82, 0x36, 0x10, 0x00, + 0x5b, 0x83, 0x12, 0x0f, 0x00, 0x5b, 0x84, 0x44, + 0x74, 0x00, 0x5b, 0x85, 0x0b, 0x50, 0x00, 0x5b, + 0x86, 0x53, 0xb6, 0x00, 0x5b, 0x87, 0x04, 0xc9, + 0x00, 0x5b, 0x88, 0x09, 0x15, 0x00, 0x5b, 0x89, + 0x04, 0x86, 0x00, 0x5b, 0x8a, 0x38, 0x8b, 0x00, + 0x5b, 0x8b, 0x0a, 0xd9, 0x00, 0x5b, 0x8c, 0x05, + 0xec, 0x00, 0x5b, 0x8d, 0x08, 0xe1, 0x00, 0x5b, + 0x8e, 0x53, 0xb7, 0x00, 0x5b, 0x8f, 0x07, 0xba, + 0x00, 0x5b, 0x90, 0x53, 0xb8, 0x00, 0x5b, 0x91, + 0x53, 0xb9, 0x00, 0x5b, 0x93, 0x41, 0xc3, 0x00, + 0x5b, 0x94, 0x53, 0xba, 0x00, 0x5b, 0x95, 0x0c, + 0x60, 0x00, 0x5b, 0x96, 0x44, 0x76, 0x00, 0x5b, + 0x97, 0x09, 0x2b, 0x00, 0x5b, 0x98, 0x05, 0xed, + 0x00, 0x5b, 0x99, 0x0b, 0xa6, 0x00, 0x5b, 0x9a, + 0x0c, 0x06, 0x00, 0x5b, 0x9b, 0x04, 0x7c, 0x00, + 0x5b, 0x9c, 0x06, 0x53, 0x00, 0x5b, 0x9d, 0x0e, + 0x45, 0x00, 0x5b, 0x9f, 0x08, 0xee, 0x00, 0x5b, + 0xa2, 0x06, 0x6c, 0x00, 0x5b, 0xa3, 0x0a, 0x8f, + 0x00, 0x5b, 0xa4, 0x08, 0xe8, 0x00, 0x5b, 0xa5, + 0x0f, 0x12, 0x00, 0x5b, 0xa6, 0x12, 0x10, 0x00, + 0x5b, 0xa8, 0x53, 0xbb, 0x00, 0x5b, 0xa9, 0x53, + 0xbc, 0x00, 0x5b, 0xac, 0x44, 0x77, 0x00, 0x5b, + 0xad, 0x53, 0xbd, 0x00, 0x5b, 0xae, 0x06, 0x76, + 0x00, 0x5b, 0xaf, 0x53, 0xbe, 0x00, 0x5b, 0xb0, + 0x08, 0x3b, 0x00, 0x5b, 0xb1, 0x53, 0xbf, 0x00, + 0x5b, 0xb2, 0x53, 0xc0, 0x00, 0x5b, 0xb3, 0x05, + 0x90, 0x00, 0x5b, 0xb4, 0x05, 0x05, 0x00, 0x5b, + 0xb5, 0x09, 0x94, 0x00, 0x5b, 0xb6, 0x05, 0x48, + 0x00, 0x5b, 0xb7, 0x4b, 0x79, 0x00, 0x5b, 0xb8, + 0x12, 0x11, 0x00, 0x5b, 0xb9, 0x0f, 0x30, 0x00, + 0x5b, 0xba, 0x53, 0xc1, 0x00, 0x5b, 0xbc, 0x53, + 0xc2, 0x00, 0x5b, 0xbf, 0x09, 0x53, 0x00, 0x5b, + 0xc0, 0x20, 0xf1, 0x00, 0x5b, 0xc1, 0x53, 0xc3, + 0x00, 0x5b, 0xc2, 0x09, 0x10, 0x00, 0x5b, 0xc3, + 0x12, 0x12, 0x00, 0x5b, 0xc4, 0x06, 0x2f, 0x00, + 0x5b, 0xc5, 0x0c, 0xaa, 0x00, 0x5b, 0xc6, 0x0e, + 0xb5, 0x00, 0x5b, 0xc7, 0x12, 0x13, 0x00, 0x5b, + 0xc9, 0x12, 0x14, 0x00, 0x5b, 0xcc, 0x0d, 0xcb, + 0x00, 0x5b, 0xcd, 0x53, 0xc4, 0x00, 0x5b, 0xce, + 0x44, 0x7a, 0x00, 0x5b, 0xcf, 0x53, 0xc5, 0x00, + 0x5b, 0xd0, 0x12, 0x16, 0x00, 0x5b, 0xd2, 0x05, + 0xe4, 0x00, 0x5b, 0xd3, 0x06, 0xef, 0x00, 0x5b, + 0xd4, 0x12, 0x15, 0x00, 0x5b, 0xd6, 0x44, 0x7b, + 0x00, 0x5b, 0xd7, 0x4b, 0x7a, 0x00, 0x5b, 0xd8, + 0x20, 0xf3, 0x00, 0x5b, 0xd9, 0x53, 0xc6, 0x00, + 0x5b, 0xda, 0x53, 0xc7, 0x00, 0x5b, 0xdb, 0x05, + 0xee, 0x00, 0x5b, 0xdd, 0x09, 0xf8, 0x00, 0x5b, + 0xde, 0x12, 0x1a, 0x00, 0x5b, 0xdf, 0x08, 0x6f, + 0x00, 0x5b, 0xe0, 0x4b, 0x7b, 0x00, 0x5b, 0xe1, + 0x05, 0x49, 0x00, 0x5b, 0xe2, 0x12, 0x19, 0x00, + 0x5b, 0xe4, 0x12, 0x17, 0x00, 0x5b, 0xe5, 0x12, + 0x1b, 0x00, 0x5b, 0xe6, 0x12, 0x18, 0x00, 0x5b, + 0xe7, 0x36, 0x93, 0x00, 0x5b, 0xe8, 0x14, 0x8e, + 0x00, 0x5b, 0xe9, 0x09, 0xf9, 0x00, 0x5b, 0xeb, + 0x12, 0x1c, 0x00, 0x5b, 0xec, 0x4f, 0x4e, 0x00, + 0x5b, 0xee, 0x0f, 0x88, 0x00, 0x5b, 0xef, 0x53, + 0xc8, 0x00, 0x5b, 0xf0, 0x12, 0x1d, 0x00, 0x5b, + 0xf1, 0x44, 0x7e, 0x00, 0x5b, 0xf3, 0x12, 0x1f, + 0x00, 0x5b, 0xf4, 0x53, 0xc9, 0x00, 0x5b, 0xf5, + 0x0b, 0xbc, 0x00, 0x5b, 0xf6, 0x12, 0x1e, 0x00, + 0x5b, 0xf8, 0x0a, 0x47, 0x00, 0x5b, 0xfa, 0x08, + 0xc9, 0x00, 0x5b, 0xfd, 0x44, 0x7f, 0x00, 0x5b, + 0xfe, 0x0b, 0x30, 0x00, 0x5b, 0xff, 0x09, 0x23, + 0x00, 0x5c, 0x01, 0x0d, 0xe7, 0x00, 0x5c, 0x02, + 0x0a, 0x90, 0x00, 0x5c, 0x03, 0x44, 0x81, 0x00, + 0x5c, 0x04, 0x08, 0xf9, 0x00, 0x5c, 0x05, 0x12, + 0x20, 0x00, 0x5c, 0x06, 0x36, 0x08, 0x00, 0x5c, + 0x07, 0x12, 0x21, 0x00, 0x5c, 0x08, 0x12, 0x22, + 0x00, 0x5c, 0x09, 0x04, 0x97, 0x00, 0x5c, 0x0a, + 0x0b, 0x1a, 0x00, 0x5c, 0x0b, 0x0a, 0x18, 0x00, + 0x5c, 0x0c, 0x53, 0xca, 0x00, 0x5c, 0x0d, 0x12, + 0x23, 0x00, 0x5c, 0x0e, 0x0c, 0x8b, 0x00, 0x5c, + 0x0f, 0x09, 0x96, 0x00, 0x5c, 0x11, 0x09, 0x97, + 0x00, 0x5c, 0x12, 0x41, 0xc4, 0x00, 0x5c, 0x13, + 0x12, 0x24, 0x00, 0x5c, 0x14, 0x37, 0x2a, 0x00, + 0x5c, 0x16, 0x0a, 0x91, 0x00, 0x5c, 0x17, 0x53, + 0xcb, 0x00, 0x5c, 0x19, 0x36, 0x0b, 0x00, 0x5c, + 0x1a, 0x09, 0x98, 0x00, 0x5c, 0x1e, 0x20, 0xf5, + 0x00, 0x5c, 0x1f, 0x4b, 0x7c, 0x00, 0x5c, 0x20, + 0x12, 0x25, 0x00, 0x5c, 0x22, 0x12, 0x26, 0x00, + 0x5c, 0x23, 0x38, 0x8c, 0x00, 0x5c, 0x24, 0x0e, + 0xec, 0x00, 0x5c, 0x26, 0x53, 0xcc, 0x00, 0x5c, + 0x28, 0x12, 0x27, 0x00, 0x5c, 0x29, 0x44, 0x82, + 0x00, 0x5c, 0x2a, 0x4b, 0x7d, 0x00, 0x5c, 0x2b, + 0x38, 0x8d, 0x00, 0x5c, 0x2c, 0x4b, 0x7e, 0x00, + 0x5c, 0x2d, 0x06, 0xbe, 0x00, 0x5c, 0x2e, 0x53, + 0xcd, 0x00, 0x5c, 0x30, 0x38, 0x8e, 0x00, 0x5c, + 0x31, 0x09, 0x2c, 0x00, 0x5c, 0x32, 0x53, 0xce, + 0x00, 0x5c, 0x35, 0x53, 0xcf, 0x00, 0x5c, 0x36, + 0x4b, 0x7f, 0x00, 0x5c, 0x38, 0x12, 0x28, 0x00, + 0x5c, 0x39, 0x12, 0x29, 0x00, 0x5c, 0x3a, 0x09, + 0x08, 0x00, 0x5c, 0x3b, 0x09, 0xf2, 0x00, 0x5c, + 0x3c, 0x0c, 0xcc, 0x00, 0x5c, 0x3d, 0x0a, 0x1a, + 0x00, 0x5c, 0x3e, 0x0d, 0x8c, 0x00, 0x5c, 0x3f, + 0x0c, 0xd8, 0x00, 0x5c, 0x40, 0x06, 0xc1, 0x00, + 0x5c, 0x41, 0x12, 0x2a, 0x00, 0x5c, 0x45, 0x06, + 0x89, 0x00, 0x5c, 0x46, 0x12, 0x2b, 0x00, 0x5c, + 0x48, 0x06, 0xf6, 0x00, 0x5c, 0x4a, 0x0c, 0xa7, + 0x00, 0x5c, 0x4b, 0x05, 0x30, 0x00, 0x5c, 0x4d, + 0x08, 0xa1, 0x00, 0x5c, 0x4e, 0x12, 0x2c, 0x00, + 0x5c, 0x4f, 0x12, 0x2f, 0x00, 0x5c, 0x50, 0x12, + 0x2e, 0x00, 0x5c, 0x51, 0x06, 0xf5, 0x00, 0x5c, + 0x53, 0x12, 0x2d, 0x00, 0x5c, 0x55, 0x0c, 0x32, + 0x00, 0x5c, 0x59, 0x4b, 0x80, 0x00, 0x5c, 0x5a, + 0x53, 0xd0, 0x00, 0x5c, 0x5b, 0x1e, 0x92, 0x00, + 0x5c, 0x5c, 0x4b, 0x81, 0x00, 0x5c, 0x5e, 0x0b, + 0x10, 0x00, 0x5c, 0x5f, 0x44, 0x84, 0x00, 0x5c, + 0x60, 0x0c, 0x45, 0x00, 0x5c, 0x61, 0x08, 0xf4, + 0x00, 0x5c, 0x62, 0x1e, 0x0d, 0x00, 0x5c, 0x63, + 0x38, 0x8f, 0x00, 0x5c, 0x64, 0x0a, 0xda, 0x00, + 0x5c, 0x65, 0x0f, 0x64, 0x00, 0x5c, 0x67, 0x44, + 0x85, 0x00, 0x5c, 0x68, 0x44, 0x86, 0x00, 0x5c, + 0x69, 0x38, 0x90, 0x00, 0x5c, 0x6c, 0x12, 0x31, + 0x00, 0x5c, 0x6d, 0x4b, 0x82, 0x00, 0x5c, 0x6e, + 0x41, 0xc5, 0x00, 0x5c, 0x6f, 0x0c, 0xae, 0x00, + 0x5c, 0x70, 0x44, 0x87, 0x00, 0x5c, 0x71, 0x08, + 0x81, 0x00, 0x5c, 0x74, 0x53, 0xd1, 0x00, 0x5c, + 0x75, 0x53, 0xd2, 0x00, 0x5c, 0x76, 0x12, 0x34, + 0x00, 0x5c, 0x79, 0x12, 0x35, 0x00, 0x5c, 0x7a, + 0x41, 0xc7, 0x00, 0x5c, 0x7b, 0x53, 0xd3, 0x00, + 0x5c, 0x7c, 0x38, 0x91, 0x00, 0x5c, 0x7d, 0x53, + 0xd4, 0x00, 0x5c, 0x87, 0x53, 0xd5, 0x00, 0x5c, + 0x88, 0x44, 0x8c, 0x00, 0x5c, 0x8a, 0x44, 0x8d, + 0x00, 0x5c, 0x8c, 0x12, 0x36, 0x00, 0x5c, 0x8f, + 0x41, 0xc8, 0x00, 0x5c, 0x90, 0x06, 0x30, 0x00, + 0x5c, 0x91, 0x12, 0x37, 0x00, 0x5c, 0x92, 0x53, + 0xd6, 0x00, 0x5c, 0x94, 0x12, 0x38, 0x00, 0x5c, + 0x9d, 0x53, 0xd7, 0x00, 0x5c, 0x9f, 0x41, 0xc9, + 0x00, 0x5c, 0xa0, 0x44, 0x91, 0x00, 0x5c, 0xa1, + 0x05, 0x2c, 0x00, 0x5c, 0xa2, 0x44, 0x92, 0x00, + 0x5c, 0xa3, 0x41, 0xca, 0x00, 0x5c, 0xa6, 0x20, + 0xf6, 0x00, 0x5c, 0xa7, 0x44, 0x93, 0x00, 0x5c, + 0xa8, 0x0a, 0xbd, 0x00, 0x5c, 0xa9, 0x06, 0x20, + 0x00, 0x5c, 0xaa, 0x41, 0xcb, 0x00, 0x5c, 0xab, + 0x12, 0x3a, 0x00, 0x5c, 0xac, 0x0e, 0xb4, 0x00, + 0x5c, 0xad, 0x44, 0x95, 0x00, 0x5c, 0xb1, 0x0b, + 0x32, 0x00, 0x5c, 0xb2, 0x53, 0xd8, 0x00, 0x5c, + 0xb3, 0x05, 0xb7, 0x00, 0x5c, 0xb4, 0x53, 0xd9, + 0x00, 0x5c, 0xb5, 0x44, 0x96, 0x00, 0x5c, 0xb6, + 0x12, 0x3c, 0x00, 0x5c, 0xb7, 0x12, 0x3e, 0x00, + 0x5c, 0xb8, 0x06, 0x1b, 0x00, 0x5c, 0xba, 0x20, + 0xf7, 0x00, 0x5c, 0xbb, 0x12, 0x3b, 0x00, 0x5c, + 0xbc, 0x12, 0x3d, 0x00, 0x5c, 0xbe, 0x12, 0x40, + 0x00, 0x5c, 0xc5, 0x12, 0x3f, 0x00, 0x5c, 0xc7, + 0x12, 0x41, 0x00, 0x5c, 0xc9, 0x44, 0x98, 0x00, + 0x5c, 0xcb, 0x38, 0x92, 0x00, 0x5c, 0xd0, 0x41, + 0xcc, 0x00, 0x5c, 0xd2, 0x38, 0x93, 0x00, 0x5c, + 0xd7, 0x53, 0xda, 0x00, 0x5c, 0xd9, 0x12, 0x42, + 0x00, 0x5c, 0xdd, 0x4b, 0x83, 0x00, 0x5c, 0xe0, + 0x0c, 0x95, 0x00, 0x5c, 0xe1, 0x06, 0xa6, 0x00, + 0x5c, 0xe6, 0x37, 0x2c, 0x00, 0x5c, 0xe8, 0x05, + 0x65, 0x00, 0x5c, 0xe9, 0x12, 0x43, 0x00, 0x5c, + 0xea, 0x12, 0x48, 0x00, 0x5c, 0xed, 0x12, 0x46, + 0x00, 0x5c, 0xee, 0x53, 0xdb, 0x00, 0x5c, 0xef, + 0x0e, 0x47, 0x00, 0x5c, 0xf0, 0x0e, 0x46, 0x00, + 0x5c, 0xf1, 0x53, 0xdc, 0x00, 0x5c, 0xf2, 0x53, + 0xdd, 0x00, 0x5c, 0xf4, 0x38, 0x94, 0x00, 0x5c, + 0xf5, 0x20, 0xf8, 0x00, 0x5c, 0xf6, 0x0c, 0x61, + 0x00, 0x5c, 0xfa, 0x12, 0x45, 0x00, 0x5c, 0xfb, + 0x09, 0x5e, 0x00, 0x5c, 0xfd, 0x12, 0x44, 0x00, + 0x5d, 0x01, 0x4b, 0x84, 0x00, 0x5d, 0x06, 0x44, + 0x9b, 0x00, 0x5d, 0x07, 0x0a, 0x38, 0x00, 0x5d, + 0x0b, 0x12, 0x49, 0x00, 0x5d, 0x0d, 0x41, 0xce, + 0x00, 0x5d, 0x0e, 0x08, 0x5a, 0x00, 0x5d, 0x10, + 0x44, 0x9c, 0x00, 0x5d, 0x11, 0x12, 0x4f, 0x00, + 0x5d, 0x12, 0x53, 0xde, 0x00, 0x5d, 0x14, 0x12, + 0x50, 0x00, 0x5d, 0x15, 0x12, 0x4a, 0x00, 0x5d, + 0x16, 0x05, 0x91, 0x00, 0x5d, 0x17, 0x12, 0x4b, + 0x00, 0x5d, 0x18, 0x12, 0x54, 0x00, 0x5d, 0x19, + 0x12, 0x53, 0x00, 0x5d, 0x1a, 0x12, 0x52, 0x00, + 0x5d, 0x1b, 0x12, 0x4e, 0x00, 0x5d, 0x1d, 0x44, + 0x9e, 0x00, 0x5d, 0x1f, 0x12, 0x4d, 0x00, 0x5d, + 0x20, 0x44, 0x9f, 0x00, 0x5d, 0x22, 0x12, 0x51, + 0x00, 0x5d, 0x23, 0x53, 0xdf, 0x00, 0x5d, 0x24, + 0x38, 0x95, 0x00, 0x5d, 0x26, 0x38, 0x96, 0x00, + 0x5d, 0x27, 0x20, 0xf9, 0x00, 0x5d, 0x29, 0x0e, + 0x48, 0x00, 0x5d, 0x2b, 0x44, 0x9d, 0x00, 0x5d, + 0x31, 0x44, 0xa0, 0x00, 0x5d, 0x34, 0x4b, 0x85, + 0x00, 0x5d, 0x39, 0x44, 0xa1, 0x00, 0x5d, 0x3d, + 0x4b, 0x86, 0x00, 0x5d, 0x3f, 0x53, 0xe0, 0x00, + 0x5d, 0x42, 0x20, 0xfc, 0x00, 0x5d, 0x43, 0x38, + 0x97, 0x00, 0x5d, 0x46, 0x38, 0x98, 0x00, 0x5d, + 0x47, 0x41, 0xcf, 0x00, 0x5d, 0x48, 0x53, 0xe1, + 0x00, 0x5d, 0x4a, 0x38, 0x99, 0x00, 0x5d, 0x4b, + 0x12, 0x58, 0x00, 0x5d, 0x4c, 0x12, 0x55, 0x00, + 0x5d, 0x4e, 0x12, 0x57, 0x00, 0x5d, 0x50, 0x0f, + 0x5c, 0x00, 0x5d, 0x51, 0x53, 0xe3, 0x00, 0x5d, + 0x52, 0x12, 0x56, 0x00, 0x5d, 0x53, 0x20, 0xfa, + 0x00, 0x5d, 0x55, 0x53, 0xe2, 0x00, 0x5d, 0x59, + 0x4b, 0x87, 0x00, 0x5d, 0x5c, 0x12, 0x4c, 0x00, + 0x5d, 0x5f, 0x53, 0xe4, 0x00, 0x5d, 0x60, 0x53, + 0xe5, 0x00, 0x5d, 0x61, 0x44, 0xa3, 0x00, 0x5d, + 0x62, 0x53, 0xe6, 0x00, 0x5d, 0x64, 0x53, 0xe7, + 0x00, 0x5d, 0x69, 0x0a, 0x39, 0x00, 0x5d, 0x6a, + 0x44, 0xa4, 0x00, 0x5d, 0x6c, 0x12, 0x59, 0x00, + 0x5d, 0x6d, 0x20, 0xfd, 0x00, 0x5d, 0x6f, 0x08, + 0x27, 0x00, 0x5d, 0x70, 0x44, 0xa6, 0x00, 0x5d, + 0x73, 0x12, 0x5a, 0x00, 0x5d, 0x76, 0x12, 0x5b, + 0x00, 0x5d, 0x79, 0x53, 0xe8, 0x00, 0x5d, 0x7a, + 0x53, 0xe9, 0x00, 0x5d, 0x7e, 0x4b, 0x88, 0x00, + 0x5d, 0x7f, 0x53, 0xea, 0x00, 0x5d, 0x81, 0x41, + 0xd0, 0x00, 0x5d, 0x82, 0x12, 0x5e, 0x00, 0x5d, + 0x83, 0x4b, 0x89, 0x00, 0x5d, 0x84, 0x12, 0x5d, + 0x00, 0x5d, 0x87, 0x12, 0x5c, 0x00, 0x5d, 0x88, + 0x44, 0xa9, 0x00, 0x5d, 0x8a, 0x53, 0xeb, 0x00, + 0x5d, 0x8b, 0x0c, 0x62, 0x00, 0x5d, 0x8c, 0x12, + 0x47, 0x00, 0x5d, 0x90, 0x12, 0x64, 0x00, 0x5d, + 0x92, 0x38, 0x9a, 0x00, 0x5d, 0x93, 0x53, 0xec, + 0x00, 0x5d, 0x94, 0x38, 0x9b, 0x00, 0x5d, 0x95, + 0x53, 0xed, 0x00, 0x5d, 0x97, 0x44, 0xab, 0x00, + 0x5d, 0x99, 0x38, 0x9c, 0x00, 0x5d, 0x9b, 0x53, + 0xee, 0x00, 0x5d, 0x9d, 0x12, 0x60, 0x00, 0x5d, + 0x9f, 0x53, 0xef, 0x00, 0x5d, 0xa0, 0x38, 0x9d, + 0x00, 0x5d, 0xa2, 0x12, 0x5f, 0x00, 0x5d, 0xa4, + 0x41, 0xd1, 0x00, 0x5d, 0xa7, 0x41, 0xd2, 0x00, + 0x5d, 0xab, 0x53, 0xf0, 0x00, 0x5d, 0xac, 0x12, + 0x61, 0x00, 0x5d, 0xae, 0x12, 0x62, 0x00, 0x5d, + 0xb0, 0x44, 0xac, 0x00, 0x5d, 0xb2, 0x3b, 0xa5, + 0x00, 0x5d, 0xb4, 0x44, 0xad, 0x00, 0x5d, 0xb7, + 0x12, 0x65, 0x00, 0x5d, 0xb8, 0x20, 0xfe, 0x00, + 0x5d, 0xb9, 0x20, 0xff, 0x00, 0x5d, 0xba, 0x0f, + 0xae, 0x00, 0x5d, 0xbc, 0x12, 0x66, 0x00, 0x5d, + 0xbd, 0x12, 0x63, 0x00, 0x5d, 0xc3, 0x53, 0xf1, + 0x00, 0x5d, 0xc7, 0x4b, 0x8a, 0x00, 0x5d, 0xc9, + 0x12, 0x67, 0x00, 0x5d, 0xcb, 0x41, 0xd3, 0x00, + 0x5d, 0xcc, 0x06, 0x1c, 0x00, 0x5d, 0xcd, 0x12, + 0x68, 0x00, 0x5d, 0xce, 0x53, 0xf2, 0x00, 0x5d, + 0xd0, 0x21, 0x00, 0x00, 0x5d, 0xd1, 0x44, 0xaf, + 0x00, 0x5d, 0xd2, 0x12, 0x6a, 0x00, 0x5d, 0xd3, + 0x12, 0x69, 0x00, 0x5d, 0xd6, 0x12, 0x6b, 0x00, + 0x5d, 0xd7, 0x44, 0xb0, 0x00, 0x5d, 0xd8, 0x38, + 0x9e, 0x00, 0x5d, 0xd9, 0x53, 0xf3, 0x00, 0x5d, + 0xdb, 0x12, 0x6c, 0x00, 0x5d, 0xdd, 0x0a, 0x92, + 0x00, 0x5d, 0xde, 0x09, 0x2d, 0x00, 0x5d, 0xe0, + 0x38, 0x9f, 0x00, 0x5d, 0xe1, 0x09, 0x6e, 0x00, + 0x5d, 0xe2, 0x34, 0x32, 0x00, 0x5d, 0xe3, 0x0a, + 0xe5, 0x00, 0x5d, 0xe4, 0x44, 0xb2, 0x00, 0x5d, + 0xe5, 0x07, 0xbb, 0x00, 0x5d, 0xe6, 0x08, 0x28, + 0x00, 0x5d, 0xe7, 0x07, 0xbc, 0x00, 0x5d, 0xe8, + 0x06, 0x8a, 0x00, 0x5d, 0xe9, 0x44, 0xb3, 0x00, + 0x5d, 0xeb, 0x12, 0x6d, 0x00, 0x5d, 0xee, 0x08, + 0x29, 0x00, 0x5d, 0xf1, 0x07, 0x7e, 0x00, 0x5d, + 0xf2, 0x12, 0x6e, 0x00, 0x5d, 0xf3, 0x0e, 0xb2, + 0x00, 0x5d, 0xf4, 0x0c, 0xf9, 0x00, 0x5d, 0xf5, + 0x12, 0x6f, 0x00, 0x5d, 0xf7, 0x07, 0xbd, 0x00, + 0x5d, 0xf8, 0x38, 0xa0, 0x00, 0x5d, 0xf9, 0x4b, + 0x8b, 0x00, 0x5d, 0xfb, 0x05, 0xe8, 0x00, 0x5d, + 0xfd, 0x1e, 0x36, 0x00, 0x5d, 0xfe, 0x06, 0xca, + 0x00, 0x5d, 0xff, 0x35, 0xe2, 0x00, 0x5e, 0x00, + 0x38, 0xa1, 0x00, 0x5e, 0x02, 0x08, 0xa2, 0x00, + 0x5e, 0x03, 0x0d, 0xcd, 0x00, 0x5e, 0x06, 0x0d, + 0x55, 0x00, 0x5e, 0x07, 0x53, 0xf4, 0x00, 0x5e, + 0x0b, 0x12, 0x70, 0x00, 0x5e, 0x0c, 0x06, 0x31, + 0x00, 0x5e, 0x0d, 0x53, 0xf5, 0x00, 0x5e, 0x11, + 0x12, 0x73, 0x00, 0x5e, 0x12, 0x38, 0xa2, 0x00, + 0x5e, 0x14, 0x38, 0xa3, 0x00, 0x5e, 0x15, 0x38, + 0xa4, 0x00, 0x5e, 0x16, 0x0b, 0xbd, 0x00, 0x5e, + 0x18, 0x38, 0xa5, 0x00, 0x5e, 0x19, 0x12, 0x72, + 0x00, 0x5e, 0x1a, 0x12, 0x71, 0x00, 0x5e, 0x1b, + 0x12, 0x74, 0x00, 0x5e, 0x1d, 0x0c, 0x07, 0x00, + 0x5e, 0x1f, 0x44, 0xb7, 0x00, 0x5e, 0x20, 0x53, + 0xf6, 0x00, 0x5e, 0x25, 0x0a, 0x29, 0x00, 0x5e, + 0x28, 0x4b, 0x8c, 0x00, 0x5e, 0x2b, 0x08, 0xa3, + 0x00, 0x5e, 0x2d, 0x0a, 0x6e, 0x00, 0x5e, 0x2e, + 0x38, 0xa6, 0x00, 0x5e, 0x2f, 0x0b, 0x33, 0x00, + 0x5e, 0x30, 0x06, 0x3c, 0x00, 0x5e, 0x32, 0x4b, + 0x8d, 0x00, 0x5e, 0x33, 0x0b, 0xbe, 0x00, 0x5e, + 0x35, 0x4b, 0x8e, 0x00, 0x5e, 0x36, 0x12, 0x75, + 0x00, 0x5e, 0x37, 0x12, 0x76, 0x00, 0x5e, 0x38, + 0x09, 0xd7, 0x00, 0x5e, 0x3d, 0x0e, 0x67, 0x00, + 0x5e, 0x3e, 0x44, 0xb8, 0x00, 0x5e, 0x40, 0x12, + 0x79, 0x00, 0x5e, 0x43, 0x12, 0x78, 0x00, 0x5e, + 0x44, 0x12, 0x77, 0x00, 0x5e, 0x45, 0x0d, 0xef, + 0x00, 0x5e, 0x47, 0x12, 0x80, 0x00, 0x5e, 0x49, + 0x44, 0xb9, 0x00, 0x5e, 0x4b, 0x53, 0xf7, 0x00, + 0x5e, 0x4c, 0x0e, 0x88, 0x00, 0x5e, 0x4e, 0x12, + 0x7a, 0x00, 0x5e, 0x50, 0x53, 0xf8, 0x00, 0x5e, + 0x51, 0x53, 0xf9, 0x00, 0x5e, 0x54, 0x12, 0x7c, + 0x00, 0x5e, 0x55, 0x0e, 0x99, 0x00, 0x5e, 0x56, + 0x44, 0xbb, 0x00, 0x5e, 0x57, 0x12, 0x7b, 0x00, + 0x5e, 0x58, 0x38, 0xa7, 0x00, 0x5e, 0x5b, 0x4b, + 0x8f, 0x00, 0x5e, 0x5c, 0x53, 0xfa, 0x00, 0x5e, + 0x5e, 0x41, 0xd4, 0x00, 0x5e, 0x5f, 0x12, 0x7d, + 0x00, 0x5e, 0x61, 0x0d, 0x3c, 0x00, 0x5e, 0x62, + 0x12, 0x7e, 0x00, 0x5e, 0x63, 0x0e, 0x0e, 0x00, + 0x5e, 0x64, 0x12, 0x7f, 0x00, 0x5e, 0x68, 0x4b, + 0x90, 0x00, 0x5e, 0x6a, 0x4b, 0x91, 0x00, 0x5e, + 0x6b, 0x38, 0xa8, 0x00, 0x5e, 0x6c, 0x38, 0xa9, + 0x00, 0x5e, 0x6d, 0x44, 0xbd, 0x00, 0x5e, 0x6e, + 0x44, 0xbe, 0x00, 0x5e, 0x70, 0x53, 0xfb, 0x00, + 0x5e, 0x72, 0x05, 0xef, 0x00, 0x5e, 0x73, 0x0e, + 0x0f, 0x00, 0x5e, 0x74, 0x0c, 0xe5, 0x00, 0x5e, + 0x75, 0x12, 0x81, 0x00, 0x5e, 0x76, 0x12, 0x82, + 0x00, 0x5e, 0x77, 0x4b, 0x92, 0x00, 0x5e, 0x78, + 0x07, 0xbe, 0x00, 0x5e, 0x79, 0x05, 0xf0, 0x00, + 0x5e, 0x7a, 0x12, 0x83, 0x00, 0x5e, 0x7b, 0x07, + 0x6c, 0x00, 0x5e, 0x7c, 0x0f, 0x2e, 0x00, 0x5e, + 0x7d, 0x0f, 0x13, 0x00, 0x5e, 0x7e, 0x06, 0x32, + 0x00, 0x5e, 0x7f, 0x12, 0x85, 0x00, 0x5e, 0x80, + 0x4b, 0x93, 0x00, 0x5e, 0x81, 0x0b, 0xbf, 0x00, + 0x5e, 0x83, 0x07, 0xbf, 0x00, 0x5e, 0x84, 0x09, + 0x99, 0x00, 0x5e, 0x87, 0x0d, 0x73, 0x00, 0x5e, + 0x8a, 0x09, 0x9a, 0x00, 0x5e, 0x8b, 0x4b, 0x94, + 0x00, 0x5e, 0x8e, 0x53, 0xfc, 0x00, 0x5e, 0x8f, + 0x09, 0x82, 0x00, 0x5e, 0x95, 0x0c, 0x08, 0x00, + 0x5e, 0x96, 0x0e, 0x49, 0x00, 0x5e, 0x97, 0x0c, + 0x33, 0x00, 0x5e, 0x99, 0x36, 0xb0, 0x00, 0x5e, + 0x9a, 0x07, 0xc0, 0x00, 0x5e, 0x9c, 0x0d, 0xce, + 0x00, 0x5e, 0xa0, 0x12, 0x86, 0x00, 0x5e, 0xa2, + 0x53, 0xfd, 0x00, 0x5e, 0xa4, 0x53, 0xfe, 0x00, + 0x5e, 0xa5, 0x44, 0xc0, 0x00, 0x5e, 0xa6, 0x0c, + 0x53, 0x00, 0x5e, 0xa7, 0x08, 0x32, 0x00, 0x5e, + 0xa8, 0x38, 0xaa, 0x00, 0x5e, 0xaa, 0x38, 0xab, + 0x00, 0x5e, 0xab, 0x07, 0x7f, 0x00, 0x5e, 0xac, + 0x44, 0xc1, 0x00, 0x5e, 0xad, 0x0c, 0x09, 0x00, + 0x5e, 0xb1, 0x53, 0xff, 0x00, 0x5e, 0xb3, 0x4b, + 0x95, 0x00, 0x5e, 0xb5, 0x04, 0x87, 0x00, 0x5e, + 0xb6, 0x09, 0x78, 0x00, 0x5e, 0xb7, 0x07, 0xc1, + 0x00, 0x5e, 0xb8, 0x0f, 0x31, 0x00, 0x5e, 0xb9, + 0x44, 0xc2, 0x00, 0x5e, 0xbd, 0x4b, 0x96, 0x00, + 0x5e, 0xbe, 0x38, 0xac, 0x00, 0x5e, 0xbf, 0x38, + 0xad, 0x00, 0x5e, 0xc1, 0x12, 0x87, 0x00, 0x5e, + 0xc2, 0x12, 0x88, 0x00, 0x5e, 0xc3, 0x0d, 0x07, + 0x00, 0x5e, 0xc6, 0x44, 0xc3, 0x00, 0x5e, 0xc8, + 0x12, 0x89, 0x00, 0x5e, 0xc9, 0x37, 0x0f, 0x00, + 0x5e, 0xca, 0x0f, 0xd3, 0x00, 0x5e, 0xcb, 0x3c, + 0x1e, 0x00, 0x5e, 0xcc, 0x54, 0x00, 0x00, 0x5e, + 0xce, 0x54, 0x01, 0x00, 0x5e, 0xcf, 0x12, 0x8b, + 0x00, 0x5e, 0xd0, 0x12, 0x8a, 0x00, 0x5e, 0xd1, + 0x4b, 0x97, 0x00, 0x5e, 0xd2, 0x38, 0xaf, 0x00, + 0x5e, 0xd3, 0x05, 0xa5, 0x00, 0x5e, 0xd4, 0x4b, + 0x98, 0x00, 0x5e, 0xd5, 0x4b, 0x99, 0x00, 0x5e, + 0xd6, 0x12, 0x8c, 0x00, 0x5e, 0xd9, 0x44, 0xc4, + 0x00, 0x5e, 0xda, 0x12, 0x8f, 0x00, 0x5e, 0xdb, + 0x12, 0x90, 0x00, 0x5e, 0xdc, 0x54, 0x02, 0x00, + 0x5e, 0xdd, 0x12, 0x8e, 0x00, 0x5e, 0xde, 0x54, + 0x03, 0x00, 0x5e, 0xdf, 0x0d, 0xb2, 0x00, 0x5e, + 0xe0, 0x09, 0x9b, 0x00, 0x5e, 0xe1, 0x12, 0x92, + 0x00, 0x5e, 0xe2, 0x12, 0x91, 0x00, 0x5e, 0xe3, + 0x12, 0x8d, 0x00, 0x5e, 0xe5, 0x54, 0x04, 0x00, + 0x5e, 0xe8, 0x12, 0x93, 0x00, 0x5e, 0xe9, 0x12, + 0x94, 0x00, 0x5e, 0xeb, 0x54, 0x05, 0x00, 0x5e, + 0xec, 0x12, 0x95, 0x00, 0x5e, 0xf0, 0x12, 0x98, + 0x00, 0x5e, 0xf1, 0x12, 0x96, 0x00, 0x5e, 0xf3, + 0x12, 0x97, 0x00, 0x5e, 0xf4, 0x12, 0x99, 0x00, + 0x5e, 0xf6, 0x05, 0x06, 0x00, 0x5e, 0xf7, 0x0c, + 0x0a, 0x00, 0x5e, 0xf8, 0x12, 0x9a, 0x00, 0x5e, + 0xf9, 0x41, 0xd5, 0x00, 0x5e, 0xfa, 0x07, 0x50, + 0x00, 0x5e, 0xfb, 0x05, 0x76, 0x00, 0x5e, 0xfc, + 0x0c, 0xec, 0x00, 0x5e, 0xfd, 0x44, 0xc6, 0x00, + 0x5e, 0xfe, 0x12, 0x9b, 0x00, 0x5e, 0xff, 0x0c, + 0xd3, 0x00, 0x5f, 0x00, 0x41, 0xd6, 0x00, 0x5f, + 0x01, 0x0e, 0x2b, 0x00, 0x5f, 0x02, 0x41, 0xd7, + 0x00, 0x5f, 0x03, 0x12, 0x9c, 0x00, 0x5f, 0x04, + 0x0f, 0xd4, 0x00, 0x5f, 0x06, 0x54, 0x06, 0x00, + 0x5f, 0x07, 0x38, 0xb0, 0x00, 0x5f, 0x08, 0x44, + 0xc7, 0x00, 0x5f, 0x09, 0x12, 0x9d, 0x00, 0x5f, + 0x0a, 0x0e, 0x10, 0x00, 0x5f, 0x0b, 0x12, 0xa0, + 0x00, 0x5f, 0x0c, 0x0f, 0xfa, 0x00, 0x5f, 0x0d, + 0x10, 0x0a, 0x00, 0x5f, 0x0e, 0x38, 0xb1, 0x00, + 0x5f, 0x0f, 0x08, 0xdc, 0x00, 0x5f, 0x10, 0x0c, + 0xcd, 0x00, 0x5f, 0x11, 0x12, 0xa1, 0x00, 0x5f, + 0x13, 0x06, 0x77, 0x00, 0x5f, 0x14, 0x0b, 0xc0, + 0x00, 0x5f, 0x15, 0x04, 0xbe, 0x00, 0x5f, 0x16, + 0x12, 0xa2, 0x00, 0x5f, 0x17, 0x0d, 0xf6, 0x00, + 0x5f, 0x18, 0x07, 0xc2, 0x00, 0x5f, 0x19, 0x54, + 0x07, 0x00, 0x5f, 0x1b, 0x0b, 0x8e, 0x00, 0x5f, + 0x1c, 0x38, 0xb2, 0x00, 0x5f, 0x1d, 0x38, 0xb3, + 0x00, 0x5f, 0x1e, 0x44, 0xc9, 0x00, 0x5f, 0x1f, + 0x0c, 0x0b, 0x00, 0x5f, 0x21, 0x21, 0x01, 0x00, + 0x5f, 0x22, 0x38, 0xb4, 0x00, 0x5f, 0x23, 0x41, + 0xd8, 0x00, 0x5f, 0x24, 0x54, 0x08, 0x00, 0x5f, + 0x25, 0x0e, 0xfb, 0x00, 0x5f, 0x26, 0x07, 0x6d, + 0x00, 0x5f, 0x27, 0x07, 0x80, 0x00, 0x5f, 0x28, + 0x38, 0xb5, 0x00, 0x5f, 0x29, 0x12, 0xa3, 0x00, + 0x5f, 0x2b, 0x54, 0x09, 0x00, 0x5f, 0x2c, 0x54, + 0x0a, 0x00, 0x5f, 0x2d, 0x12, 0xa4, 0x00, 0x5f, + 0x2e, 0x54, 0x0b, 0x00, 0x5f, 0x2f, 0x12, 0xaa, + 0x00, 0x5f, 0x30, 0x54, 0x0c, 0x00, 0x5f, 0x31, + 0x09, 0x11, 0x00, 0x5f, 0x34, 0x21, 0x02, 0x00, + 0x5f, 0x35, 0x0b, 0xc1, 0x00, 0x5f, 0x36, 0x38, + 0xb6, 0x00, 0x5f, 0x37, 0x06, 0xa7, 0x00, 0x5f, + 0x38, 0x12, 0xa5, 0x00, 0x5f, 0x3a, 0x35, 0x98, + 0x00, 0x5f, 0x3b, 0x38, 0xb7, 0x00, 0x5f, 0x3c, + 0x0d, 0x9d, 0x00, 0x5f, 0x3d, 0x41, 0xd9, 0x00, + 0x5f, 0x3e, 0x0b, 0x84, 0x00, 0x5f, 0x3f, 0x54, + 0x0d, 0x00, 0x5f, 0x40, 0x38, 0xb8, 0x00, 0x5f, + 0x41, 0x12, 0xa6, 0x00, 0x5f, 0x44, 0x54, 0x0e, + 0x00, 0x5f, 0x45, 0x20, 0xb2, 0x00, 0x5f, 0x47, + 0x44, 0xca, 0x00, 0x5f, 0x48, 0x12, 0xa7, 0x00, + 0x5f, 0x4a, 0x06, 0xa8, 0x00, 0x5f, 0x4c, 0x12, + 0xa8, 0x00, 0x5f, 0x4d, 0x4b, 0x9a, 0x00, 0x5f, + 0x4e, 0x12, 0xa9, 0x00, 0x5f, 0x50, 0x38, 0xb9, + 0x00, 0x5f, 0x51, 0x12, 0xab, 0x00, 0x5f, 0x53, + 0x0c, 0x70, 0x00, 0x5f, 0x54, 0x41, 0xda, 0x00, + 0x5f, 0x56, 0x12, 0xac, 0x00, 0x5f, 0x57, 0x12, + 0xad, 0x00, 0x5f, 0x58, 0x38, 0xba, 0x00, 0x5f, + 0x59, 0x12, 0xae, 0x00, 0x5f, 0x5b, 0x54, 0x0f, + 0x00, 0x5f, 0x5c, 0x12, 0x9f, 0x00, 0x5f, 0x5d, + 0x12, 0x9e, 0x00, 0x5f, 0x60, 0x54, 0x10, 0x00, + 0x5f, 0x61, 0x12, 0xaf, 0x00, 0x5f, 0x62, 0x07, + 0x17, 0x00, 0x5f, 0x63, 0x44, 0xcb, 0x00, 0x5f, + 0x64, 0x38, 0xbb, 0x00, 0x5f, 0x65, 0x36, 0xac, + 0x00, 0x5f, 0x66, 0x0d, 0x99, 0x00, 0x5f, 0x67, + 0x21, 0x03, 0x00, 0x5f, 0x69, 0x08, 0x3c, 0x00, + 0x5f, 0x6a, 0x0d, 0xa9, 0x00, 0x5f, 0x6b, 0x0b, + 0xc2, 0x00, 0x5f, 0x6c, 0x0d, 0xbd, 0x00, 0x5f, + 0x6d, 0x12, 0xb0, 0x00, 0x5f, 0x6f, 0x54, 0x11, + 0x00, 0x5f, 0x70, 0x09, 0x9c, 0x00, 0x5f, 0x71, + 0x04, 0xe8, 0x00, 0x5f, 0x72, 0x44, 0xcc, 0x00, + 0x5f, 0x73, 0x12, 0xb1, 0x00, 0x5f, 0x74, 0x54, + 0x12, 0x00, 0x5f, 0x75, 0x54, 0x13, 0x00, 0x5f, + 0x77, 0x12, 0xb2, 0x00, 0x5f, 0x78, 0x54, 0x14, + 0x00, 0x5f, 0x79, 0x0e, 0xfe, 0x00, 0x5f, 0x7a, + 0x54, 0x15, 0x00, 0x5f, 0x7c, 0x0d, 0x74, 0x00, + 0x5f, 0x7d, 0x41, 0xdb, 0x00, 0x5f, 0x7e, 0x44, + 0xcd, 0x00, 0x5f, 0x7f, 0x12, 0xb5, 0x00, 0x5f, + 0x80, 0x05, 0x1f, 0x00, 0x5f, 0x81, 0x0a, 0x50, + 0x00, 0x5f, 0x82, 0x12, 0xb4, 0x00, 0x5f, 0x83, + 0x12, 0xb3, 0x00, 0x5f, 0x84, 0x07, 0x18, 0x00, + 0x5f, 0x85, 0x0b, 0x34, 0x00, 0x5f, 0x87, 0x12, + 0xb9, 0x00, 0x5f, 0x88, 0x12, 0xb7, 0x00, 0x5f, + 0x89, 0x38, 0xbc, 0x00, 0x5f, 0x8a, 0x12, 0xb6, + 0x00, 0x5f, 0x8b, 0x0f, 0x6f, 0x00, 0x5f, 0x8c, + 0x07, 0x99, 0x00, 0x5f, 0x8d, 0x54, 0x16, 0x00, + 0x5f, 0x8f, 0x44, 0xce, 0x00, 0x5f, 0x90, 0x09, + 0x83, 0x00, 0x5f, 0x91, 0x12, 0xb8, 0x00, 0x5f, + 0x92, 0x0c, 0x46, 0x00, 0x5f, 0x93, 0x09, 0x48, + 0x00, 0x5f, 0x96, 0x54, 0x17, 0x00, 0x5f, 0x97, + 0x0c, 0x98, 0x00, 0x5f, 0x98, 0x12, 0xbc, 0x00, + 0x5f, 0x99, 0x12, 0xbb, 0x00, 0x5f, 0x9c, 0x38, + 0xbd, 0x00, 0x5f, 0x9d, 0x54, 0x18, 0x00, 0x5f, + 0x9e, 0x12, 0xba, 0x00, 0x5f, 0xa0, 0x12, 0xbd, + 0x00, 0x5f, 0xa1, 0x07, 0x9a, 0x00, 0x5f, 0xa2, + 0x44, 0xcf, 0x00, 0x5f, 0xa4, 0x38, 0xbf, 0x00, + 0x5f, 0xa7, 0x38, 0xbe, 0x00, 0x5f, 0xa8, 0x12, + 0xbe, 0x00, 0x5f, 0xa9, 0x0d, 0xee, 0x00, 0x5f, + 0xaa, 0x09, 0x65, 0x00, 0x5f, 0xab, 0x54, 0x19, + 0x00, 0x5f, 0xac, 0x4b, 0x9b, 0x00, 0x5f, 0xad, + 0x12, 0xbf, 0x00, 0x5f, 0xae, 0x0d, 0x8d, 0x00, + 0x5f, 0xaf, 0x38, 0xc0, 0x00, 0x5f, 0xb0, 0x54, + 0x1a, 0x00, 0x5f, 0xb1, 0x54, 0x1b, 0x00, 0x5f, + 0xb3, 0x0c, 0x99, 0x00, 0x5f, 0xb4, 0x0b, 0xc3, + 0x00, 0x5f, 0xb5, 0x34, 0x38, 0x00, 0x5f, 0xb7, + 0x21, 0x04, 0x00, 0x5f, 0xb8, 0x38, 0xc1, 0x00, + 0x5f, 0xb9, 0x0c, 0x2a, 0x00, 0x5f, 0xbc, 0x12, + 0xc0, 0x00, 0x5f, 0xbd, 0x06, 0x45, 0x00, 0x5f, + 0xc3, 0x09, 0xfa, 0x00, 0x5f, 0xc4, 0x38, 0xc2, + 0x00, 0x5f, 0xc5, 0x0d, 0x9e, 0x00, 0x5f, 0xc7, + 0x44, 0xd0, 0x00, 0x5f, 0xc8, 0x54, 0x1c, 0x00, + 0x5f, 0xc9, 0x38, 0xc3, 0x00, 0x5f, 0xcb, 0x44, + 0xd1, 0x00, 0x5f, 0xcc, 0x06, 0x33, 0x00, 0x5f, + 0xcd, 0x0c, 0xdc, 0x00, 0x5f, 0xd0, 0x54, 0x1d, + 0x00, 0x5f, 0xd1, 0x54, 0x1e, 0x00, 0x5f, 0xd2, + 0x44, 0xd2, 0x00, 0x5f, 0xd3, 0x44, 0xd3, 0x00, + 0x5f, 0xd4, 0x44, 0xd4, 0x00, 0x5f, 0xd6, 0x12, + 0xc1, 0x00, 0x5f, 0xd7, 0x08, 0xa4, 0x00, 0x5f, + 0xd8, 0x0e, 0x68, 0x00, 0x5f, 0xd9, 0x0e, 0x69, + 0x00, 0x5f, 0xdc, 0x05, 0x20, 0x00, 0x5f, 0xdd, + 0x12, 0xc6, 0x00, 0x5f, 0xde, 0x21, 0x05, 0x00, + 0x5f, 0xe0, 0x0b, 0xa7, 0x00, 0x5f, 0xe1, 0x38, + 0xc4, 0x00, 0x5f, 0xe2, 0x44, 0xd5, 0x00, 0x5f, + 0xe4, 0x12, 0xc3, 0x00, 0x5f, 0xe8, 0x54, 0x1f, + 0x00, 0x5f, 0xe9, 0x38, 0xc5, 0x00, 0x5f, 0xea, + 0x4b, 0x9c, 0x00, 0x5f, 0xeb, 0x05, 0x77, 0x00, + 0x5f, 0xec, 0x54, 0x20, 0x00, 0x5f, 0xed, 0x38, + 0xc6, 0x00, 0x5f, 0xee, 0x44, 0xd6, 0x00, 0x5f, + 0xef, 0x44, 0xd7, 0x00, 0x5f, 0xf0, 0x12, 0xf6, + 0x00, 0x5f, 0xf1, 0x12, 0xc5, 0x00, 0x5f, 0xf2, + 0x54, 0x21, 0x00, 0x5f, 0xf3, 0x44, 0xd8, 0x00, + 0x5f, 0xf5, 0x0c, 0xe6, 0x00, 0x5f, 0xf6, 0x54, + 0x22, 0x00, 0x5f, 0xf8, 0x12, 0xc4, 0x00, 0x5f, + 0xfa, 0x54, 0x23, 0x00, 0x5f, 0xfb, 0x12, 0xc2, + 0x00, 0x5f, 0xfc, 0x38, 0xc7, 0x00, 0x5f, 0xfd, + 0x08, 0x0c, 0x00, 0x5f, 0xff, 0x12, 0xc8, 0x00, + 0x60, 0x07, 0x4b, 0x9d, 0x00, 0x60, 0x0a, 0x54, + 0x24, 0x00, 0x60, 0x0d, 0x41, 0xdc, 0x00, 0x60, + 0x0e, 0x12, 0xce, 0x00, 0x60, 0x0f, 0x12, 0xd4, + 0x00, 0x60, 0x10, 0x12, 0xcc, 0x00, 0x60, 0x12, + 0x0c, 0x56, 0x00, 0x60, 0x13, 0x54, 0x25, 0x00, + 0x60, 0x14, 0x41, 0xdd, 0x00, 0x60, 0x15, 0x12, + 0xd1, 0x00, 0x60, 0x16, 0x0d, 0xcf, 0x00, 0x60, + 0x17, 0x38, 0xc8, 0x00, 0x60, 0x18, 0x41, 0xde, + 0x00, 0x60, 0x19, 0x12, 0xcb, 0x00, 0x60, 0x1a, + 0x38, 0xc9, 0x00, 0x60, 0x1b, 0x12, 0xd0, 0x00, + 0x60, 0x1c, 0x0f, 0xaf, 0x00, 0x60, 0x1d, 0x08, + 0xa5, 0x00, 0x60, 0x1f, 0x54, 0x26, 0x00, 0x60, + 0x20, 0x0b, 0x35, 0x00, 0x60, 0x21, 0x12, 0xc9, + 0x00, 0x60, 0x22, 0x44, 0xda, 0x00, 0x60, 0x24, + 0x44, 0xdb, 0x00, 0x60, 0x25, 0x06, 0x78, 0x00, + 0x60, 0x26, 0x12, 0xd3, 0x00, 0x60, 0x27, 0x0a, + 0x51, 0x00, 0x60, 0x28, 0x05, 0x07, 0x00, 0x60, + 0x29, 0x12, 0xcd, 0x00, 0x60, 0x2a, 0x05, 0x78, + 0x00, 0x60, 0x2b, 0x12, 0xd2, 0x00, 0x60, 0x2d, + 0x54, 0x27, 0x00, 0x60, 0x2f, 0x06, 0xa9, 0x00, + 0x60, 0x31, 0x12, 0xcf, 0x00, 0x60, 0x33, 0x38, + 0xca, 0x00, 0x60, 0x35, 0x41, 0xdf, 0x00, 0x60, + 0x3a, 0x12, 0xd5, 0x00, 0x60, 0x40, 0x54, 0x28, + 0x00, 0x60, 0x41, 0x12, 0xd7, 0x00, 0x60, 0x42, + 0x12, 0xe1, 0x00, 0x60, 0x43, 0x12, 0xdf, 0x00, + 0x60, 0x46, 0x12, 0xdc, 0x00, 0x60, 0x47, 0x41, + 0xe0, 0x00, 0x60, 0x48, 0x54, 0x29, 0x00, 0x60, + 0x49, 0x4b, 0x9e, 0x00, 0x60, 0x4a, 0x12, 0xdb, + 0x00, 0x60, 0x4b, 0x0f, 0xc0, 0x00, 0x60, 0x4c, + 0x44, 0xdd, 0x00, 0x60, 0x4d, 0x12, 0xdd, 0x00, + 0x60, 0x50, 0x06, 0xaa, 0x00, 0x60, 0x51, 0x54, + 0x2a, 0x00, 0x60, 0x52, 0x07, 0xc3, 0x00, 0x60, + 0x54, 0x4b, 0x9f, 0x00, 0x60, 0x55, 0x09, 0x84, + 0x00, 0x60, 0x56, 0x54, 0x2b, 0x00, 0x60, 0x57, + 0x54, 0x2c, 0x00, 0x60, 0x59, 0x12, 0xe4, 0x00, + 0x60, 0x5a, 0x12, 0xd6, 0x00, 0x60, 0x5d, 0x21, + 0x06, 0x00, 0x60, 0x5f, 0x12, 0xda, 0x00, 0x60, + 0x60, 0x12, 0xca, 0x00, 0x60, 0x61, 0x38, 0xcb, + 0x00, 0x60, 0x62, 0x05, 0x7a, 0x00, 0x60, 0x63, + 0x12, 0xde, 0x00, 0x60, 0x64, 0x12, 0xe0, 0x00, + 0x60, 0x65, 0x0b, 0x8f, 0x00, 0x60, 0x67, 0x4b, + 0xa0, 0x00, 0x60, 0x68, 0x08, 0x18, 0x00, 0x60, + 0x69, 0x05, 0x38, 0x00, 0x60, 0x6a, 0x12, 0xd8, + 0x00, 0x60, 0x6b, 0x12, 0xe3, 0x00, 0x60, 0x6c, + 0x12, 0xe2, 0x00, 0x60, 0x6d, 0x06, 0xab, 0x00, + 0x60, 0x6f, 0x0b, 0x09, 0x00, 0x60, 0x70, 0x05, + 0xc4, 0x00, 0x60, 0x71, 0x54, 0x2d, 0x00, 0x60, + 0x75, 0x07, 0x19, 0x00, 0x60, 0x77, 0x12, 0xd9, + 0x00, 0x60, 0x7e, 0x54, 0x2e, 0x00, 0x60, 0x7f, + 0x38, 0xcc, 0x00, 0x60, 0x81, 0x12, 0xe5, 0x00, + 0x60, 0x82, 0x54, 0x2f, 0x00, 0x60, 0x83, 0x12, + 0xe8, 0x00, 0x60, 0x84, 0x12, 0xea, 0x00, 0x60, + 0x85, 0x21, 0x07, 0x00, 0x60, 0x86, 0x54, 0x30, + 0x00, 0x60, 0x88, 0x54, 0x31, 0x00, 0x60, 0x89, + 0x08, 0xe9, 0x00, 0x60, 0x8a, 0x21, 0x08, 0x00, + 0x60, 0x8b, 0x12, 0xf0, 0x00, 0x60, 0x8c, 0x0c, + 0x0c, 0x00, 0x60, 0x8d, 0x12, 0xe6, 0x00, 0x60, + 0x8e, 0x54, 0x32, 0x00, 0x60, 0x91, 0x54, 0x33, + 0x00, 0x60, 0x92, 0x12, 0xee, 0x00, 0x60, 0x93, + 0x54, 0x34, 0x00, 0x60, 0x94, 0x34, 0x0e, 0x00, + 0x60, 0x95, 0x44, 0xde, 0x00, 0x60, 0x96, 0x12, + 0xec, 0x00, 0x60, 0x97, 0x12, 0xed, 0x00, 0x60, + 0x98, 0x54, 0x35, 0x00, 0x60, 0x9a, 0x12, 0xe9, + 0x00, 0x60, 0x9b, 0x12, 0xeb, 0x00, 0x60, 0x9d, + 0x41, 0xe1, 0x00, 0x60, 0x9e, 0x38, 0xcd, 0x00, + 0x60, 0x9f, 0x07, 0x9b, 0x00, 0x60, 0xa0, 0x0f, + 0x14, 0x00, 0x60, 0xa2, 0x54, 0x37, 0x00, 0x60, + 0xa3, 0x05, 0xf1, 0x00, 0x60, 0xa4, 0x38, 0xce, + 0x00, 0x60, 0xa5, 0x54, 0x38, 0x00, 0x60, 0xa6, + 0x04, 0xfb, 0x00, 0x60, 0xa7, 0x12, 0xef, 0x00, + 0x60, 0xa8, 0x44, 0xdf, 0x00, 0x60, 0xa9, 0x0c, + 0xf0, 0x00, 0x60, 0xaa, 0x04, 0x71, 0x00, 0x60, + 0xb0, 0x38, 0xcf, 0x00, 0x60, 0xb1, 0x44, 0xe1, + 0x00, 0x60, 0xb2, 0x0d, 0x75, 0x00, 0x60, 0xb3, + 0x12, 0xc7, 0x00, 0x60, 0xb4, 0x12, 0xf5, 0x00, + 0x60, 0xb5, 0x12, 0xf9, 0x00, 0x60, 0xb6, 0x0e, + 0xf1, 0x00, 0x60, 0xb7, 0x54, 0x39, 0x00, 0x60, + 0xb8, 0x12, 0xf2, 0x00, 0x60, 0xbb, 0x4b, 0xa1, + 0x00, 0x60, 0xbc, 0x0c, 0x63, 0x00, 0x60, 0xbd, + 0x12, 0xf7, 0x00, 0x60, 0xbe, 0x44, 0xe2, 0x00, + 0x60, 0xc2, 0x54, 0x3a, 0x00, 0x60, 0xc4, 0x4b, + 0xa2, 0x00, 0x60, 0xc5, 0x09, 0xd8, 0x00, 0x60, + 0xc6, 0x12, 0xf8, 0x00, 0x60, 0xc7, 0x0c, 0xaf, + 0x00, 0x60, 0xc8, 0x44, 0xe3, 0x00, 0x60, 0xc9, + 0x54, 0x3b, 0x00, 0x60, 0xca, 0x54, 0x3c, 0x00, + 0x60, 0xcb, 0x38, 0xd0, 0x00, 0x60, 0xce, 0x54, + 0x3d, 0x00, 0x60, 0xcf, 0x54, 0x3e, 0x00, 0x60, + 0xd1, 0x0f, 0xed, 0x00, 0x60, 0xd3, 0x12, 0xf4, + 0x00, 0x60, 0xd4, 0x41, 0xe2, 0x00, 0x60, 0xd5, + 0x21, 0x0a, 0x00, 0x60, 0xd8, 0x12, 0xfa, 0x00, + 0x60, 0xd9, 0x44, 0xe4, 0x00, 0x60, 0xda, 0x08, + 0x0d, 0x00, 0x60, 0xdb, 0x38, 0xd1, 0x00, 0x60, + 0xdc, 0x0a, 0x6f, 0x00, 0x60, 0xdd, 0x41, 0xe3, + 0x00, 0x60, 0xde, 0x21, 0x09, 0x00, 0x60, 0xdf, + 0x04, 0x98, 0x00, 0x60, 0xe0, 0x12, 0xf3, 0x00, + 0x60, 0xe1, 0x12, 0xf1, 0x00, 0x60, 0xe2, 0x54, + 0x3f, 0x00, 0x60, 0xe3, 0x0a, 0xdc, 0x00, 0x60, + 0xe5, 0x54, 0x40, 0x00, 0x60, 0xe7, 0x12, 0xe7, + 0x00, 0x60, 0xe8, 0x08, 0x82, 0x00, 0x60, 0xee, + 0x44, 0xe5, 0x00, 0x60, 0xf0, 0x0b, 0x26, 0x00, + 0x60, 0xf1, 0x13, 0x06, 0x00, 0x60, 0xf2, 0x21, + 0x0c, 0x00, 0x60, 0xf3, 0x0a, 0xdd, 0x00, 0x60, + 0xf4, 0x13, 0x01, 0x00, 0x60, 0xf5, 0x44, 0xe6, + 0x00, 0x60, 0xf6, 0x12, 0xfe, 0x00, 0x60, 0xf7, + 0x12, 0xff, 0x00, 0x60, 0xf8, 0x38, 0xd2, 0x00, + 0x60, 0xf9, 0x09, 0x12, 0x00, 0x60, 0xfa, 0x13, + 0x02, 0x00, 0x60, 0xfb, 0x13, 0x05, 0x00, 0x60, + 0xfc, 0x54, 0x41, 0x00, 0x60, 0xfd, 0x4b, 0xa3, + 0x00, 0x61, 0x00, 0x13, 0x00, 0x00, 0x61, 0x01, + 0x09, 0x2f, 0x00, 0x61, 0x02, 0x54, 0x42, 0x00, + 0x61, 0x03, 0x13, 0x03, 0x00, 0x61, 0x06, 0x12, + 0xfd, 0x00, 0x61, 0x07, 0x54, 0x43, 0x00, 0x61, + 0x08, 0x0f, 0x08, 0x00, 0x61, 0x09, 0x0f, 0x07, + 0x00, 0x61, 0x0a, 0x4b, 0xa4, 0x00, 0x61, 0x0c, + 0x54, 0x44, 0x00, 0x61, 0x0d, 0x13, 0x07, 0x00, + 0x61, 0x0e, 0x13, 0x08, 0x00, 0x61, 0x0f, 0x04, + 0x99, 0x00, 0x61, 0x10, 0x44, 0xe7, 0x00, 0x61, + 0x11, 0x21, 0x0d, 0x00, 0x61, 0x12, 0x38, 0xd3, + 0x00, 0x61, 0x13, 0x38, 0xd4, 0x00, 0x61, 0x14, + 0x38, 0xd5, 0x00, 0x61, 0x15, 0x12, 0xfc, 0x00, + 0x61, 0x16, 0x4b, 0xa5, 0x00, 0x61, 0x17, 0x54, + 0x45, 0x00, 0x61, 0x19, 0x44, 0xe8, 0x00, 0x61, + 0x1a, 0x06, 0xea, 0x00, 0x61, 0x1b, 0x04, 0x6a, + 0x00, 0x61, 0x1c, 0x38, 0xd6, 0x00, 0x61, 0x1e, + 0x44, 0xe9, 0x00, 0x61, 0x1f, 0x05, 0xf2, 0x00, + 0x61, 0x20, 0x21, 0x0b, 0x00, 0x61, 0x21, 0x13, + 0x04, 0x00, 0x61, 0x22, 0x54, 0x46, 0x00, 0x61, + 0x27, 0x13, 0x0c, 0x00, 0x61, 0x28, 0x13, 0x0b, + 0x00, 0x61, 0x2a, 0x4b, 0xa6, 0x00, 0x61, 0x2b, + 0x41, 0xe4, 0x00, 0x61, 0x2c, 0x13, 0x10, 0x00, + 0x61, 0x30, 0x21, 0x0f, 0x00, 0x61, 0x31, 0x54, + 0x47, 0x00, 0x61, 0x34, 0x13, 0x11, 0x00, 0x61, + 0x35, 0x54, 0x48, 0x00, 0x61, 0x36, 0x4b, 0xa7, + 0x00, 0x61, 0x37, 0x21, 0x0e, 0x00, 0x61, 0x39, + 0x54, 0x49, 0x00, 0x61, 0x3a, 0x44, 0xea, 0x00, + 0x61, 0x3c, 0x13, 0x0f, 0x00, 0x61, 0x3d, 0x13, + 0x12, 0x00, 0x61, 0x3e, 0x13, 0x0a, 0x00, 0x61, + 0x3f, 0x13, 0x0e, 0x00, 0x61, 0x41, 0x44, 0xec, + 0x00, 0x61, 0x42, 0x13, 0x13, 0x00, 0x61, 0x44, + 0x13, 0x14, 0x00, 0x61, 0x45, 0x54, 0x4a, 0x00, + 0x61, 0x46, 0x44, 0xed, 0x00, 0x61, 0x47, 0x13, + 0x09, 0x00, 0x61, 0x48, 0x08, 0xca, 0x00, 0x61, + 0x49, 0x54, 0x4b, 0x00, 0x61, 0x4a, 0x13, 0x0d, + 0x00, 0x61, 0x4b, 0x0b, 0x36, 0x00, 0x61, 0x4c, + 0x07, 0xc4, 0x00, 0x61, 0x4d, 0x12, 0xfb, 0x00, + 0x61, 0x4e, 0x09, 0xfb, 0x00, 0x61, 0x53, 0x13, + 0x21, 0x00, 0x61, 0x55, 0x0e, 0x39, 0x00, 0x61, + 0x58, 0x13, 0x17, 0x00, 0x61, 0x59, 0x13, 0x18, + 0x00, 0x61, 0x5a, 0x13, 0x19, 0x00, 0x61, 0x5d, + 0x13, 0x20, 0x00, 0x61, 0x5e, 0x4b, 0xa8, 0x00, + 0x61, 0x5f, 0x13, 0x1f, 0x00, 0x61, 0x60, 0x44, + 0xee, 0x00, 0x61, 0x62, 0x0e, 0xab, 0x00, 0x61, + 0x63, 0x05, 0xf3, 0x00, 0x61, 0x64, 0x4b, 0xa9, + 0x00, 0x61, 0x65, 0x13, 0x1d, 0x00, 0x61, 0x67, + 0x07, 0x1b, 0x00, 0x61, 0x68, 0x05, 0x92, 0x00, + 0x61, 0x6b, 0x13, 0x1a, 0x00, 0x61, 0x6c, 0x54, + 0x4c, 0x00, 0x61, 0x6e, 0x0f, 0x80, 0x00, 0x61, + 0x6f, 0x13, 0x1c, 0x00, 0x61, 0x70, 0x04, 0x9a, + 0x00, 0x61, 0x71, 0x13, 0x1e, 0x00, 0x61, 0x72, + 0x54, 0x4d, 0x00, 0x61, 0x73, 0x13, 0x15, 0x00, + 0x61, 0x74, 0x13, 0x1b, 0x00, 0x61, 0x75, 0x13, + 0x22, 0x00, 0x61, 0x76, 0x07, 0x1a, 0x00, 0x61, + 0x77, 0x13, 0x16, 0x00, 0x61, 0x78, 0x54, 0x4e, + 0x00, 0x61, 0x7b, 0x4b, 0xaa, 0x00, 0x61, 0x7c, + 0x38, 0xd7, 0x00, 0x61, 0x7d, 0x4b, 0xab, 0x00, + 0x61, 0x7e, 0x0f, 0x47, 0x00, 0x61, 0x7f, 0x4b, + 0xac, 0x00, 0x61, 0x80, 0x54, 0x4f, 0x00, 0x61, + 0x81, 0x54, 0x50, 0x00, 0x61, 0x82, 0x0f, 0x15, + 0x00, 0x61, 0x83, 0x54, 0x51, 0x00, 0x61, 0x84, + 0x54, 0x52, 0x00, 0x61, 0x87, 0x13, 0x25, 0x00, + 0x61, 0x8a, 0x13, 0x29, 0x00, 0x61, 0x8b, 0x54, + 0x53, 0x00, 0x61, 0x8d, 0x38, 0xd8, 0x00, 0x61, + 0x8e, 0x34, 0x33, 0x00, 0x61, 0x90, 0x0f, 0xc1, + 0x00, 0x61, 0x91, 0x13, 0x2a, 0x00, 0x61, 0x92, + 0x44, 0xf0, 0x00, 0x61, 0x93, 0x44, 0xf1, 0x00, + 0x61, 0x94, 0x13, 0x27, 0x00, 0x61, 0x96, 0x13, + 0x24, 0x00, 0x61, 0x97, 0x44, 0xf2, 0x00, 0x61, + 0x98, 0x21, 0x10, 0x00, 0x61, 0x99, 0x13, 0x23, + 0x00, 0x61, 0x9a, 0x13, 0x28, 0x00, 0x61, 0x9c, + 0x54, 0x54, 0x00, 0x61, 0x9d, 0x4b, 0xad, 0x00, + 0x61, 0x9f, 0x38, 0xd9, 0x00, 0x61, 0xa0, 0x54, + 0x55, 0x00, 0x61, 0xa4, 0x0e, 0x00, 0x00, 0x61, + 0xa5, 0x44, 0xf3, 0x00, 0x61, 0xa7, 0x0c, 0x8c, + 0x00, 0x61, 0xa8, 0x38, 0xda, 0x00, 0x61, 0xa9, + 0x07, 0x1c, 0x00, 0x61, 0xaa, 0x54, 0x56, 0x00, + 0x61, 0xab, 0x13, 0x2b, 0x00, 0x61, 0xac, 0x13, + 0x26, 0x00, 0x61, 0xad, 0x44, 0xf4, 0x00, 0x61, + 0xae, 0x13, 0x2c, 0x00, 0x61, 0xb2, 0x07, 0x51, + 0x00, 0x61, 0xb6, 0x05, 0x31, 0x00, 0x61, 0xb8, + 0x4b, 0xae, 0x00, 0x61, 0xb9, 0x41, 0xe6, 0x00, + 0x61, 0xba, 0x13, 0x34, 0x00, 0x61, 0xbc, 0x41, + 0xe5, 0x00, 0x61, 0xbe, 0x05, 0xf4, 0x00, 0x61, + 0xc0, 0x54, 0x57, 0x00, 0x61, 0xc1, 0x54, 0x58, + 0x00, 0x61, 0xc2, 0x38, 0xdb, 0x00, 0x61, 0xc3, + 0x13, 0x32, 0x00, 0x61, 0xc6, 0x13, 0x33, 0x00, + 0x61, 0xc7, 0x08, 0x19, 0x00, 0x61, 0xc8, 0x13, + 0x31, 0x00, 0x61, 0xc9, 0x13, 0x2f, 0x00, 0x61, + 0xca, 0x13, 0x2e, 0x00, 0x61, 0xcb, 0x13, 0x35, + 0x00, 0x61, 0xcc, 0x13, 0x2d, 0x00, 0x61, 0xcd, + 0x13, 0x37, 0x00, 0x61, 0xce, 0x54, 0x59, 0x00, + 0x61, 0xcf, 0x54, 0x5a, 0x00, 0x61, 0xd0, 0x05, + 0x7b, 0x00, 0x61, 0xd5, 0x44, 0xf6, 0x00, 0x61, + 0xdc, 0x4b, 0xaf, 0x00, 0x61, 0xdd, 0x44, 0xf7, + 0x00, 0x61, 0xde, 0x54, 0x5b, 0x00, 0x61, 0xdf, + 0x38, 0xdc, 0x00, 0x61, 0xe1, 0x54, 0x5c, 0x00, + 0x61, 0xe2, 0x4b, 0xb0, 0x00, 0x61, 0xe3, 0x13, + 0x39, 0x00, 0x61, 0xe5, 0x4b, 0xb1, 0x00, 0x61, + 0xe6, 0x13, 0x38, 0x00, 0x61, 0xe7, 0x54, 0x5d, + 0x00, 0x61, 0xe8, 0x4b, 0xb2, 0x00, 0x61, 0xe9, + 0x54, 0x5e, 0x00, 0x61, 0xec, 0x54, 0x5f, 0x00, + 0x61, 0xed, 0x54, 0x60, 0x00, 0x61, 0xef, 0x54, + 0x61, 0x00, 0x61, 0xf2, 0x0b, 0xc4, 0x00, 0x61, + 0xf4, 0x13, 0x3c, 0x00, 0x61, 0xf5, 0x44, 0xf8, + 0x00, 0x61, 0xf6, 0x13, 0x3a, 0x00, 0x61, 0xf7, + 0x13, 0x30, 0x00, 0x61, 0xf8, 0x07, 0x52, 0x00, + 0x61, 0xfa, 0x13, 0x3b, 0x00, 0x61, 0xfc, 0x13, + 0x3f, 0x00, 0x61, 0xfd, 0x13, 0x3e, 0x00, 0x61, + 0xfe, 0x13, 0x40, 0x00, 0x61, 0xff, 0x13, 0x3d, + 0x00, 0x62, 0x00, 0x13, 0x41, 0x00, 0x62, 0x01, + 0x54, 0x62, 0x00, 0x62, 0x03, 0x54, 0x63, 0x00, + 0x62, 0x04, 0x4b, 0xb3, 0x00, 0x62, 0x07, 0x4b, + 0xb4, 0x00, 0x62, 0x08, 0x13, 0x42, 0x00, 0x62, + 0x09, 0x13, 0x43, 0x00, 0x62, 0x0a, 0x0e, 0x3a, + 0x00, 0x62, 0x0c, 0x13, 0x45, 0x00, 0x62, 0x0d, + 0x13, 0x44, 0x00, 0x62, 0x0e, 0x09, 0x49, 0x00, + 0x62, 0x10, 0x0a, 0x52, 0x00, 0x62, 0x11, 0x05, + 0x66, 0x00, 0x62, 0x12, 0x05, 0x7c, 0x00, 0x62, + 0x13, 0x21, 0x11, 0x00, 0x62, 0x14, 0x13, 0x46, + 0x00, 0x62, 0x15, 0x38, 0xdd, 0x00, 0x62, 0x16, + 0x04, 0x83, 0x00, 0x62, 0x1a, 0x0a, 0x70, 0x00, + 0x62, 0x1b, 0x13, 0x47, 0x00, 0x62, 0x1c, 0x54, + 0x64, 0x00, 0x62, 0x1d, 0x1a, 0x64, 0x00, 0x62, + 0x1e, 0x13, 0x48, 0x00, 0x62, 0x1f, 0x07, 0x37, + 0x00, 0x62, 0x20, 0x54, 0x65, 0x00, 0x62, 0x21, + 0x13, 0x49, 0x00, 0x62, 0x22, 0x41, 0xe7, 0x00, + 0x62, 0x23, 0x44, 0xfa, 0x00, 0x62, 0x26, 0x0a, + 0x93, 0x00, 0x62, 0x27, 0x54, 0x66, 0x00, 0x62, + 0x29, 0x38, 0xde, 0x00, 0x62, 0x2a, 0x13, 0x4a, + 0x00, 0x62, 0x2b, 0x54, 0x67, 0x00, 0x62, 0x2e, + 0x13, 0x4b, 0x00, 0x62, 0x2f, 0x06, 0x54, 0x00, + 0x62, 0x30, 0x13, 0x4c, 0x00, 0x62, 0x31, 0x4b, + 0xb5, 0x00, 0x62, 0x32, 0x13, 0x4d, 0x00, 0x62, + 0x33, 0x13, 0x4e, 0x00, 0x62, 0x34, 0x0b, 0x37, + 0x00, 0x62, 0x36, 0x35, 0xbd, 0x00, 0x62, 0x38, + 0x07, 0x81, 0x00, 0x62, 0x39, 0x4b, 0xb6, 0x00, + 0x62, 0x3b, 0x0e, 0xed, 0x00, 0x62, 0x3d, 0x4b, + 0xb7, 0x00, 0x62, 0x3e, 0x34, 0x4e, 0x00, 0x62, + 0x3f, 0x0e, 0x6a, 0x00, 0x62, 0x40, 0x09, 0x74, + 0x00, 0x62, 0x41, 0x13, 0x4f, 0x00, 0x62, 0x42, + 0x54, 0x68, 0x00, 0x62, 0x43, 0x38, 0xdf, 0x00, + 0x62, 0x44, 0x54, 0x69, 0x00, 0x62, 0x46, 0x38, + 0xe0, 0x00, 0x62, 0x47, 0x0a, 0x94, 0x00, 0x62, + 0x48, 0x1b, 0x1a, 0x00, 0x62, 0x49, 0x0d, 0x76, + 0x00, 0x62, 0x4b, 0x09, 0x16, 0x00, 0x62, 0x4c, + 0x38, 0xe1, 0x00, 0x62, 0x4d, 0x08, 0x3d, 0x00, + 0x62, 0x4e, 0x13, 0x50, 0x00, 0x62, 0x50, 0x54, + 0x6a, 0x00, 0x62, 0x51, 0x38, 0xe2, 0x00, 0x62, + 0x52, 0x44, 0xfb, 0x00, 0x62, 0x53, 0x0b, 0x27, + 0x00, 0x62, 0x54, 0x54, 0x6b, 0x00, 0x62, 0x55, + 0x0d, 0xf7, 0x00, 0x62, 0x56, 0x38, 0xe3, 0x00, + 0x62, 0x58, 0x0b, 0x51, 0x00, 0x62, 0x5a, 0x41, + 0xe8, 0x00, 0x62, 0x5b, 0x13, 0x53, 0x00, 0x62, + 0x5c, 0x54, 0x6c, 0x00, 0x62, 0x5e, 0x13, 0x51, + 0x00, 0x62, 0x60, 0x13, 0x54, 0x00, 0x62, 0x61, + 0x44, 0xfc, 0x00, 0x62, 0x63, 0x13, 0x52, 0x00, + 0x62, 0x64, 0x44, 0xfd, 0x00, 0x62, 0x68, 0x13, + 0x55, 0x00, 0x62, 0x6d, 0x44, 0xff, 0x00, 0x62, + 0x6e, 0x0e, 0x01, 0x00, 0x62, 0x6f, 0x41, 0xe9, + 0x00, 0x62, 0x71, 0x04, 0x7b, 0x00, 0x62, 0x73, + 0x45, 0x00, 0x00, 0x62, 0x76, 0x0d, 0xd0, 0x00, + 0x62, 0x79, 0x0d, 0x77, 0x00, 0x62, 0x7a, 0x4b, + 0xb8, 0x00, 0x62, 0x7b, 0x44, 0xfe, 0x00, 0x62, + 0x7c, 0x13, 0x56, 0x00, 0x62, 0x7d, 0x54, 0x6d, + 0x00, 0x62, 0x7e, 0x13, 0x59, 0x00, 0x62, 0x7f, + 0x09, 0x9d, 0x00, 0x62, 0x80, 0x06, 0x55, 0x00, + 0x62, 0x82, 0x13, 0x57, 0x00, 0x62, 0x83, 0x13, + 0x5e, 0x00, 0x62, 0x84, 0x09, 0x9e, 0x00, 0x62, + 0x85, 0x35, 0xc5, 0x00, 0x62, 0x89, 0x13, 0x58, + 0x00, 0x62, 0x8a, 0x0c, 0xfa, 0x00, 0x62, 0x8d, + 0x54, 0x6e, 0x00, 0x62, 0x8e, 0x54, 0x6f, 0x00, + 0x62, 0x8f, 0x54, 0x70, 0x00, 0x62, 0x90, 0x4b, + 0xb9, 0x00, 0x62, 0x91, 0x0f, 0x48, 0x00, 0x62, + 0x92, 0x13, 0x5a, 0x00, 0x62, 0x93, 0x13, 0x5b, + 0x00, 0x62, 0x94, 0x13, 0x5f, 0x00, 0x62, 0x95, + 0x0c, 0x64, 0x00, 0x62, 0x96, 0x13, 0x5c, 0x00, + 0x62, 0x97, 0x07, 0xc5, 0x00, 0x62, 0x98, 0x0a, + 0x82, 0x00, 0x62, 0x99, 0x45, 0x01, 0x00, 0x62, + 0x9b, 0x13, 0x6d, 0x00, 0x62, 0x9c, 0x0d, 0x48, + 0x00, 0x62, 0x9e, 0x0b, 0x52, 0x00, 0x62, 0xa6, + 0x21, 0x12, 0x00, 0x62, 0xa8, 0x4b, 0xba, 0x00, + 0x62, 0xab, 0x0d, 0x78, 0x00, 0x62, 0xac, 0x13, + 0xb2, 0x00, 0x62, 0xb1, 0x0e, 0x4a, 0x00, 0x62, + 0xb3, 0x54, 0x71, 0x00, 0x62, 0xb5, 0x0c, 0x0d, + 0x00, 0x62, 0xb6, 0x54, 0x72, 0x00, 0x62, 0xb7, + 0x54, 0x73, 0x00, 0x62, 0xb9, 0x0e, 0xa3, 0x00, + 0x62, 0xba, 0x54, 0x74, 0x00, 0x62, 0xbb, 0x13, + 0x62, 0x00, 0x62, 0xbc, 0x05, 0x21, 0x00, 0x62, + 0xbd, 0x0b, 0xa8, 0x00, 0x62, 0xbe, 0x54, 0x75, + 0x00, 0x62, 0xbf, 0x54, 0x76, 0x00, 0x62, 0xc2, + 0x13, 0x6b, 0x00, 0x62, 0xc4, 0x38, 0xe4, 0x00, + 0x62, 0xc5, 0x0b, 0x72, 0x00, 0x62, 0xc6, 0x13, + 0x65, 0x00, 0x62, 0xc7, 0x13, 0x6c, 0x00, 0x62, + 0xc8, 0x13, 0x67, 0x00, 0x62, 0xc9, 0x13, 0x6e, + 0x00, 0x62, 0xca, 0x13, 0x6a, 0x00, 0x62, 0xcc, + 0x13, 0x69, 0x00, 0x62, 0xcd, 0x0d, 0x25, 0x00, + 0x62, 0xce, 0x54, 0x77, 0x00, 0x62, 0xcf, 0x13, + 0x63, 0x00, 0x62, 0xd0, 0x05, 0x7d, 0x00, 0x62, + 0xd1, 0x13, 0x61, 0x00, 0x62, 0xd2, 0x06, 0x8b, + 0x00, 0x62, 0xd3, 0x0b, 0x53, 0x00, 0x62, 0xd4, + 0x37, 0x31, 0x00, 0x62, 0xd5, 0x45, 0x02, 0x00, + 0x62, 0xd6, 0x41, 0xea, 0x00, 0x62, 0xd7, 0x13, + 0x60, 0x00, 0x62, 0xd8, 0x07, 0xc6, 0x00, 0x62, + 0xd9, 0x0a, 0x7f, 0x00, 0x62, 0xda, 0x4b, 0xbb, + 0x00, 0x62, 0xdb, 0x09, 0x9f, 0x00, 0x62, 0xdc, + 0x13, 0x68, 0x00, 0x62, 0xdd, 0x0d, 0x08, 0x00, + 0x62, 0xe0, 0x06, 0x8c, 0x00, 0x62, 0xe1, 0x05, + 0xa6, 0x00, 0x62, 0xea, 0x54, 0x78, 0x00, 0x62, + 0xec, 0x05, 0xc5, 0x00, 0x62, 0xed, 0x09, 0xe7, + 0x00, 0x62, 0xee, 0x13, 0x70, 0x00, 0x62, 0xef, + 0x13, 0x75, 0x00, 0x62, 0xf1, 0x13, 0x71, 0x00, + 0x62, 0xf2, 0x54, 0x79, 0x00, 0x62, 0xf3, 0x07, + 0x53, 0x00, 0x62, 0xf4, 0x4b, 0xbc, 0x00, 0x62, + 0xf5, 0x13, 0x76, 0x00, 0x62, 0xf6, 0x08, 0x70, + 0x00, 0x62, 0xf7, 0x07, 0xfb, 0x00, 0x62, 0xfc, + 0x38, 0xe5, 0x00, 0x62, 0xfd, 0x45, 0x04, 0x00, + 0x62, 0xfe, 0x09, 0x30, 0x00, 0x62, 0xff, 0x13, + 0x64, 0x00, 0x63, 0x01, 0x08, 0xcb, 0x00, 0x63, + 0x02, 0x13, 0x73, 0x00, 0x63, 0x03, 0x45, 0x05, + 0x00, 0x63, 0x04, 0x54, 0x7a, 0x00, 0x63, 0x07, + 0x08, 0xa6, 0x00, 0x63, 0x08, 0x13, 0x74, 0x00, + 0x63, 0x09, 0x04, 0x88, 0x00, 0x63, 0x0a, 0x38, + 0xe6, 0x00, 0x63, 0x0b, 0x54, 0x7b, 0x00, 0x63, + 0x0c, 0x13, 0x6f, 0x00, 0x63, 0x0d, 0x38, 0xe7, + 0x00, 0x63, 0x10, 0x45, 0x06, 0x00, 0x63, 0x11, + 0x0b, 0xc5, 0x00, 0x63, 0x13, 0x54, 0x7c, 0x00, + 0x63, 0x16, 0x4b, 0xbd, 0x00, 0x63, 0x18, 0x38, + 0xe8, 0x00, 0x63, 0x19, 0x06, 0x8d, 0x00, 0x63, + 0x1b, 0x37, 0x37, 0x00, 0x63, 0x1f, 0x06, 0xac, + 0x00, 0x63, 0x27, 0x13, 0x72, 0x00, 0x63, 0x28, + 0x04, 0x6b, 0x00, 0x63, 0x29, 0x54, 0x7d, 0x00, + 0x63, 0x2a, 0x4b, 0xbe, 0x00, 0x63, 0x2b, 0x08, + 0x33, 0x00, 0x63, 0x2d, 0x54, 0x7e, 0x00, 0x63, + 0x2f, 0x09, 0xfc, 0x00, 0x63, 0x32, 0x45, 0x09, + 0x00, 0x63, 0x35, 0x45, 0x0a, 0x00, 0x63, 0x36, + 0x4b, 0xbf, 0x00, 0x63, 0x39, 0x38, 0xe9, 0x00, + 0x63, 0x3a, 0x0c, 0x0e, 0x00, 0x63, 0x3b, 0x45, + 0x0b, 0x00, 0x63, 0x3c, 0x45, 0x0c, 0x00, 0x63, + 0x3d, 0x0d, 0x68, 0x00, 0x63, 0x3e, 0x13, 0x78, + 0x00, 0x63, 0x3f, 0x0a, 0xe0, 0x00, 0x63, 0x41, + 0x45, 0x0d, 0x00, 0x63, 0x42, 0x38, 0xea, 0x00, + 0x63, 0x43, 0x38, 0xeb, 0x00, 0x63, 0x44, 0x45, + 0x0e, 0x00, 0x63, 0x46, 0x4b, 0xc0, 0x00, 0x63, + 0x49, 0x0b, 0x0a, 0x00, 0x63, 0x4a, 0x54, 0x7f, + 0x00, 0x63, 0x4b, 0x4b, 0xc1, 0x00, 0x63, 0x4c, + 0x08, 0x79, 0x00, 0x63, 0x4d, 0x13, 0x79, 0x00, + 0x63, 0x4e, 0x45, 0x0f, 0x00, 0x63, 0x4f, 0x13, + 0x7b, 0x00, 0x63, 0x50, 0x13, 0x77, 0x00, 0x63, + 0x52, 0x54, 0x80, 0x00, 0x63, 0x53, 0x4b, 0xc2, + 0x00, 0x63, 0x54, 0x54, 0x81, 0x00, 0x63, 0x55, + 0x0e, 0x31, 0x00, 0x63, 0x57, 0x0b, 0xd9, 0x00, + 0x63, 0x58, 0x54, 0x82, 0x00, 0x63, 0x59, 0x45, + 0x11, 0x00, 0x63, 0x5b, 0x54, 0x83, 0x00, 0x63, + 0x5c, 0x0a, 0xde, 0x00, 0x63, 0x65, 0x38, 0xec, + 0x00, 0x63, 0x66, 0x54, 0x84, 0x00, 0x63, 0x67, + 0x0e, 0x4b, 0x00, 0x63, 0x68, 0x08, 0xfa, 0x00, + 0x63, 0x69, 0x13, 0x87, 0x00, 0x63, 0x6b, 0x13, + 0x86, 0x00, 0x63, 0x6c, 0x45, 0x14, 0x00, 0x63, + 0x6d, 0x54, 0x85, 0x00, 0x63, 0x6e, 0x0a, 0x3e, + 0x00, 0x63, 0x71, 0x4b, 0xc3, 0x00, 0x63, 0x72, + 0x07, 0x54, 0x00, 0x63, 0x74, 0x38, 0xed, 0x00, + 0x63, 0x75, 0x4b, 0xc4, 0x00, 0x63, 0x76, 0x13, + 0x80, 0x00, 0x63, 0x77, 0x09, 0xa1, 0x00, 0x63, + 0x78, 0x54, 0x86, 0x00, 0x63, 0x7a, 0x0c, 0xc0, + 0x00, 0x63, 0x7b, 0x0c, 0xe7, 0x00, 0x63, 0x7c, + 0x41, 0xeb, 0x00, 0x63, 0x7d, 0x38, 0xee, 0x00, + 0x63, 0x7f, 0x4b, 0xc5, 0x00, 0x63, 0x80, 0x13, + 0x7e, 0x00, 0x63, 0x82, 0x4b, 0xc6, 0x00, 0x63, + 0x83, 0x0a, 0xdf, 0x00, 0x63, 0x84, 0x38, 0xef, + 0x00, 0x63, 0x87, 0x38, 0xf0, 0x00, 0x63, 0x88, + 0x09, 0x24, 0x00, 0x63, 0x89, 0x13, 0x83, 0x00, + 0x63, 0x8a, 0x4b, 0xc7, 0x00, 0x63, 0x8c, 0x09, + 0xa0, 0x00, 0x63, 0x8e, 0x13, 0x7d, 0x00, 0x63, + 0x8f, 0x13, 0x82, 0x00, 0x63, 0x90, 0x38, 0xf1, + 0x00, 0x63, 0x92, 0x0d, 0x09, 0x00, 0x63, 0x94, + 0x45, 0x17, 0x00, 0x63, 0x95, 0x54, 0x87, 0x00, + 0x63, 0x96, 0x13, 0x7c, 0x00, 0x63, 0x98, 0x06, + 0xf7, 0x00, 0x63, 0x99, 0x45, 0x15, 0x00, 0x63, + 0x9a, 0x54, 0x88, 0x00, 0x63, 0x9b, 0x05, 0xbb, + 0x00, 0x63, 0x9e, 0x38, 0xf2, 0x00, 0x63, 0x9f, + 0x13, 0x84, 0x00, 0x63, 0xa0, 0x0f, 0x73, 0x00, + 0x63, 0xa1, 0x08, 0x3e, 0x00, 0x63, 0xa2, 0x0b, + 0x73, 0x00, 0x63, 0xa3, 0x13, 0x81, 0x00, 0x63, + 0xa4, 0x54, 0x89, 0x00, 0x63, 0xa5, 0x0a, 0x80, + 0x00, 0x63, 0xa6, 0x54, 0x8a, 0x00, 0x63, 0xa7, + 0x07, 0xc7, 0x00, 0x63, 0xa8, 0x0a, 0x2a, 0x00, + 0x63, 0xa9, 0x05, 0x08, 0x00, 0x63, 0xaa, 0x0a, + 0xbe, 0x00, 0x63, 0xab, 0x13, 0x7f, 0x00, 0x63, + 0xac, 0x06, 0x5f, 0x00, 0x63, 0xad, 0x54, 0x8b, + 0x00, 0x63, 0xae, 0x4b, 0xc8, 0x00, 0x63, 0xaf, + 0x4b, 0xc9, 0x00, 0x63, 0xb2, 0x07, 0x1d, 0x00, + 0x63, 0xb4, 0x0b, 0xeb, 0x00, 0x63, 0xb5, 0x13, + 0x85, 0x00, 0x63, 0xbb, 0x0a, 0xe1, 0x00, 0x63, + 0xbd, 0x45, 0x18, 0x00, 0x63, 0xbe, 0x13, 0x88, + 0x00, 0x63, 0xc0, 0x13, 0x8a, 0x00, 0x63, 0xc1, + 0x54, 0x8c, 0x00, 0x63, 0xc3, 0x0b, 0x17, 0x00, + 0x63, 0xc4, 0x13, 0x90, 0x00, 0x63, 0xc5, 0x54, + 0x8d, 0x00, 0x63, 0xc6, 0x13, 0x8b, 0x00, 0x63, + 0xc8, 0x54, 0x8e, 0x00, 0x63, 0xc9, 0x13, 0x8d, + 0x00, 0x63, 0xce, 0x54, 0x8f, 0x00, 0x63, 0xcf, + 0x0d, 0xb3, 0x00, 0x63, 0xd0, 0x0c, 0x0f, 0x00, + 0x63, 0xd1, 0x38, 0xf3, 0x00, 0x63, 0xd2, 0x13, + 0x8e, 0x00, 0x63, 0xd3, 0x54, 0x90, 0x00, 0x63, + 0xd4, 0x45, 0x19, 0x00, 0x63, 0xd5, 0x45, 0x1a, + 0x00, 0x63, 0xd6, 0x0f, 0x16, 0x00, 0x63, 0xda, + 0x0f, 0x32, 0x00, 0x63, 0xdb, 0x05, 0xf5, 0x00, + 0x63, 0xdc, 0x38, 0xf4, 0x00, 0x63, 0xe0, 0x45, + 0x1b, 0x00, 0x63, 0xe1, 0x04, 0x72, 0x00, 0x63, + 0xe3, 0x13, 0x8c, 0x00, 0x63, 0xe5, 0x41, 0xec, + 0x00, 0x63, 0xe9, 0x13, 0x89, 0x00, 0x63, 0xea, + 0x4b, 0xca, 0x00, 0x63, 0xeb, 0x45, 0x1c, 0x00, + 0x63, 0xec, 0x45, 0x1d, 0x00, 0x63, 0xed, 0x34, + 0x1c, 0x00, 0x63, 0xee, 0x06, 0x34, 0x00, 0x63, + 0xf2, 0x45, 0x1e, 0x00, 0x63, 0xf3, 0x54, 0x91, + 0x00, 0x63, 0xf4, 0x05, 0x09, 0x00, 0x63, 0xf5, + 0x21, 0x13, 0x00, 0x63, 0xf6, 0x13, 0x8f, 0x00, + 0x63, 0xf7, 0x36, 0x44, 0x00, 0x63, 0xf8, 0x4b, + 0xcb, 0x00, 0x63, 0xf9, 0x4b, 0xcc, 0x00, 0x63, + 0xfa, 0x0f, 0x33, 0x00, 0x64, 0x06, 0x13, 0x93, + 0x00, 0x64, 0x09, 0x38, 0xf5, 0x00, 0x64, 0x0a, + 0x54, 0x92, 0x00, 0x64, 0x0d, 0x0b, 0x1b, 0x00, + 0x64, 0x0f, 0x13, 0x9a, 0x00, 0x64, 0x10, 0x38, + 0xf6, 0x00, 0x64, 0x12, 0x4b, 0xcd, 0x00, 0x64, + 0x13, 0x13, 0x94, 0x00, 0x64, 0x14, 0x1e, 0x2c, + 0x00, 0x64, 0x16, 0x13, 0x91, 0x00, 0x64, 0x17, + 0x13, 0x98, 0x00, 0x64, 0x18, 0x4b, 0xce, 0x00, + 0x64, 0x1c, 0x13, 0x7a, 0x00, 0x64, 0x1e, 0x45, + 0x1f, 0x00, 0x64, 0x20, 0x4b, 0xcf, 0x00, 0x64, + 0x22, 0x38, 0xf7, 0x00, 0x64, 0x24, 0x4b, 0xd0, + 0x00, 0x64, 0x25, 0x45, 0x20, 0x00, 0x64, 0x26, + 0x13, 0x95, 0x00, 0x64, 0x28, 0x13, 0x99, 0x00, + 0x64, 0x29, 0x45, 0x21, 0x00, 0x64, 0x2a, 0x4b, + 0xd1, 0x00, 0x64, 0x2c, 0x0d, 0x56, 0x00, 0x64, + 0x2d, 0x0c, 0x65, 0x00, 0x64, 0x2f, 0x45, 0x22, + 0x00, 0x64, 0x30, 0x54, 0x93, 0x00, 0x64, 0x34, + 0x13, 0x92, 0x00, 0x64, 0x35, 0x4b, 0xd2, 0x00, + 0x64, 0x36, 0x13, 0x96, 0x00, 0x64, 0x3a, 0x07, + 0x1e, 0x00, 0x64, 0x3d, 0x4b, 0xd3, 0x00, 0x64, + 0x3e, 0x08, 0x61, 0x00, 0x64, 0x3f, 0x4b, 0xd4, + 0x00, 0x64, 0x42, 0x0a, 0x81, 0x00, 0x64, 0x4b, + 0x54, 0x94, 0x00, 0x64, 0x4e, 0x13, 0x9e, 0x00, + 0x64, 0x4f, 0x54, 0x95, 0x00, 0x64, 0x51, 0x1e, + 0x43, 0x00, 0x64, 0x52, 0x4b, 0xd5, 0x00, 0x64, + 0x53, 0x54, 0x96, 0x00, 0x64, 0x54, 0x38, 0xf8, + 0x00, 0x64, 0x58, 0x0c, 0x20, 0x00, 0x64, 0x5a, + 0x45, 0x23, 0x00, 0x64, 0x5b, 0x38, 0xf9, 0x00, + 0x64, 0x5c, 0x54, 0x97, 0x00, 0x64, 0x5d, 0x45, + 0x24, 0x00, 0x64, 0x5f, 0x4b, 0xd6, 0x00, 0x64, + 0x60, 0x21, 0x14, 0x00, 0x64, 0x61, 0x54, 0x98, + 0x00, 0x64, 0x63, 0x54, 0x99, 0x00, 0x64, 0x67, + 0x13, 0x9b, 0x00, 0x64, 0x69, 0x0e, 0x8e, 0x00, + 0x64, 0x6d, 0x38, 0xfa, 0x00, 0x64, 0x6f, 0x13, + 0x9c, 0x00, 0x64, 0x73, 0x45, 0x25, 0x00, 0x64, + 0x74, 0x4b, 0xd7, 0x00, 0x64, 0x76, 0x13, 0x9d, + 0x00, 0x64, 0x78, 0x0e, 0xda, 0x00, 0x64, 0x79, + 0x41, 0xed, 0x00, 0x64, 0x7a, 0x0a, 0x46, 0x00, + 0x64, 0x7b, 0x38, 0xfb, 0x00, 0x64, 0x7d, 0x45, + 0x26, 0x00, 0x64, 0x83, 0x07, 0x38, 0x00, 0x64, + 0x85, 0x54, 0x9a, 0x00, 0x64, 0x87, 0x45, 0x27, + 0x00, 0x64, 0x88, 0x13, 0xa4, 0x00, 0x64, 0x8f, + 0x54, 0x9b, 0x00, 0x64, 0x90, 0x4b, 0xd8, 0x00, + 0x64, 0x91, 0x45, 0x28, 0x00, 0x64, 0x92, 0x08, + 0x83, 0x00, 0x64, 0x93, 0x13, 0xa1, 0x00, 0x64, + 0x95, 0x13, 0xa0, 0x00, 0x64, 0x98, 0x4b, 0xd9, + 0x00, 0x64, 0x99, 0x4b, 0xda, 0x00, 0x64, 0x9a, + 0x0c, 0xe8, 0x00, 0x64, 0x9b, 0x54, 0x9c, 0x00, + 0x64, 0x9d, 0x21, 0x15, 0x00, 0x64, 0x9e, 0x0c, + 0x8d, 0x00, 0x64, 0x9f, 0x45, 0x29, 0x00, 0x64, + 0xa1, 0x54, 0x9d, 0x00, 0x64, 0xa3, 0x54, 0x9e, + 0x00, 0x64, 0xa4, 0x0c, 0x2b, 0x00, 0x64, 0xa5, + 0x13, 0xa2, 0x00, 0x64, 0xa6, 0x54, 0x9f, 0x00, + 0x64, 0xa8, 0x54, 0xa0, 0x00, 0x64, 0xa9, 0x13, + 0xa3, 0x00, 0x64, 0xab, 0x0d, 0xe1, 0x00, 0x64, + 0xac, 0x4b, 0xdb, 0x00, 0x64, 0xad, 0x0c, 0xfb, + 0x00, 0x64, 0xae, 0x08, 0x71, 0x00, 0x64, 0xb0, + 0x0a, 0x95, 0x00, 0x64, 0xb2, 0x0e, 0x7e, 0x00, + 0x64, 0xb3, 0x4b, 0xdc, 0x00, 0x64, 0xb9, 0x05, + 0xa7, 0x00, 0x64, 0xbb, 0x13, 0xaa, 0x00, 0x64, + 0xbc, 0x13, 0xa5, 0x00, 0x64, 0xbd, 0x54, 0xa1, + 0x00, 0x64, 0xbe, 0x38, 0xfc, 0x00, 0x64, 0xbf, + 0x38, 0xfd, 0x00, 0x64, 0xc1, 0x0f, 0x34, 0x00, + 0x64, 0xc2, 0x13, 0xac, 0x00, 0x64, 0xc4, 0x41, + 0xee, 0x00, 0x64, 0xc5, 0x13, 0xa8, 0x00, 0x64, + 0xc7, 0x13, 0xa9, 0x00, 0x64, 0xc9, 0x54, 0xa2, + 0x00, 0x64, 0xca, 0x34, 0x1d, 0x00, 0x64, 0xcb, + 0x45, 0x2a, 0x00, 0x64, 0xcc, 0x45, 0x2b, 0x00, + 0x64, 0xcd, 0x0a, 0xe2, 0x00, 0x64, 0xce, 0x21, + 0x16, 0x00, 0x64, 0xd0, 0x41, 0xef, 0x00, 0x64, + 0xd1, 0x54, 0xa3, 0x00, 0x64, 0xd2, 0x13, 0xa7, + 0x00, 0x64, 0xd4, 0x13, 0x66, 0x00, 0x64, 0xd5, + 0x45, 0x2c, 0x00, 0x64, 0xd7, 0x45, 0x2d, 0x00, + 0x64, 0xd8, 0x13, 0xab, 0x00, 0x64, 0xda, 0x13, + 0xa6, 0x00, 0x64, 0xe0, 0x13, 0xb0, 0x00, 0x64, + 0xe1, 0x13, 0xb1, 0x00, 0x64, 0xe2, 0x0c, 0x21, + 0x00, 0x64, 0xe3, 0x13, 0xb3, 0x00, 0x64, 0xe4, + 0x45, 0x2f, 0x00, 0x64, 0xe5, 0x38, 0xfe, 0x00, + 0x64, 0xe6, 0x08, 0x72, 0x00, 0x64, 0xe7, 0x13, + 0xae, 0x00, 0x64, 0xe9, 0x54, 0xa4, 0x00, 0x64, + 0xea, 0x54, 0xa5, 0x00, 0x64, 0xec, 0x06, 0x56, + 0x00, 0x64, 0xed, 0x4b, 0xdd, 0x00, 0x64, 0xef, + 0x13, 0xb4, 0x00, 0x64, 0xf0, 0x4b, 0xde, 0x00, + 0x64, 0xf1, 0x13, 0xad, 0x00, 0x64, 0xf2, 0x13, + 0xb8, 0x00, 0x64, 0xf4, 0x13, 0xb7, 0x00, 0x64, + 0xf5, 0x54, 0xa6, 0x00, 0x64, 0xf6, 0x13, 0xb6, + 0x00, 0x64, 0xf7, 0x38, 0xff, 0x00, 0x64, 0xfa, + 0x13, 0xb9, 0x00, 0x64, 0xfb, 0x39, 0x00, 0x00, + 0x64, 0xfd, 0x13, 0xbb, 0x00, 0x64, 0xfe, 0x09, + 0xd9, 0x00, 0x64, 0xff, 0x45, 0x30, 0x00, 0x65, + 0x00, 0x13, 0xba, 0x00, 0x65, 0x01, 0x54, 0xa7, + 0x00, 0x65, 0x04, 0x39, 0x01, 0x00, 0x65, 0x05, + 0x13, 0xbe, 0x00, 0x65, 0x08, 0x54, 0xa8, 0x00, + 0x65, 0x09, 0x54, 0xa9, 0x00, 0x65, 0x0a, 0x54, + 0xaa, 0x00, 0x65, 0x0f, 0x45, 0x32, 0x00, 0x65, + 0x13, 0x54, 0xab, 0x00, 0x65, 0x14, 0x45, 0x33, + 0x00, 0x65, 0x16, 0x39, 0x02, 0x00, 0x65, 0x18, + 0x13, 0xbc, 0x00, 0x65, 0x19, 0x39, 0x03, 0x00, + 0x65, 0x1b, 0x4b, 0xdf, 0x00, 0x65, 0x1c, 0x13, + 0xbd, 0x00, 0x65, 0x1d, 0x13, 0x97, 0x00, 0x65, + 0x1e, 0x45, 0x35, 0x00, 0x65, 0x1f, 0x4b, 0xe0, + 0x00, 0x65, 0x22, 0x1e, 0x97, 0x00, 0x65, 0x23, + 0x13, 0xc0, 0x00, 0x65, 0x24, 0x13, 0xbf, 0x00, + 0x65, 0x26, 0x54, 0xac, 0x00, 0x65, 0x29, 0x41, + 0xf0, 0x00, 0x65, 0x2a, 0x13, 0x9f, 0x00, 0x65, + 0x2b, 0x13, 0xc1, 0x00, 0x65, 0x2c, 0x13, 0xb5, + 0x00, 0x65, 0x2e, 0x4b, 0xe1, 0x00, 0x65, 0x2f, + 0x08, 0xa7, 0x00, 0x65, 0x31, 0x54, 0xad, 0x00, + 0x65, 0x32, 0x45, 0x36, 0x00, 0x65, 0x34, 0x13, + 0xc2, 0x00, 0x65, 0x35, 0x13, 0xc3, 0x00, 0x65, + 0x36, 0x13, 0xc5, 0x00, 0x65, 0x37, 0x13, 0xc4, + 0x00, 0x65, 0x38, 0x13, 0xc6, 0x00, 0x65, 0x39, + 0x05, 0x7e, 0x00, 0x65, 0x3a, 0x54, 0xae, 0x00, + 0x65, 0x3b, 0x07, 0xc8, 0x00, 0x65, 0x3c, 0x54, + 0xaf, 0x00, 0x65, 0x3d, 0x54, 0xb0, 0x00, 0x65, + 0x3e, 0x0e, 0x4c, 0x00, 0x65, 0x3f, 0x0a, 0x53, + 0x00, 0x65, 0x43, 0x54, 0xb1, 0x00, 0x65, 0x44, + 0x45, 0x37, 0x00, 0x65, 0x45, 0x07, 0x82, 0x00, + 0x65, 0x47, 0x39, 0x04, 0x00, 0x65, 0x48, 0x13, + 0xc8, 0x00, 0x65, 0x49, 0x4b, 0xe2, 0x00, 0x65, + 0x4d, 0x13, 0xcb, 0x00, 0x65, 0x4e, 0x21, 0x17, + 0x00, 0x65, 0x4f, 0x34, 0x45, 0x00, 0x65, 0x50, + 0x54, 0xb2, 0x00, 0x65, 0x51, 0x06, 0x79, 0x00, + 0x65, 0x52, 0x54, 0xb3, 0x00, 0x65, 0x54, 0x45, + 0x38, 0x00, 0x65, 0x55, 0x13, 0xca, 0x00, 0x65, + 0x56, 0x13, 0xc9, 0x00, 0x65, 0x57, 0x0d, 0x0a, + 0x00, 0x65, 0x58, 0x13, 0xcc, 0x00, 0x65, 0x59, + 0x06, 0xad, 0x00, 0x65, 0x5d, 0x13, 0xce, 0x00, + 0x65, 0x5e, 0x13, 0xcd, 0x00, 0x65, 0x5f, 0x54, + 0xb4, 0x00, 0x65, 0x60, 0x4b, 0xe3, 0x00, 0x65, + 0x62, 0x05, 0xf6, 0x00, 0x65, 0x63, 0x08, 0x84, + 0x00, 0x65, 0x66, 0x0c, 0xb0, 0x00, 0x65, 0x67, + 0x39, 0x05, 0x00, 0x65, 0x6b, 0x45, 0x39, 0x00, + 0x65, 0x6c, 0x07, 0x1f, 0x00, 0x65, 0x70, 0x0a, + 0x3a, 0x00, 0x65, 0x72, 0x13, 0xcf, 0x00, 0x65, + 0x74, 0x0a, 0x54, 0x00, 0x65, 0x75, 0x0c, 0x22, + 0x00, 0x65, 0x77, 0x0d, 0xd1, 0x00, 0x65, 0x78, + 0x13, 0xd0, 0x00, 0x65, 0x7a, 0x45, 0x3a, 0x00, + 0x65, 0x7d, 0x54, 0xb5, 0x00, 0x65, 0x81, 0x39, + 0x06, 0x00, 0x65, 0x82, 0x13, 0xd1, 0x00, 0x65, + 0x83, 0x13, 0xd2, 0x00, 0x65, 0x84, 0x45, 0x3b, + 0x00, 0x65, 0x85, 0x39, 0x07, 0x00, 0x65, 0x87, + 0x0e, 0x08, 0x00, 0x65, 0x88, 0x12, 0x0c, 0x00, + 0x65, 0x89, 0x0a, 0x6a, 0x00, 0x65, 0x8a, 0x45, + 0x3c, 0x00, 0x65, 0x8c, 0x0d, 0xbe, 0x00, 0x65, + 0x8e, 0x08, 0x48, 0x00, 0x65, 0x90, 0x0d, 0x79, + 0x00, 0x65, 0x91, 0x0d, 0x57, 0x00, 0x65, 0x92, + 0x4b, 0xe4, 0x00, 0x65, 0x95, 0x4b, 0xe5, 0x00, + 0x65, 0x97, 0x0c, 0x47, 0x00, 0x65, 0x98, 0x54, + 0xb6, 0x00, 0x65, 0x99, 0x0f, 0x89, 0x00, 0x65, + 0x9b, 0x13, 0xd4, 0x00, 0x65, 0x9c, 0x08, 0xfc, + 0x00, 0x65, 0x9d, 0x41, 0xf1, 0x00, 0x65, 0x9f, + 0x13, 0xd5, 0x00, 0x65, 0xa0, 0x54, 0xb7, 0x00, + 0x65, 0xa1, 0x04, 0x7a, 0x00, 0x65, 0xa3, 0x54, + 0xb8, 0x00, 0x65, 0xa4, 0x06, 0xcc, 0x00, 0x65, + 0xa5, 0x0a, 0x71, 0x00, 0x65, 0xa6, 0x54, 0xb9, + 0x00, 0x65, 0xa7, 0x0d, 0xd2, 0x00, 0x65, 0xab, + 0x13, 0xd6, 0x00, 0x65, 0xac, 0x08, 0x90, 0x00, + 0x65, 0xad, 0x0b, 0x85, 0x00, 0x65, 0xae, 0x54, + 0xba, 0x00, 0x65, 0xaf, 0x08, 0xa9, 0x00, 0x65, + 0xb0, 0x09, 0xfd, 0x00, 0x65, 0xb2, 0x45, 0x3d, + 0x00, 0x65, 0xb3, 0x54, 0xbb, 0x00, 0x65, 0xb4, + 0x4b, 0xe6, 0x00, 0x65, 0xb5, 0x45, 0x3e, 0x00, + 0x65, 0xb7, 0x13, 0xd7, 0x00, 0x65, 0xb8, 0x45, + 0x3f, 0x00, 0x65, 0xb9, 0x0e, 0x4d, 0x00, 0x65, + 0xbc, 0x05, 0x19, 0x00, 0x65, 0xbd, 0x08, 0xaa, + 0x00, 0x65, 0xbe, 0x4b, 0xe7, 0x00, 0x65, 0xbf, + 0x45, 0x40, 0x00, 0x65, 0xc1, 0x13, 0xda, 0x00, + 0x65, 0xc2, 0x39, 0x08, 0x00, 0x65, 0xc3, 0x13, + 0xd8, 0x00, 0x65, 0xc4, 0x13, 0xdb, 0x00, 0x65, + 0xc5, 0x0f, 0x81, 0x00, 0x65, 0xc6, 0x13, 0xd9, + 0x00, 0x65, 0xc8, 0x4b, 0xe8, 0x00, 0x65, 0xc9, + 0x45, 0x41, 0x00, 0x65, 0xcb, 0x0a, 0x9f, 0x00, + 0x65, 0xcc, 0x13, 0xdc, 0x00, 0x65, 0xce, 0x4b, + 0xe9, 0x00, 0x65, 0xcf, 0x0b, 0x12, 0x00, 0x65, + 0xd0, 0x4b, 0xea, 0x00, 0x65, 0xd2, 0x13, 0xdd, + 0x00, 0x65, 0xd4, 0x45, 0x42, 0x00, 0x65, 0xd6, + 0x54, 0xbc, 0x00, 0x65, 0xd7, 0x06, 0x36, 0x00, + 0x65, 0xd8, 0x54, 0xbd, 0x00, 0x65, 0xd9, 0x13, + 0xdf, 0x00, 0x65, 0xdb, 0x13, 0xde, 0x00, 0x65, + 0xdf, 0x4b, 0xeb, 0x00, 0x65, 0xe0, 0x13, 0xe0, + 0x00, 0x65, 0xe1, 0x13, 0xe1, 0x00, 0x65, 0xe2, + 0x34, 0x16, 0x00, 0x65, 0xe3, 0x35, 0x85, 0x00, + 0x65, 0xe5, 0x0c, 0xd4, 0x00, 0x65, 0xe6, 0x0b, + 0x74, 0x00, 0x65, 0xe7, 0x06, 0x86, 0x00, 0x65, + 0xe8, 0x08, 0xab, 0x00, 0x65, 0xe9, 0x0a, 0xe3, + 0x00, 0x65, 0xec, 0x09, 0x66, 0x00, 0x65, 0xed, + 0x04, 0x74, 0x00, 0x65, 0xf0, 0x39, 0x09, 0x00, + 0x65, 0xf1, 0x13, 0xe2, 0x00, 0x65, 0xf2, 0x39, + 0x0a, 0x00, 0x65, 0xf4, 0x54, 0xbf, 0x00, 0x65, + 0xf5, 0x54, 0xc0, 0x00, 0x65, 0xf9, 0x45, 0x44, + 0x00, 0x65, 0xfa, 0x05, 0x22, 0x00, 0x65, 0xfb, + 0x13, 0xe6, 0x00, 0x65, 0xfc, 0x45, 0x45, 0x00, + 0x65, 0xfe, 0x54, 0xc1, 0x00, 0x65, 0xff, 0x54, + 0xc2, 0x00, 0x66, 0x00, 0x21, 0x18, 0x00, 0x66, + 0x02, 0x07, 0xc9, 0x00, 0x66, 0x03, 0x13, 0xe5, + 0x00, 0x66, 0x04, 0x45, 0x46, 0x00, 0x66, 0x06, + 0x08, 0x1b, 0x00, 0x66, 0x07, 0x09, 0xa2, 0x00, + 0x66, 0x08, 0x45, 0x47, 0x00, 0x66, 0x09, 0x21, + 0x1a, 0x00, 0x66, 0x0a, 0x13, 0xe4, 0x00, 0x66, + 0x0c, 0x09, 0xa3, 0x00, 0x66, 0x0d, 0x54, 0xc3, + 0x00, 0x66, 0x0e, 0x0e, 0xcc, 0x00, 0x66, 0x0f, + 0x08, 0x1a, 0x00, 0x66, 0x11, 0x54, 0xc4, 0x00, + 0x66, 0x12, 0x54, 0xc5, 0x00, 0x66, 0x13, 0x04, + 0x9b, 0x00, 0x66, 0x14, 0x0a, 0x72, 0x00, 0x66, + 0x15, 0x21, 0x19, 0x00, 0x66, 0x16, 0x54, 0xc6, + 0x00, 0x66, 0x1c, 0x13, 0xeb, 0x00, 0x66, 0x1d, + 0x54, 0xc7, 0x00, 0x66, 0x1e, 0x4f, 0x50, 0x00, + 0x66, 0x1f, 0x0a, 0x55, 0x00, 0x66, 0x20, 0x04, + 0xe9, 0x00, 0x66, 0x21, 0x45, 0x48, 0x00, 0x66, + 0x22, 0x41, 0xf3, 0x00, 0x66, 0x23, 0x54, 0xc8, + 0x00, 0x66, 0x24, 0x21, 0x1d, 0x00, 0x66, 0x25, + 0x09, 0x5f, 0x00, 0x66, 0x26, 0x54, 0xc9, 0x00, + 0x66, 0x27, 0x0e, 0x94, 0x00, 0x66, 0x28, 0x08, + 0x62, 0x00, 0x66, 0x29, 0x54, 0xca, 0x00, 0x66, + 0x2a, 0x45, 0x49, 0x00, 0x66, 0x2b, 0x41, 0xf4, + 0x00, 0x66, 0x2c, 0x39, 0x0b, 0x00, 0x66, 0x2d, + 0x09, 0xa4, 0x00, 0x66, 0x2e, 0x21, 0x1b, 0x00, + 0x66, 0x2f, 0x0a, 0x4b, 0x00, 0x66, 0x30, 0x41, + 0xf5, 0x00, 0x66, 0x31, 0x20, 0xae, 0x00, 0x66, + 0x33, 0x41, 0xf6, 0x00, 0x66, 0x34, 0x13, 0xea, + 0x00, 0x66, 0x35, 0x13, 0xe8, 0x00, 0x66, 0x36, + 0x13, 0xe9, 0x00, 0x66, 0x37, 0x54, 0xcc, 0x00, + 0x66, 0x39, 0x54, 0xcb, 0x00, 0x66, 0x3a, 0x41, + 0xf2, 0x00, 0x66, 0x3b, 0x1e, 0x00, 0x00, 0x66, + 0x3c, 0x0b, 0xa9, 0x00, 0x66, 0x3f, 0x14, 0x09, + 0x00, 0x66, 0x40, 0x54, 0xcd, 0x00, 0x66, 0x41, + 0x13, 0xef, 0x00, 0x66, 0x42, 0x08, 0xcc, 0x00, + 0x66, 0x43, 0x07, 0xca, 0x00, 0x66, 0x44, 0x13, + 0xed, 0x00, 0x66, 0x45, 0x45, 0x4a, 0x00, 0x66, + 0x46, 0x54, 0xce, 0x00, 0x66, 0x48, 0x41, 0xf7, + 0x00, 0x66, 0x49, 0x13, 0xee, 0x00, 0x66, 0x4a, + 0x54, 0xcf, 0x00, 0x66, 0x4b, 0x09, 0xfe, 0x00, + 0x66, 0x4c, 0x39, 0x0c, 0x00, 0x66, 0x4e, 0x45, + 0x4c, 0x00, 0x66, 0x4f, 0x13, 0xec, 0x00, 0x66, + 0x51, 0x45, 0x4b, 0x00, 0x66, 0x52, 0x08, 0x7d, + 0x00, 0x66, 0x57, 0x21, 0x1f, 0x00, 0x66, 0x58, + 0x54, 0xd0, 0x00, 0x66, 0x59, 0x21, 0x20, 0x00, + 0x66, 0x5a, 0x34, 0x41, 0x00, 0x66, 0x5b, 0x39, + 0x0d, 0x00, 0x66, 0x5c, 0x39, 0x0e, 0x00, 0x66, + 0x5d, 0x13, 0xf1, 0x00, 0x66, 0x5e, 0x13, 0xf0, + 0x00, 0x66, 0x5f, 0x13, 0xf5, 0x00, 0x66, 0x60, + 0x54, 0xd1, 0x00, 0x66, 0x61, 0x39, 0x0f, 0x00, + 0x66, 0x62, 0x13, 0xf6, 0x00, 0x66, 0x63, 0x37, + 0x3a, 0x00, 0x66, 0x64, 0x13, 0xf2, 0x00, 0x66, + 0x65, 0x21, 0x1e, 0x00, 0x66, 0x66, 0x05, 0x80, + 0x00, 0x66, 0x67, 0x13, 0xf3, 0x00, 0x66, 0x68, + 0x13, 0xf4, 0x00, 0x66, 0x69, 0x0d, 0x69, 0x00, + 0x66, 0x6a, 0x45, 0x51, 0x00, 0x66, 0x6b, 0x39, + 0x10, 0x00, 0x66, 0x6c, 0x45, 0x52, 0x00, 0x66, + 0x6d, 0x45, 0x53, 0x00, 0x66, 0x6e, 0x0d, 0xd3, + 0x00, 0x66, 0x6f, 0x07, 0x20, 0x00, 0x66, 0x70, + 0x13, 0xf7, 0x00, 0x66, 0x73, 0x21, 0x22, 0x00, + 0x66, 0x74, 0x21, 0x21, 0x00, 0x66, 0x75, 0x54, + 0xd2, 0x00, 0x66, 0x76, 0x09, 0xa5, 0x00, 0x66, + 0x77, 0x41, 0xf9, 0x00, 0x66, 0x78, 0x41, 0xfa, + 0x00, 0x66, 0x79, 0x54, 0xd4, 0x00, 0x66, 0x7a, + 0x0b, 0x90, 0x00, 0x66, 0x7b, 0x45, 0x54, 0x00, + 0x66, 0x7c, 0x54, 0xd5, 0x00, 0x66, 0x7e, 0x4b, + 0xec, 0x00, 0x66, 0x7f, 0x54, 0xd3, 0x00, 0x66, + 0x80, 0x45, 0x55, 0x00, 0x66, 0x81, 0x06, 0xbf, + 0x00, 0x66, 0x83, 0x13, 0xf8, 0x00, 0x66, 0x84, + 0x13, 0xfc, 0x00, 0x66, 0x87, 0x05, 0x4b, 0x00, + 0x66, 0x88, 0x13, 0xf9, 0x00, 0x66, 0x89, 0x13, + 0xfb, 0x00, 0x66, 0x8b, 0x4b, 0xed, 0x00, 0x66, + 0x8c, 0x4b, 0xee, 0x00, 0x66, 0x8d, 0x41, 0xfb, + 0x00, 0x66, 0x8e, 0x13, 0xfa, 0x00, 0x66, 0x90, + 0x45, 0x56, 0x00, 0x66, 0x91, 0x09, 0x75, 0x00, + 0x66, 0x92, 0x45, 0x57, 0x00, 0x66, 0x96, 0x0b, + 0x86, 0x00, 0x66, 0x97, 0x04, 0x89, 0x00, 0x66, + 0x98, 0x13, 0xfd, 0x00, 0x66, 0x99, 0x21, 0x23, + 0x00, 0x66, 0x9a, 0x54, 0xd6, 0x00, 0x66, 0x9b, + 0x54, 0xd7, 0x00, 0x66, 0x9c, 0x54, 0xd8, 0x00, + 0x66, 0x9d, 0x13, 0xfe, 0x00, 0x66, 0x9f, 0x54, + 0xd9, 0x00, 0x66, 0xa0, 0x21, 0x24, 0x00, 0x66, + 0xa2, 0x0b, 0xc6, 0x00, 0x66, 0xa4, 0x39, 0x12, + 0x00, 0x66, 0xa6, 0x0f, 0xb9, 0x00, 0x66, 0xab, + 0x08, 0x91, 0x00, 0x66, 0xad, 0x45, 0x59, 0x00, + 0x66, 0xae, 0x0e, 0x3b, 0x00, 0x66, 0xb1, 0x45, + 0x5a, 0x00, 0x66, 0xb2, 0x21, 0x25, 0x00, 0x66, + 0xb3, 0x4b, 0xef, 0x00, 0x66, 0xb4, 0x0e, 0x6b, + 0x00, 0x66, 0xb5, 0x45, 0x5b, 0x00, 0x66, 0xb8, + 0x14, 0x05, 0x00, 0x66, 0xb9, 0x14, 0x00, 0x00, + 0x66, 0xbb, 0x41, 0xfc, 0x00, 0x66, 0xbc, 0x14, + 0x03, 0x00, 0x66, 0xbe, 0x14, 0x02, 0x00, 0x66, + 0xbf, 0x21, 0x26, 0x00, 0x66, 0xc0, 0x4b, 0xf0, + 0x00, 0x66, 0xc1, 0x13, 0xff, 0x00, 0x66, 0xc2, + 0x54, 0xdb, 0x00, 0x66, 0xc3, 0x54, 0xdc, 0x00, + 0x66, 0xc4, 0x14, 0x04, 0x00, 0x66, 0xc6, 0x34, + 0x55, 0x00, 0x66, 0xc7, 0x0c, 0xb6, 0x00, 0x66, + 0xc8, 0x39, 0x13, 0x00, 0x66, 0xc9, 0x14, 0x01, + 0x00, 0x66, 0xcc, 0x54, 0xdd, 0x00, 0x66, 0xce, + 0x54, 0xde, 0x00, 0x66, 0xcf, 0x4b, 0xf1, 0x00, + 0x66, 0xd4, 0x54, 0xdf, 0x00, 0x66, 0xd6, 0x14, + 0x06, 0x00, 0x66, 0xd9, 0x09, 0x76, 0x00, 0x66, + 0xda, 0x14, 0x07, 0x00, 0x66, 0xdb, 0x41, 0xfd, + 0x00, 0x66, 0xdc, 0x0f, 0x35, 0x00, 0x66, 0xdd, + 0x0d, 0x2e, 0x00, 0x66, 0xdf, 0x54, 0xe0, 0x00, + 0x66, 0xe0, 0x14, 0x08, 0x00, 0x66, 0xe6, 0x14, + 0x0a, 0x00, 0x66, 0xe8, 0x41, 0xfe, 0x00, 0x66, + 0xe9, 0x14, 0x0b, 0x00, 0x66, 0xeb, 0x54, 0xe1, + 0x00, 0x66, 0xec, 0x39, 0x14, 0x00, 0x66, 0xee, + 0x54, 0xe2, 0x00, 0x66, 0xf0, 0x14, 0x0c, 0x00, + 0x66, 0xf2, 0x06, 0xc2, 0x00, 0x66, 0xf3, 0x04, + 0xea, 0x00, 0x66, 0xf4, 0x07, 0xcb, 0x00, 0x66, + 0xf5, 0x14, 0x0d, 0x00, 0x66, 0xf7, 0x14, 0x0e, + 0x00, 0x66, 0xf8, 0x09, 0x7b, 0x00, 0x66, 0xf9, + 0x0a, 0xe4, 0x00, 0x66, 0xfa, 0x21, 0x27, 0x00, + 0x66, 0xfb, 0x20, 0xb1, 0x00, 0x66, 0xfc, 0x10, + 0xed, 0x00, 0x66, 0xfd, 0x0a, 0xc0, 0x00, 0x66, + 0xfe, 0x0a, 0xbf, 0x00, 0x66, 0xff, 0x0b, 0x38, + 0x00, 0x67, 0x00, 0x08, 0x37, 0x00, 0x67, 0x01, + 0x45, 0x5f, 0x00, 0x67, 0x03, 0x10, 0x4b, 0x00, + 0x67, 0x05, 0x39, 0x15, 0x00, 0x67, 0x07, 0x54, + 0xe3, 0x00, 0x67, 0x08, 0x07, 0x44, 0x00, 0x67, + 0x09, 0x0f, 0x17, 0x00, 0x67, 0x0b, 0x0e, 0x4e, + 0x00, 0x67, 0x0d, 0x0d, 0xf0, 0x00, 0x67, 0x0e, + 0x21, 0x28, 0x00, 0x67, 0x0f, 0x14, 0x0f, 0x00, + 0x67, 0x12, 0x45, 0x60, 0x00, 0x67, 0x13, 0x39, + 0x16, 0x00, 0x67, 0x14, 0x08, 0x63, 0x00, 0x67, + 0x15, 0x0b, 0xdb, 0x00, 0x67, 0x16, 0x14, 0x10, + 0x00, 0x67, 0x17, 0x4f, 0x51, 0x00, 0x67, 0x19, + 0x45, 0x62, 0x00, 0x67, 0x1b, 0x0e, 0x6c, 0x00, + 0x67, 0x1c, 0x54, 0xe4, 0x00, 0x67, 0x1d, 0x0b, + 0xc7, 0x00, 0x67, 0x1e, 0x14, 0x11, 0x00, 0x67, + 0x1f, 0x06, 0x38, 0x00, 0x67, 0x20, 0x54, 0xe5, + 0x00, 0x67, 0x22, 0x54, 0xe6, 0x00, 0x67, 0x25, + 0x4b, 0xf2, 0x00, 0x67, 0x26, 0x14, 0x12, 0x00, + 0x67, 0x27, 0x14, 0x13, 0x00, 0x67, 0x28, 0x0e, + 0xe6, 0x00, 0x67, 0x2a, 0x0e, 0xb0, 0x00, 0x67, + 0x2b, 0x0e, 0xa4, 0x00, 0x67, 0x2c, 0x0e, 0x8a, + 0x00, 0x67, 0x2d, 0x08, 0x73, 0x00, 0x67, 0x2e, + 0x14, 0x15, 0x00, 0x67, 0x31, 0x09, 0x17, 0x00, + 0x67, 0x33, 0x39, 0x17, 0x00, 0x67, 0x34, 0x0e, + 0x7f, 0x00, 0x67, 0x35, 0x4b, 0xf3, 0x00, 0x67, + 0x36, 0x14, 0x17, 0x00, 0x67, 0x37, 0x14, 0x1a, + 0x00, 0x67, 0x38, 0x14, 0x19, 0x00, 0x67, 0x3a, + 0x06, 0x35, 0x00, 0x67, 0x3d, 0x06, 0x7a, 0x00, + 0x67, 0x3e, 0x54, 0xe7, 0x00, 0x67, 0x3f, 0x14, + 0x16, 0x00, 0x67, 0x41, 0x14, 0x18, 0x00, 0x67, + 0x43, 0x35, 0xb7, 0x00, 0x67, 0x45, 0x54, 0xe8, + 0x00, 0x67, 0x46, 0x14, 0x1b, 0x00, 0x67, 0x47, + 0x41, 0xff, 0x00, 0x67, 0x48, 0x39, 0x18, 0x00, + 0x67, 0x49, 0x0a, 0x3f, 0x00, 0x67, 0x4c, 0x39, + 0x19, 0x00, 0x67, 0x4d, 0x45, 0x65, 0x00, 0x67, + 0x4e, 0x0f, 0x65, 0x00, 0x67, 0x4f, 0x04, 0x8d, + 0x00, 0x67, 0x50, 0x08, 0x50, 0x00, 0x67, 0x51, + 0x0b, 0x1c, 0x00, 0x67, 0x53, 0x09, 0x09, 0x00, + 0x67, 0x54, 0x45, 0x66, 0x00, 0x67, 0x55, 0x4b, + 0xf4, 0x00, 0x67, 0x56, 0x09, 0xdb, 0x00, 0x67, + 0x59, 0x14, 0x1e, 0x00, 0x67, 0x5c, 0x0c, 0x48, + 0x00, 0x67, 0x5d, 0x45, 0x67, 0x00, 0x67, 0x5e, + 0x14, 0x1c, 0x00, 0x67, 0x5f, 0x0b, 0x0b, 0x00, + 0x67, 0x60, 0x14, 0x1d, 0x00, 0x67, 0x61, 0x09, + 0xda, 0x00, 0x67, 0x62, 0x0e, 0xe9, 0x00, 0x67, + 0x63, 0x14, 0x1f, 0x00, 0x67, 0x64, 0x14, 0x20, + 0x00, 0x67, 0x65, 0x0f, 0x52, 0x00, 0x67, 0x66, + 0x21, 0x2a, 0x00, 0x67, 0x6a, 0x14, 0x25, 0x00, + 0x67, 0x6c, 0x54, 0xe9, 0x00, 0x67, 0x6d, 0x07, + 0xcc, 0x00, 0x67, 0x6e, 0x35, 0x71, 0x00, 0x67, + 0x6f, 0x0d, 0x0b, 0x00, 0x67, 0x70, 0x14, 0x22, + 0x00, 0x67, 0x71, 0x0c, 0x66, 0x00, 0x67, 0x72, + 0x13, 0xe3, 0x00, 0x67, 0x73, 0x13, 0xe7, 0x00, + 0x67, 0x74, 0x45, 0x6b, 0x00, 0x67, 0x75, 0x06, + 0x69, 0x00, 0x67, 0x76, 0x39, 0x1a, 0x00, 0x67, + 0x77, 0x0c, 0xfd, 0x00, 0x67, 0x7b, 0x39, 0x1b, + 0x00, 0x67, 0x7c, 0x14, 0x24, 0x00, 0x67, 0x7e, + 0x09, 0xa6, 0x00, 0x67, 0x7f, 0x0d, 0x58, 0x00, + 0x67, 0x80, 0x4b, 0xf5, 0x00, 0x67, 0x81, 0x42, + 0x00, 0x00, 0x67, 0x84, 0x54, 0xea, 0x00, 0x67, + 0x85, 0x14, 0x2a, 0x00, 0x67, 0x87, 0x0d, 0x8e, + 0x00, 0x67, 0x89, 0x14, 0x21, 0x00, 0x67, 0x8b, + 0x14, 0x27, 0x00, 0x67, 0x8c, 0x14, 0x26, 0x00, + 0x67, 0x8e, 0x54, 0xeb, 0x00, 0x67, 0x8f, 0x4b, + 0xf6, 0x00, 0x67, 0x90, 0x0a, 0x73, 0x00, 0x67, + 0x91, 0x4b, 0xf7, 0x00, 0x67, 0x92, 0x45, 0x6d, + 0x00, 0x67, 0x93, 0x42, 0x01, 0x00, 0x67, 0x95, + 0x0e, 0x9b, 0x00, 0x67, 0x96, 0x54, 0xec, 0x00, + 0x67, 0x97, 0x0f, 0x9b, 0x00, 0x67, 0x98, 0x42, + 0x02, 0x00, 0x67, 0x99, 0x54, 0xed, 0x00, 0x67, + 0x9a, 0x0e, 0x95, 0x00, 0x67, 0x9b, 0x42, 0x03, + 0x00, 0x67, 0x9c, 0x05, 0x4c, 0x00, 0x67, 0x9d, + 0x08, 0xac, 0x00, 0x67, 0xa0, 0x0f, 0xee, 0x00, + 0x67, 0xa1, 0x14, 0x29, 0x00, 0x67, 0xa2, 0x0a, + 0x3b, 0x00, 0x67, 0xa4, 0x4b, 0xf8, 0x00, 0x67, + 0xa6, 0x14, 0x28, 0x00, 0x67, 0xa9, 0x14, 0x23, + 0x00, 0x67, 0xaf, 0x07, 0x83, 0x00, 0x67, 0xb0, + 0x39, 0x1c, 0x00, 0x67, 0xb1, 0x4b, 0xf9, 0x00, + 0x67, 0xb2, 0x39, 0x1d, 0x00, 0x67, 0xb3, 0x14, + 0x2f, 0x00, 0x67, 0xb4, 0x14, 0x2d, 0x00, 0x67, + 0xb5, 0x4b, 0xfa, 0x00, 0x67, 0xb6, 0x05, 0x4d, + 0x00, 0x67, 0xb7, 0x14, 0x2b, 0x00, 0x67, 0xb8, + 0x14, 0x31, 0x00, 0x67, 0xb9, 0x14, 0x37, 0x00, + 0x67, 0xbb, 0x21, 0x2b, 0x00, 0x67, 0xbc, 0x54, + 0xee, 0x00, 0x67, 0xbd, 0x54, 0xef, 0x00, 0x67, + 0xbe, 0x4b, 0xfb, 0x00, 0x67, 0xc0, 0x21, 0x2d, + 0x00, 0x67, 0xc1, 0x0b, 0x28, 0x00, 0x67, 0xc2, + 0x54, 0xf0, 0x00, 0x67, 0xc3, 0x45, 0x71, 0x00, + 0x67, 0xc4, 0x0e, 0x11, 0x00, 0x67, 0xc5, 0x54, + 0xf1, 0x00, 0x67, 0xc6, 0x14, 0x39, 0x00, 0x67, + 0xc8, 0x45, 0x72, 0x00, 0x67, 0xc9, 0x54, 0xf2, + 0x00, 0x67, 0xca, 0x0d, 0x94, 0x00, 0x67, 0xce, + 0x14, 0x38, 0x00, 0x67, 0xcf, 0x0d, 0x26, 0x00, + 0x67, 0xd0, 0x0e, 0x6d, 0x00, 0x67, 0xd1, 0x05, + 0xf7, 0x00, 0x67, 0xd2, 0x45, 0x73, 0x00, 0x67, + 0xd3, 0x0a, 0x9b, 0x00, 0x67, 0xd4, 0x09, 0x4a, + 0x00, 0x67, 0xd7, 0x39, 0x1f, 0x00, 0x67, 0xd8, + 0x0b, 0xef, 0x00, 0x67, 0xd9, 0x39, 0x20, 0x00, + 0x67, 0xda, 0x0f, 0x18, 0x00, 0x67, 0xdb, 0x45, + 0x74, 0x00, 0x67, 0xdc, 0x54, 0xf3, 0x00, 0x67, + 0xdd, 0x14, 0x34, 0x00, 0x67, 0xde, 0x14, 0x33, + 0x00, 0x67, 0xe1, 0x54, 0xf4, 0x00, 0x67, 0xe2, + 0x14, 0x35, 0x00, 0x67, 0xe4, 0x14, 0x32, 0x00, + 0x67, 0xe6, 0x54, 0xf5, 0x00, 0x67, 0xe7, 0x14, + 0x3a, 0x00, 0x67, 0xe9, 0x14, 0x30, 0x00, 0x67, + 0xec, 0x14, 0x2e, 0x00, 0x67, 0xee, 0x14, 0x36, + 0x00, 0x67, 0xef, 0x14, 0x2c, 0x00, 0x67, 0xf0, + 0x39, 0x21, 0x00, 0x67, 0xf1, 0x0b, 0xaa, 0x00, + 0x67, 0xf2, 0x54, 0xf6, 0x00, 0x67, 0xf3, 0x0f, + 0x04, 0x00, 0x67, 0xf4, 0x08, 0xf2, 0x00, 0x67, + 0xf5, 0x08, 0x64, 0x00, 0x67, 0xf6, 0x54, 0xf7, + 0x00, 0x67, 0xf7, 0x45, 0x75, 0x00, 0x67, 0xf9, + 0x39, 0x1e, 0x00, 0x67, 0xfa, 0x1e, 0x9a, 0x00, + 0x67, 0xfb, 0x08, 0x2a, 0x00, 0x67, 0xfc, 0x42, + 0x04, 0x00, 0x67, 0xfe, 0x0e, 0x9d, 0x00, 0x67, + 0xff, 0x05, 0x9f, 0x00, 0x68, 0x01, 0x36, 0xf2, + 0x00, 0x68, 0x02, 0x0b, 0xea, 0x00, 0x68, 0x03, + 0x0c, 0xa2, 0x00, 0x68, 0x04, 0x04, 0xeb, 0x00, + 0x68, 0x05, 0x1e, 0x07, 0x00, 0x68, 0x10, 0x45, + 0x70, 0x00, 0x68, 0x13, 0x0a, 0x96, 0x00, 0x68, + 0x14, 0x54, 0xf8, 0x00, 0x68, 0x16, 0x0a, 0x58, + 0x00, 0x68, 0x17, 0x07, 0x00, 0x00, 0x68, 0x18, + 0x45, 0x79, 0x00, 0x68, 0x19, 0x54, 0xf9, 0x00, + 0x68, 0x1d, 0x42, 0x05, 0x00, 0x68, 0x1e, 0x14, + 0x3c, 0x00, 0x68, 0x1f, 0x45, 0x7a, 0x00, 0x68, + 0x21, 0x07, 0xcd, 0x00, 0x68, 0x22, 0x05, 0xda, + 0x00, 0x68, 0x27, 0x54, 0xfa, 0x00, 0x68, 0x28, + 0x4b, 0xfc, 0x00, 0x68, 0x29, 0x14, 0x3e, 0x00, + 0x68, 0x2a, 0x05, 0xd2, 0x00, 0x68, 0x2b, 0x14, + 0x44, 0x00, 0x68, 0x2c, 0x39, 0x22, 0x00, 0x68, + 0x2d, 0x45, 0x7b, 0x00, 0x68, 0x2f, 0x54, 0xfb, + 0x00, 0x68, 0x30, 0x39, 0x23, 0x00, 0x68, 0x31, + 0x39, 0x24, 0x00, 0x68, 0x32, 0x14, 0x41, 0x00, + 0x68, 0x33, 0x45, 0x7d, 0x00, 0x68, 0x34, 0x0a, + 0x97, 0x00, 0x68, 0x38, 0x05, 0xa9, 0x00, 0x68, + 0x39, 0x08, 0x1c, 0x00, 0x68, 0x3b, 0x45, 0x7e, + 0x00, 0x68, 0x3c, 0x05, 0xa8, 0x00, 0x68, 0x3d, + 0x08, 0x3f, 0x00, 0x68, 0x3e, 0x45, 0x7f, 0x00, + 0x68, 0x3f, 0x54, 0xfc, 0x00, 0x68, 0x40, 0x14, + 0x3f, 0x00, 0x68, 0x41, 0x07, 0x3b, 0x00, 0x68, + 0x42, 0x07, 0x21, 0x00, 0x68, 0x43, 0x0c, 0x67, + 0x00, 0x68, 0x44, 0x21, 0x2f, 0x00, 0x68, 0x45, + 0x45, 0x80, 0x00, 0x68, 0x46, 0x14, 0x3d, 0x00, + 0x68, 0x48, 0x04, 0x8a, 0x00, 0x68, 0x49, 0x45, + 0x81, 0x00, 0x68, 0x4a, 0x54, 0xfd, 0x00, 0x68, + 0x4c, 0x45, 0x82, 0x00, 0x68, 0x4d, 0x14, 0x40, + 0x00, 0x68, 0x4e, 0x14, 0x42, 0x00, 0x68, 0x50, + 0x06, 0xc5, 0x00, 0x68, 0x51, 0x07, 0x02, 0x00, + 0x68, 0x52, 0x37, 0xd3, 0x00, 0x68, 0x53, 0x05, + 0xf8, 0x00, 0x68, 0x54, 0x06, 0x65, 0x00, 0x68, + 0x55, 0x45, 0x83, 0x00, 0x68, 0x57, 0x45, 0x84, + 0x00, 0x68, 0x58, 0x54, 0xfe, 0x00, 0x68, 0x59, + 0x14, 0x45, 0x00, 0x68, 0x5b, 0x39, 0x25, 0x00, + 0x68, 0x5c, 0x08, 0x69, 0x00, 0x68, 0x5d, 0x0e, + 0x9f, 0x00, 0x68, 0x5f, 0x08, 0x85, 0x00, 0x68, + 0x63, 0x14, 0x46, 0x00, 0x68, 0x67, 0x0d, 0xa2, + 0x00, 0x68, 0x6b, 0x45, 0x86, 0x00, 0x68, 0x6e, + 0x45, 0x87, 0x00, 0x68, 0x6f, 0x54, 0xff, 0x00, + 0x68, 0x70, 0x55, 0x00, 0x00, 0x68, 0x71, 0x55, + 0x01, 0x00, 0x68, 0x72, 0x39, 0x26, 0x00, 0x68, + 0x74, 0x14, 0x52, 0x00, 0x68, 0x75, 0x39, 0x27, + 0x00, 0x68, 0x76, 0x05, 0x33, 0x00, 0x68, 0x77, + 0x14, 0x47, 0x00, 0x68, 0x79, 0x55, 0x02, 0x00, + 0x68, 0x7a, 0x39, 0x28, 0x00, 0x68, 0x7b, 0x55, + 0x03, 0x00, 0x68, 0x7c, 0x45, 0x88, 0x00, 0x68, + 0x7e, 0x14, 0x58, 0x00, 0x68, 0x7f, 0x14, 0x48, + 0x00, 0x68, 0x81, 0x0f, 0x8a, 0x00, 0x68, 0x82, + 0x45, 0x89, 0x00, 0x68, 0x83, 0x14, 0x4f, 0x00, + 0x68, 0x84, 0x39, 0x29, 0x00, 0x68, 0x85, 0x34, + 0x3f, 0x00, 0x68, 0x86, 0x4b, 0xfd, 0x00, 0x68, + 0x88, 0x55, 0x04, 0x00, 0x68, 0x8d, 0x14, 0x57, + 0x00, 0x68, 0x8e, 0x1e, 0x9c, 0x00, 0x68, 0x8f, + 0x14, 0x4a, 0x00, 0x68, 0x90, 0x45, 0x8a, 0x00, + 0x68, 0x93, 0x04, 0x78, 0x00, 0x68, 0x94, 0x14, + 0x4c, 0x00, 0x68, 0x96, 0x45, 0x8b, 0x00, 0x68, + 0x97, 0x07, 0xce, 0x00, 0x68, 0x98, 0x45, 0x8d, + 0x00, 0x68, 0x99, 0x45, 0x8e, 0x00, 0x68, 0x9a, + 0x45, 0x8f, 0x00, 0x68, 0x9b, 0x14, 0x4e, 0x00, + 0x68, 0x9c, 0x45, 0x90, 0x00, 0x68, 0x9d, 0x14, + 0x4d, 0x00, 0x68, 0x9f, 0x14, 0x49, 0x00, 0x68, + 0xa0, 0x14, 0x54, 0x00, 0x68, 0xa1, 0x55, 0x05, + 0x00, 0x68, 0xa2, 0x09, 0xa7, 0x00, 0x68, 0xa3, + 0x42, 0x06, 0x00, 0x68, 0xa5, 0x39, 0x2a, 0x00, + 0x68, 0xa6, 0x11, 0xbe, 0x00, 0x68, 0xa7, 0x07, + 0x9c, 0x00, 0x68, 0xa8, 0x0f, 0x66, 0x00, 0x68, + 0xa9, 0x55, 0x06, 0x00, 0x68, 0xaa, 0x45, 0x91, + 0x00, 0x68, 0xab, 0x45, 0x92, 0x00, 0x68, 0xad, + 0x14, 0x4b, 0x00, 0x68, 0xae, 0x55, 0x07, 0x00, + 0x68, 0xaf, 0x0c, 0x10, 0x00, 0x68, 0xb0, 0x05, + 0x81, 0x00, 0x68, 0xb1, 0x08, 0x1d, 0x00, 0x68, + 0xb2, 0x39, 0x2b, 0x00, 0x68, 0xb3, 0x14, 0x43, + 0x00, 0x68, 0xb4, 0x45, 0x93, 0x00, 0x68, 0xb5, + 0x14, 0x53, 0x00, 0x68, 0xb6, 0x05, 0xbf, 0x00, + 0x68, 0xb9, 0x14, 0x51, 0x00, 0x68, 0xba, 0x14, + 0x55, 0x00, 0x68, 0xbb, 0x45, 0x94, 0x00, 0x68, + 0xbc, 0x0c, 0x68, 0x00, 0x68, 0xc3, 0x45, 0x98, + 0x00, 0x68, 0xc4, 0x06, 0x3a, 0x00, 0x68, 0xc5, + 0x45, 0x99, 0x00, 0x68, 0xc6, 0x14, 0x73, 0x00, + 0x68, 0xc8, 0x20, 0xaf, 0x00, 0x68, 0xc9, 0x0e, + 0xd5, 0x00, 0x68, 0xca, 0x14, 0x5a, 0x00, 0x68, + 0xcb, 0x06, 0x39, 0x00, 0x68, 0xcc, 0x45, 0x9a, + 0x00, 0x68, 0xcd, 0x14, 0x61, 0x00, 0x68, 0xcf, + 0x21, 0x30, 0x00, 0x68, 0xd0, 0x39, 0x2c, 0x00, + 0x68, 0xd1, 0x55, 0x08, 0x00, 0x68, 0xd2, 0x0e, + 0x6e, 0x00, 0x68, 0xd3, 0x55, 0x09, 0x00, 0x68, + 0xd4, 0x14, 0x62, 0x00, 0x68, 0xd5, 0x14, 0x64, + 0x00, 0x68, 0xd6, 0x39, 0x2d, 0x00, 0x68, 0xd7, + 0x14, 0x68, 0x00, 0x68, 0xd8, 0x14, 0x5c, 0x00, + 0x68, 0xd9, 0x45, 0x9b, 0x00, 0x68, 0xda, 0x0b, + 0x68, 0x00, 0x68, 0xdc, 0x55, 0x0a, 0x00, 0x68, + 0xdd, 0x55, 0x0b, 0x00, 0x68, 0xdf, 0x0c, 0x69, + 0x00, 0x68, 0xe0, 0x14, 0x6c, 0x00, 0x68, 0xe1, + 0x14, 0x5f, 0x00, 0x68, 0xe3, 0x14, 0x69, 0x00, + 0x68, 0xe4, 0x45, 0x9c, 0x00, 0x68, 0xe5, 0x45, + 0x9d, 0x00, 0x68, 0xe7, 0x14, 0x63, 0x00, 0x68, + 0xe8, 0x39, 0x2e, 0x00, 0x68, 0xea, 0x55, 0x0c, + 0x00, 0x68, 0xeb, 0x4b, 0xfe, 0x00, 0x68, 0xec, + 0x45, 0x9e, 0x00, 0x68, 0xed, 0x39, 0x2f, 0x00, + 0x68, 0xee, 0x09, 0xff, 0x00, 0x68, 0xef, 0x14, + 0x6d, 0x00, 0x68, 0xf0, 0x39, 0x30, 0x00, 0x68, + 0xf1, 0x39, 0x31, 0x00, 0x68, 0xf2, 0x0a, 0x57, + 0x00, 0x68, 0xf5, 0x4b, 0xff, 0x00, 0x68, 0xf6, + 0x55, 0x0d, 0x00, 0x68, 0xf7, 0x45, 0x9f, 0x00, + 0x68, 0xf9, 0x14, 0x6b, 0x00, 0x68, 0xfa, 0x05, + 0xf9, 0x00, 0x68, 0xfb, 0x45, 0x95, 0x00, 0x68, + 0xfc, 0x39, 0x32, 0x00, 0x68, 0xfd, 0x55, 0x0e, + 0x00, 0x69, 0x00, 0x0f, 0xf6, 0x00, 0x69, 0x01, + 0x14, 0x59, 0x00, 0x69, 0x03, 0x45, 0xa0, 0x00, + 0x69, 0x04, 0x14, 0x67, 0x00, 0x69, 0x05, 0x04, + 0x9c, 0x00, 0x69, 0x06, 0x55, 0x0f, 0x00, 0x69, + 0x07, 0x45, 0xa1, 0x00, 0x69, 0x08, 0x14, 0x5b, + 0x00, 0x69, 0x09, 0x55, 0x10, 0x00, 0x69, 0x0a, + 0x42, 0x07, 0x00, 0x69, 0x0b, 0x0e, 0xc6, 0x00, + 0x69, 0x0c, 0x14, 0x60, 0x00, 0x69, 0x0d, 0x09, + 0xe8, 0x00, 0x69, 0x0e, 0x0b, 0xe3, 0x00, 0x69, + 0x0f, 0x14, 0x56, 0x00, 0x69, 0x10, 0x55, 0x11, + 0x00, 0x69, 0x11, 0x39, 0x33, 0x00, 0x69, 0x12, + 0x14, 0x66, 0x00, 0x69, 0x13, 0x39, 0x34, 0x00, + 0x69, 0x16, 0x55, 0x12, 0x00, 0x69, 0x17, 0x4c, + 0x00, 0x00, 0x69, 0x19, 0x0a, 0x40, 0x00, 0x69, + 0x1a, 0x14, 0x70, 0x00, 0x69, 0x1b, 0x05, 0xcf, + 0x00, 0x69, 0x1c, 0x07, 0x55, 0x00, 0x69, 0x21, + 0x14, 0x72, 0x00, 0x69, 0x22, 0x14, 0x5d, 0x00, + 0x69, 0x23, 0x14, 0x71, 0x00, 0x69, 0x25, 0x14, + 0x6a, 0x00, 0x69, 0x26, 0x14, 0x5e, 0x00, 0x69, + 0x28, 0x14, 0x6e, 0x00, 0x69, 0x2a, 0x14, 0x6f, + 0x00, 0x69, 0x30, 0x14, 0x80, 0x00, 0x69, 0x31, + 0x55, 0x13, 0x00, 0x69, 0x33, 0x4c, 0x01, 0x00, + 0x69, 0x34, 0x0c, 0xa6, 0x00, 0x69, 0x35, 0x39, + 0x35, 0x00, 0x69, 0x36, 0x14, 0x65, 0x00, 0x69, + 0x38, 0x4c, 0x02, 0x00, 0x69, 0x39, 0x14, 0x7c, + 0x00, 0x69, 0x3b, 0x39, 0x36, 0x00, 0x69, 0x3d, + 0x14, 0x7e, 0x00, 0x69, 0x3f, 0x0b, 0xf4, 0x00, + 0x69, 0x42, 0x42, 0x0a, 0x00, 0x69, 0x45, 0x55, + 0x14, 0x00, 0x69, 0x46, 0x45, 0xa5, 0x00, 0x69, + 0x49, 0x42, 0x08, 0x00, 0x69, 0x4a, 0x0f, 0x36, + 0x00, 0x69, 0x4e, 0x55, 0x15, 0x00, 0x69, 0x53, + 0x0d, 0xe8, 0x00, 0x69, 0x54, 0x14, 0x79, 0x00, + 0x69, 0x55, 0x0b, 0x2a, 0x00, 0x69, 0x57, 0x39, + 0x37, 0x00, 0x69, 0x59, 0x14, 0x7f, 0x00, 0x69, + 0x5a, 0x0a, 0xc1, 0x00, 0x69, 0x5b, 0x4c, 0x03, + 0x00, 0x69, 0x5c, 0x14, 0x76, 0x00, 0x69, 0x5d, + 0x14, 0x83, 0x00, 0x69, 0x5e, 0x14, 0x82, 0x00, + 0x69, 0x60, 0x0c, 0xc7, 0x00, 0x69, 0x61, 0x14, + 0x81, 0x00, 0x69, 0x62, 0x0c, 0xc2, 0x00, 0x69, + 0x63, 0x39, 0x38, 0x00, 0x69, 0x64, 0x42, 0x0b, + 0x00, 0x69, 0x65, 0x4c, 0x04, 0x00, 0x69, 0x66, + 0x55, 0x16, 0x00, 0x69, 0x68, 0x21, 0x32, 0x00, + 0x69, 0x69, 0x45, 0xa6, 0x00, 0x69, 0x6a, 0x14, + 0x85, 0x00, 0x69, 0x6b, 0x14, 0x78, 0x00, 0x69, + 0x6c, 0x45, 0xa7, 0x00, 0x69, 0x6d, 0x06, 0xc0, + 0x00, 0x69, 0x6e, 0x14, 0x7b, 0x00, 0x69, 0x6f, + 0x09, 0x67, 0x00, 0x69, 0x70, 0x55, 0x17, 0x00, + 0x69, 0x71, 0x55, 0x18, 0x00, 0x69, 0x72, 0x39, + 0x39, 0x00, 0x69, 0x73, 0x0d, 0x16, 0x00, 0x69, + 0x74, 0x14, 0x7d, 0x00, 0x69, 0x75, 0x06, 0xc3, + 0x00, 0x69, 0x77, 0x14, 0x75, 0x00, 0x69, 0x78, + 0x14, 0x77, 0x00, 0x69, 0x79, 0x14, 0x74, 0x00, + 0x69, 0x7a, 0x45, 0xa8, 0x00, 0x69, 0x7b, 0x55, + 0x19, 0x00, 0x69, 0x7c, 0x0f, 0xd6, 0x00, 0x69, + 0x7d, 0x05, 0xb8, 0x00, 0x69, 0x7e, 0x14, 0x7a, + 0x00, 0x69, 0x7f, 0x39, 0x3a, 0x00, 0x69, 0x80, + 0x39, 0x3b, 0x00, 0x69, 0x81, 0x14, 0x84, 0x00, + 0x69, 0x82, 0x05, 0x93, 0x00, 0x69, 0x86, 0x37, + 0x40, 0x00, 0x69, 0x8a, 0x08, 0x57, 0x00, 0x69, + 0x8d, 0x55, 0x1a, 0x00, 0x69, 0x8e, 0x04, 0xff, + 0x00, 0x69, 0x91, 0x14, 0x95, 0x00, 0x69, 0x92, + 0x45, 0xa9, 0x00, 0x69, 0x94, 0x0f, 0xd7, 0x00, + 0x69, 0x95, 0x14, 0x98, 0x00, 0x69, 0x96, 0x45, + 0xab, 0x00, 0x69, 0x98, 0x21, 0x34, 0x00, 0x69, + 0x9b, 0x0a, 0x00, 0x00, 0x69, 0x9c, 0x14, 0x97, + 0x00, 0x69, 0xa0, 0x14, 0x96, 0x00, 0x69, 0xa1, + 0x55, 0x1b, 0x00, 0x69, 0xa5, 0x42, 0x0c, 0x00, + 0x69, 0xa6, 0x39, 0x3c, 0x00, 0x69, 0xa7, 0x14, + 0x93, 0x00, 0x69, 0xa8, 0x4c, 0x05, 0x00, 0x69, + 0xab, 0x4c, 0x06, 0x00, 0x69, 0xad, 0x39, 0x3d, + 0x00, 0x69, 0xae, 0x14, 0x87, 0x00, 0x69, 0xaf, + 0x4c, 0x07, 0x00, 0x69, 0xb0, 0x45, 0xac, 0x00, + 0x69, 0xb1, 0x14, 0xa4, 0x00, 0x69, 0xb2, 0x14, + 0x86, 0x00, 0x69, 0xb4, 0x14, 0x99, 0x00, 0x69, + 0xb7, 0x39, 0x3e, 0x00, 0x69, 0xb8, 0x55, 0x1c, + 0x00, 0x69, 0xba, 0x45, 0xad, 0x00, 0x69, 0xbb, + 0x14, 0x91, 0x00, 0x69, 0xbc, 0x45, 0xae, 0x00, + 0x69, 0xbe, 0x14, 0x8c, 0x00, 0x69, 0xbf, 0x14, + 0x89, 0x00, 0x69, 0xc0, 0x45, 0xaf, 0x00, 0x69, + 0xc1, 0x14, 0x8a, 0x00, 0x69, 0xc3, 0x14, 0x92, + 0x00, 0x69, 0xc5, 0x55, 0x1d, 0x00, 0x69, 0xc7, + 0x1d, 0x33, 0x00, 0x69, 0xc8, 0x55, 0x1e, 0x00, + 0x69, 0xca, 0x14, 0x8f, 0x00, 0x69, 0xcb, 0x07, + 0xcf, 0x00, 0x69, 0xcc, 0x0b, 0xe4, 0x00, 0x69, + 0xcd, 0x0a, 0xe6, 0x00, 0x69, 0xce, 0x14, 0x8d, + 0x00, 0x69, 0xcf, 0x42, 0x0d, 0x00, 0x69, 0xd0, + 0x14, 0x88, 0x00, 0x69, 0xd1, 0x45, 0xb0, 0x00, + 0x69, 0xd3, 0x14, 0x8b, 0x00, 0x69, 0xd6, 0x39, + 0x3f, 0x00, 0x69, 0xd7, 0x39, 0x40, 0x00, 0x69, + 0xd8, 0x0f, 0x37, 0x00, 0x69, 0xd9, 0x0e, 0x98, + 0x00, 0x69, 0xdd, 0x14, 0x90, 0x00, 0x69, 0xde, + 0x14, 0x9a, 0x00, 0x69, 0xe2, 0x21, 0x35, 0x00, + 0x69, 0xe3, 0x45, 0xb4, 0x00, 0x69, 0xe5, 0x4c, + 0x08, 0x00, 0x69, 0xe7, 0x14, 0xa2, 0x00, 0x69, + 0xe8, 0x14, 0x9b, 0x00, 0x69, 0xe9, 0x42, 0x10, + 0x00, 0x69, 0xea, 0x34, 0x11, 0x00, 0x69, 0xeb, + 0x14, 0xa8, 0x00, 0x69, 0xed, 0x14, 0xa6, 0x00, + 0x69, 0xee, 0x45, 0xb5, 0x00, 0x69, 0xef, 0x45, + 0xb6, 0x00, 0x69, 0xf1, 0x4c, 0x09, 0x00, 0x69, + 0xf2, 0x14, 0xa1, 0x00, 0x69, 0xf3, 0x45, 0xb7, + 0x00, 0x69, 0xf4, 0x45, 0xb9, 0x00, 0x69, 0xf5, + 0x42, 0x11, 0x00, 0x69, 0xf6, 0x37, 0x3f, 0x00, + 0x69, 0xf9, 0x14, 0xa0, 0x00, 0x69, 0xfb, 0x0b, + 0xec, 0x00, 0x69, 0xfd, 0x0a, 0xe7, 0x00, 0x69, + 0xfe, 0x45, 0xba, 0x00, 0x69, 0xff, 0x14, 0x9e, + 0x00, 0x6a, 0x00, 0x55, 0x20, 0x00, 0x6a, 0x01, + 0x39, 0x41, 0x00, 0x6a, 0x02, 0x14, 0x9c, 0x00, + 0x6a, 0x03, 0x55, 0x21, 0x00, 0x6a, 0x05, 0x14, + 0xa3, 0x00, 0x6a, 0x0a, 0x14, 0xa9, 0x00, 0x6a, + 0x0b, 0x0d, 0x89, 0x00, 0x6a, 0x0c, 0x14, 0xaf, + 0x00, 0x6a, 0x0f, 0x39, 0x42, 0x00, 0x6a, 0x11, + 0x45, 0xbb, 0x00, 0x6a, 0x12, 0x14, 0xaa, 0x00, + 0x6a, 0x13, 0x14, 0xad, 0x00, 0x6a, 0x14, 0x14, + 0xa7, 0x00, 0x6a, 0x15, 0x39, 0x43, 0x00, 0x6a, + 0x17, 0x0b, 0xb2, 0x00, 0x6a, 0x19, 0x0d, 0xaa, + 0x00, 0x6a, 0x1a, 0x45, 0xbc, 0x00, 0x6a, 0x1b, + 0x14, 0x9d, 0x00, 0x6a, 0x1d, 0x45, 0xbd, 0x00, + 0x6a, 0x1e, 0x14, 0xa5, 0x00, 0x6a, 0x1f, 0x09, + 0xa8, 0x00, 0x6a, 0x20, 0x55, 0x22, 0x00, 0x6a, + 0x21, 0x0e, 0xdb, 0x00, 0x6a, 0x22, 0x14, 0xb9, + 0x00, 0x6a, 0x23, 0x14, 0xac, 0x00, 0x6a, 0x24, + 0x55, 0x23, 0x00, 0x6a, 0x28, 0x39, 0x44, 0x00, + 0x6a, 0x29, 0x07, 0x56, 0x00, 0x6a, 0x2a, 0x05, + 0x23, 0x00, 0x6a, 0x2b, 0x05, 0xbd, 0x00, 0x6a, + 0x2e, 0x14, 0x94, 0x00, 0x6a, 0x30, 0x21, 0x36, + 0x00, 0x6a, 0x32, 0x45, 0xbf, 0x00, 0x6a, 0x33, + 0x45, 0xc0, 0x00, 0x6a, 0x34, 0x39, 0x45, 0x00, + 0x6a, 0x35, 0x09, 0xa9, 0x00, 0x6a, 0x36, 0x14, + 0xb1, 0x00, 0x6a, 0x37, 0x55, 0x24, 0x00, 0x6a, + 0x38, 0x14, 0xb8, 0x00, 0x6a, 0x39, 0x09, 0x25, + 0x00, 0x6a, 0x3a, 0x05, 0xd0, 0x00, 0x6a, 0x3b, + 0x42, 0x13, 0x00, 0x6a, 0x3d, 0x0b, 0x6c, 0x00, + 0x6a, 0x3e, 0x39, 0x46, 0x00, 0x6a, 0x3f, 0x45, + 0xc1, 0x00, 0x6a, 0x44, 0x14, 0xae, 0x00, 0x6a, + 0x45, 0x39, 0x47, 0x00, 0x6a, 0x46, 0x21, 0x38, + 0x00, 0x6a, 0x47, 0x14, 0xb3, 0x00, 0x6a, 0x48, + 0x14, 0xb7, 0x00, 0x6a, 0x49, 0x45, 0xc2, 0x00, + 0x6a, 0x4a, 0x4c, 0x0a, 0x00, 0x6a, 0x4b, 0x06, + 0xae, 0x00, 0x6a, 0x4e, 0x45, 0xc4, 0x00, 0x6a, + 0x50, 0x39, 0x48, 0x00, 0x6a, 0x51, 0x39, 0x49, + 0x00, 0x6a, 0x52, 0x45, 0xc5, 0x00, 0x6a, 0x54, + 0x3c, 0x34, 0x00, 0x6a, 0x55, 0x4c, 0x0b, 0x00, + 0x6a, 0x56, 0x39, 0x4a, 0x00, 0x6a, 0x58, 0x06, + 0x66, 0x00, 0x6a, 0x59, 0x14, 0xb5, 0x00, 0x6a, + 0x5b, 0x39, 0x4b, 0x00, 0x6a, 0x5f, 0x06, 0x3b, + 0x00, 0x6a, 0x61, 0x0c, 0xa3, 0x00, 0x6a, 0x62, + 0x14, 0xb4, 0x00, 0x6a, 0x64, 0x45, 0xc6, 0x00, + 0x6a, 0x66, 0x14, 0xb6, 0x00, 0x6a, 0x67, 0x4c, + 0x0c, 0x00, 0x6a, 0x6a, 0x55, 0x26, 0x00, 0x6a, + 0x6b, 0x21, 0x37, 0x00, 0x6a, 0x71, 0x4c, 0x0d, + 0x00, 0x6a, 0x72, 0x14, 0xb0, 0x00, 0x6a, 0x73, + 0x21, 0x39, 0x00, 0x6a, 0x78, 0x14, 0xb2, 0x00, + 0x6a, 0x7a, 0x45, 0xc3, 0x00, 0x6a, 0x7e, 0x21, + 0x3a, 0x00, 0x6a, 0x7f, 0x05, 0xbe, 0x00, 0x6a, + 0x80, 0x0b, 0x87, 0x00, 0x6a, 0x81, 0x55, 0x27, + 0x00, 0x6a, 0x83, 0x39, 0x4c, 0x00, 0x6a, 0x84, + 0x14, 0xbd, 0x00, 0x6a, 0x86, 0x55, 0x28, 0x00, + 0x6a, 0x87, 0x55, 0x29, 0x00, 0x6a, 0x89, 0x39, + 0x4d, 0x00, 0x6a, 0x8b, 0x45, 0xc8, 0x00, 0x6a, + 0x8d, 0x14, 0xbb, 0x00, 0x6a, 0x8e, 0x07, 0x9d, + 0x00, 0x6a, 0x90, 0x14, 0xba, 0x00, 0x6a, 0x91, + 0x39, 0x4e, 0x00, 0x6a, 0x94, 0x42, 0x15, 0x00, + 0x6a, 0x97, 0x14, 0xc0, 0x00, 0x6a, 0x9b, 0x55, + 0x2a, 0x00, 0x6a, 0x9c, 0x14, 0x3b, 0x00, 0x6a, + 0x9d, 0x39, 0x4f, 0x00, 0x6a, 0x9e, 0x39, 0x50, + 0x00, 0x6a, 0x9f, 0x39, 0x51, 0x00, 0x6a, 0xa0, + 0x14, 0xbc, 0x00, 0x6a, 0xa1, 0x45, 0xca, 0x00, + 0x6a, 0xa2, 0x14, 0xbe, 0x00, 0x6a, 0xa3, 0x14, + 0xbf, 0x00, 0x6a, 0xa5, 0x42, 0x16, 0x00, 0x6a, + 0xaa, 0x14, 0xcb, 0x00, 0x6a, 0xab, 0x45, 0xcc, + 0x00, 0x6a, 0xac, 0x14, 0xc7, 0x00, 0x6a, 0xae, + 0x14, 0x50, 0x00, 0x6a, 0xaf, 0x4c, 0x0e, 0x00, + 0x6a, 0xb0, 0x55, 0x2b, 0x00, 0x6a, 0xb1, 0x55, + 0x2c, 0x00, 0x6a, 0xb3, 0x14, 0xc6, 0x00, 0x6a, + 0xb4, 0x55, 0x2d, 0x00, 0x6a, 0xb8, 0x14, 0xc5, + 0x00, 0x6a, 0xbb, 0x14, 0xc2, 0x00, 0x6a, 0xbd, + 0x45, 0xcd, 0x00, 0x6a, 0xbe, 0x55, 0x2e, 0x00, + 0x6a, 0xbf, 0x55, 0x2f, 0x00, 0x6a, 0xc1, 0x14, + 0xab, 0x00, 0x6a, 0xc2, 0x14, 0xc4, 0x00, 0x6a, + 0xc3, 0x14, 0xc3, 0x00, 0x6a, 0xc6, 0x45, 0xce, + 0x00, 0x6a, 0xc8, 0x4c, 0x0f, 0x00, 0x6a, 0xc9, + 0x4c, 0x10, 0x00, 0x6a, 0xcc, 0x55, 0x30, 0x00, + 0x6a, 0xd0, 0x45, 0xd0, 0x00, 0x6a, 0xd1, 0x14, + 0xc9, 0x00, 0x6a, 0xd3, 0x0f, 0xcc, 0x00, 0x6a, + 0xd4, 0x45, 0xcf, 0x00, 0x6a, 0xd5, 0x55, 0x31, + 0x00, 0x6a, 0xd6, 0x55, 0x32, 0x00, 0x6a, 0xda, + 0x14, 0xcc, 0x00, 0x6a, 0xdb, 0x1d, 0xf1, 0x00, + 0x6a, 0xdc, 0x39, 0x52, 0x00, 0x6a, 0xdd, 0x45, + 0xd1, 0x00, 0x6a, 0xde, 0x14, 0xc8, 0x00, 0x6a, + 0xdf, 0x14, 0xca, 0x00, 0x6a, 0xe2, 0x21, 0x3b, + 0x00, 0x6a, 0xe4, 0x21, 0x3c, 0x00, 0x6a, 0xe7, + 0x39, 0x53, 0x00, 0x6a, 0xe8, 0x0d, 0x3b, 0x00, + 0x6a, 0xea, 0x14, 0xcd, 0x00, 0x6a, 0xec, 0x39, + 0x54, 0x00, 0x6a, 0xf0, 0x55, 0x33, 0x00, 0x6a, + 0xf1, 0x45, 0xd4, 0x00, 0x6a, 0xf2, 0x45, 0xd5, + 0x00, 0x6a, 0xf3, 0x45, 0xd6, 0x00, 0x6a, 0xf8, + 0x4e, 0xb8, 0x00, 0x6a, 0xfa, 0x14, 0xd1, 0x00, + 0x6a, 0xfb, 0x14, 0xce, 0x00, 0x6a, 0xfc, 0x55, + 0x34, 0x00, 0x6a, 0xfd, 0x45, 0xd7, 0x00, 0x6b, + 0x02, 0x55, 0x35, 0x00, 0x6b, 0x03, 0x4c, 0x11, + 0x00, 0x6b, 0x04, 0x34, 0x50, 0x00, 0x6b, 0x05, + 0x14, 0xcf, 0x00, 0x6b, 0x06, 0x55, 0x36, 0x00, + 0x6b, 0x07, 0x55, 0x37, 0x00, 0x6b, 0x09, 0x55, + 0x38, 0x00, 0x6b, 0x0a, 0x14, 0x9f, 0x00, 0x6b, + 0x0b, 0x45, 0xd9, 0x00, 0x6b, 0x0f, 0x45, 0xda, + 0x00, 0x6b, 0x10, 0x45, 0xdb, 0x00, 0x6b, 0x11, + 0x45, 0xdc, 0x00, 0x6b, 0x12, 0x14, 0xd2, 0x00, + 0x6b, 0x16, 0x14, 0xd3, 0x00, 0x6b, 0x17, 0x45, + 0xde, 0x00, 0x6b, 0x1b, 0x42, 0x18, 0x00, 0x6b, + 0x1d, 0x04, 0xd7, 0x00, 0x6b, 0x1e, 0x39, 0x55, + 0x00, 0x6b, 0x1f, 0x14, 0xd5, 0x00, 0x6b, 0x20, + 0x07, 0x3d, 0x00, 0x6b, 0x21, 0x08, 0xcd, 0x00, + 0x6b, 0x23, 0x06, 0xcd, 0x00, 0x6b, 0x24, 0x39, + 0x56, 0x00, 0x6b, 0x27, 0x05, 0x24, 0x00, 0x6b, + 0x28, 0x55, 0x39, 0x00, 0x6b, 0x2b, 0x55, 0x3a, + 0x00, 0x6b, 0x2c, 0x42, 0x19, 0x00, 0x6b, 0x2f, + 0x45, 0xe0, 0x00, 0x6b, 0x32, 0x0f, 0x49, 0x00, + 0x6b, 0x35, 0x39, 0x57, 0x00, 0x6b, 0x36, 0x55, + 0x3b, 0x00, 0x6b, 0x37, 0x14, 0xd7, 0x00, 0x6b, + 0x38, 0x14, 0xd6, 0x00, 0x6b, 0x39, 0x14, 0xd9, + 0x00, 0x6b, 0x3a, 0x06, 0x57, 0x00, 0x6b, 0x3b, + 0x4c, 0x12, 0x00, 0x6b, 0x3d, 0x06, 0xce, 0x00, + 0x6b, 0x3e, 0x05, 0xfa, 0x00, 0x6b, 0x3f, 0x4c, + 0x13, 0x00, 0x6b, 0x43, 0x14, 0xdc, 0x00, 0x6b, + 0x46, 0x39, 0x58, 0x00, 0x6b, 0x47, 0x14, 0xdb, + 0x00, 0x6b, 0x49, 0x14, 0xdd, 0x00, 0x6b, 0x4a, + 0x45, 0xe1, 0x00, 0x6b, 0x4c, 0x05, 0x4e, 0x00, + 0x6b, 0x4d, 0x55, 0x3c, 0x00, 0x6b, 0x4e, 0x0b, + 0x75, 0x00, 0x6b, 0x50, 0x14, 0xde, 0x00, 0x6b, + 0x52, 0x55, 0x3d, 0x00, 0x6b, 0x53, 0x05, 0xfb, + 0x00, 0x6b, 0x54, 0x14, 0xe0, 0x00, 0x6b, 0x56, + 0x39, 0x59, 0x00, 0x6b, 0x58, 0x45, 0xe2, 0x00, + 0x6b, 0x59, 0x14, 0xdf, 0x00, 0x6b, 0x5b, 0x14, + 0xe1, 0x00, 0x6b, 0x5d, 0x55, 0x3e, 0x00, 0x6b, + 0x5f, 0x14, 0xe2, 0x00, 0x6b, 0x60, 0x39, 0x5a, + 0x00, 0x6b, 0x61, 0x14, 0xe3, 0x00, 0x6b, 0x62, + 0x08, 0xad, 0x00, 0x6b, 0x63, 0x0a, 0x59, 0x00, + 0x6b, 0x64, 0x08, 0x11, 0x00, 0x6b, 0x65, 0x34, + 0x4a, 0x00, 0x6b, 0x66, 0x0d, 0xe2, 0x00, 0x6b, + 0x67, 0x42, 0x1a, 0x00, 0x6b, 0x69, 0x0e, 0x32, + 0x00, 0x6b, 0x6a, 0x0f, 0xea, 0x00, 0x6b, 0x6b, + 0x55, 0x3f, 0x00, 0x6b, 0x6c, 0x45, 0xe3, 0x00, + 0x6b, 0x6e, 0x55, 0x40, 0x00, 0x6b, 0x6f, 0x08, + 0xc3, 0x00, 0x6b, 0x70, 0x55, 0x41, 0x00, 0x6b, + 0x72, 0x35, 0xd9, 0x00, 0x6b, 0x73, 0x08, 0x40, + 0x00, 0x6b, 0x74, 0x0f, 0xba, 0x00, 0x6b, 0x75, + 0x45, 0xe4, 0x00, 0x6b, 0x77, 0x34, 0x56, 0x00, + 0x6b, 0x78, 0x14, 0xe4, 0x00, 0x6b, 0x79, 0x14, + 0xe5, 0x00, 0x6b, 0x7a, 0x45, 0xe5, 0x00, 0x6b, + 0x7b, 0x08, 0xae, 0x00, 0x6b, 0x7d, 0x4c, 0x14, + 0x00, 0x6b, 0x7e, 0x4c, 0x15, 0x00, 0x6b, 0x7f, + 0x14, 0xe6, 0x00, 0x6b, 0x80, 0x14, 0xe7, 0x00, + 0x6b, 0x81, 0x45, 0xe6, 0x00, 0x6b, 0x82, 0x39, + 0x5b, 0x00, 0x6b, 0x83, 0x14, 0xe9, 0x00, 0x6b, + 0x84, 0x14, 0xe8, 0x00, 0x6b, 0x85, 0x55, 0x42, + 0x00, 0x6b, 0x86, 0x0e, 0x86, 0x00, 0x6b, 0x89, + 0x09, 0x68, 0x00, 0x6b, 0x8a, 0x09, 0x18, 0x00, + 0x6b, 0x8b, 0x08, 0x92, 0x00, 0x6b, 0x8d, 0x14, + 0xea, 0x00, 0x6b, 0x95, 0x14, 0xec, 0x00, 0x6b, + 0x96, 0x09, 0xe9, 0x00, 0x6b, 0x97, 0x55, 0x43, + 0x00, 0x6b, 0x98, 0x14, 0xeb, 0x00, 0x6b, 0x9b, + 0x45, 0xe7, 0x00, 0x6b, 0x9e, 0x14, 0xed, 0x00, + 0x6b, 0x9f, 0x55, 0x44, 0x00, 0x6b, 0xa0, 0x55, + 0x45, 0x00, 0x6b, 0xa2, 0x55, 0x46, 0x00, 0x6b, + 0xa3, 0x55, 0x47, 0x00, 0x6b, 0xa4, 0x14, 0xee, + 0x00, 0x6b, 0xa8, 0x55, 0x48, 0x00, 0x6b, 0xa9, + 0x42, 0x1b, 0x00, 0x6b, 0xaa, 0x14, 0xef, 0x00, + 0x6b, 0xab, 0x14, 0xf0, 0x00, 0x6b, 0xac, 0x55, + 0x49, 0x00, 0x6b, 0xad, 0x42, 0x1c, 0x00, 0x6b, + 0xae, 0x45, 0xe8, 0x00, 0x6b, 0xaf, 0x14, 0xf1, + 0x00, 0x6b, 0xb0, 0x4c, 0x16, 0x00, 0x6b, 0xb1, + 0x14, 0xf3, 0x00, 0x6b, 0xb2, 0x14, 0xf2, 0x00, + 0x6b, 0xb3, 0x14, 0xf4, 0x00, 0x6b, 0xb4, 0x05, + 0x25, 0x00, 0x6b, 0xb5, 0x0b, 0x88, 0x00, 0x6b, + 0xb7, 0x14, 0xf5, 0x00, 0x6b, 0xb8, 0x55, 0x4a, + 0x00, 0x6b, 0xb9, 0x55, 0x4b, 0x00, 0x6b, 0xba, + 0x34, 0x20, 0x00, 0x6b, 0xbb, 0x05, 0xaa, 0x00, + 0x6b, 0xbc, 0x14, 0xf6, 0x00, 0x6b, 0xbd, 0x45, + 0xea, 0x00, 0x6b, 0xbe, 0x39, 0x5c, 0x00, 0x6b, + 0xbf, 0x0c, 0x3c, 0x00, 0x6b, 0xc0, 0x11, 0x9d, + 0x00, 0x6b, 0xc3, 0x55, 0x4c, 0x00, 0x6b, 0xc4, + 0x55, 0x4d, 0x00, 0x6b, 0xc5, 0x06, 0x3d, 0x00, + 0x6b, 0xc6, 0x14, 0xf7, 0x00, 0x6b, 0xc7, 0x45, + 0xeb, 0x00, 0x6b, 0xc8, 0x45, 0xec, 0x00, 0x6b, + 0xc9, 0x45, 0xed, 0x00, 0x6b, 0xcb, 0x14, 0xf8, + 0x00, 0x6b, 0xcc, 0x37, 0x44, 0x00, 0x6b, 0xcd, + 0x0e, 0x3c, 0x00, 0x6b, 0xce, 0x0e, 0x96, 0x00, + 0x6b, 0xcf, 0x34, 0x4c, 0x00, 0x6b, 0xd2, 0x0c, + 0x9f, 0x00, 0x6b, 0xd3, 0x14, 0xf9, 0x00, 0x6b, + 0xd4, 0x0d, 0x7a, 0x00, 0x6b, 0xd6, 0x21, 0x3d, + 0x00, 0x6b, 0xd7, 0x42, 0x1d, 0x00, 0x6b, 0xd8, + 0x0d, 0x8f, 0x00, 0x6b, 0xda, 0x45, 0xee, 0x00, + 0x6b, 0xdb, 0x0e, 0xdf, 0x00, 0x6b, 0xdf, 0x14, + 0xfa, 0x00, 0x6b, 0xe1, 0x39, 0x5d, 0x00, 0x6b, + 0xe3, 0x55, 0x4e, 0x00, 0x6b, 0xe6, 0x45, 0xef, + 0x00, 0x6b, 0xe7, 0x45, 0xf0, 0x00, 0x6b, 0xeb, + 0x14, 0xfc, 0x00, 0x6b, 0xec, 0x14, 0xfb, 0x00, + 0x6b, 0xee, 0x45, 0xf1, 0x00, 0x6b, 0xef, 0x14, + 0xfe, 0x00, 0x6b, 0xf1, 0x39, 0x5e, 0x00, 0x6b, + 0xf3, 0x14, 0xfd, 0x00, 0x6b, 0xf7, 0x4c, 0x17, + 0x00, 0x6b, 0xf9, 0x4c, 0x18, 0x00, 0x6b, 0xff, + 0x42, 0x1e, 0x00, 0x6c, 0x02, 0x45, 0xf2, 0x00, + 0x6c, 0x04, 0x4c, 0x19, 0x00, 0x6c, 0x05, 0x42, + 0x1f, 0x00, 0x6c, 0x08, 0x15, 0x00, 0x00, 0x6c, + 0x09, 0x4c, 0x1a, 0x00, 0x6c, 0x0a, 0x45, 0xf3, + 0x00, 0x6c, 0x0d, 0x4c, 0x1b, 0x00, 0x6c, 0x0e, + 0x45, 0xf4, 0x00, 0x6c, 0x0f, 0x08, 0xaf, 0x00, + 0x6c, 0x10, 0x39, 0x5f, 0x00, 0x6c, 0x11, 0x0e, + 0xbd, 0x00, 0x6c, 0x12, 0x55, 0x4f, 0x00, 0x6c, + 0x13, 0x15, 0x01, 0x00, 0x6c, 0x14, 0x15, 0x02, + 0x00, 0x6c, 0x17, 0x06, 0x3e, 0x00, 0x6c, 0x19, + 0x55, 0x50, 0x00, 0x6c, 0x1b, 0x15, 0x03, 0x00, + 0x6c, 0x1f, 0x55, 0x51, 0x00, 0x6c, 0x23, 0x15, + 0x05, 0x00, 0x6c, 0x24, 0x15, 0x04, 0x00, 0x6c, + 0x26, 0x55, 0x52, 0x00, 0x6c, 0x27, 0x55, 0x53, + 0x00, 0x6c, 0x28, 0x55, 0x54, 0x00, 0x6c, 0x2c, + 0x4c, 0x1c, 0x00, 0x6c, 0x2e, 0x55, 0x55, 0x00, + 0x6c, 0x33, 0x39, 0x60, 0x00, 0x6c, 0x34, 0x0a, + 0x2b, 0x00, 0x6c, 0x35, 0x39, 0x61, 0x00, 0x6c, + 0x36, 0x45, 0xf5, 0x00, 0x6c, 0x37, 0x0d, 0xab, + 0x00, 0x6c, 0x38, 0x04, 0xec, 0x00, 0x6c, 0x3a, + 0x4f, 0x55, 0x00, 0x6c, 0x3b, 0x55, 0x56, 0x00, + 0x6c, 0x3e, 0x0d, 0x59, 0x00, 0x6c, 0x3f, 0x21, + 0x3e, 0x00, 0x6c, 0x40, 0x0c, 0x11, 0x00, 0x6c, + 0x41, 0x09, 0x4b, 0x00, 0x6c, 0x42, 0x06, 0x7b, + 0x00, 0x6c, 0x4a, 0x4c, 0x1d, 0x00, 0x6c, 0x4b, + 0x55, 0x57, 0x00, 0x6c, 0x4d, 0x45, 0xf7, 0x00, + 0x6c, 0x4e, 0x0d, 0x5a, 0x00, 0x6c, 0x4f, 0x55, + 0x58, 0x00, 0x6c, 0x50, 0x08, 0xda, 0x00, 0x6c, + 0x52, 0x4c, 0x1e, 0x00, 0x6c, 0x54, 0x4c, 0x1f, + 0x00, 0x6c, 0x55, 0x15, 0x07, 0x00, 0x6c, 0x57, + 0x05, 0xfc, 0x00, 0x6c, 0x59, 0x39, 0x63, 0x00, + 0x6c, 0x5a, 0x05, 0x1a, 0x00, 0x6c, 0x5b, 0x45, + 0xf8, 0x00, 0x6c, 0x5c, 0x21, 0x3f, 0x00, 0x6c, + 0x5d, 0x0c, 0xca, 0x00, 0x6c, 0x5e, 0x15, 0x06, + 0x00, 0x6c, 0x5f, 0x07, 0xd0, 0x00, 0x6c, 0x60, + 0x0b, 0x91, 0x00, 0x6c, 0x62, 0x15, 0x08, 0x00, + 0x6c, 0x67, 0x46, 0x0a, 0x00, 0x6c, 0x68, 0x15, + 0x10, 0x00, 0x6c, 0x6a, 0x15, 0x09, 0x00, 0x6c, + 0x6b, 0x55, 0x59, 0x00, 0x6c, 0x6d, 0x45, 0xf9, + 0x00, 0x6c, 0x6f, 0x21, 0x41, 0x00, 0x6c, 0x70, + 0x0b, 0x21, 0x00, 0x6c, 0x72, 0x06, 0x7c, 0x00, + 0x6c, 0x73, 0x15, 0x11, 0x00, 0x6c, 0x74, 0x42, + 0x20, 0x00, 0x6c, 0x76, 0x39, 0x64, 0x00, 0x6c, + 0x78, 0x55, 0x5a, 0x00, 0x6c, 0x79, 0x4c, 0x20, + 0x00, 0x6c, 0x7a, 0x07, 0x3e, 0x00, 0x6c, 0x7b, + 0x39, 0x65, 0x00, 0x6c, 0x7d, 0x06, 0x3f, 0x00, + 0x6c, 0x7e, 0x15, 0x0f, 0x00, 0x6c, 0x81, 0x15, + 0x0d, 0x00, 0x6c, 0x82, 0x15, 0x0a, 0x00, 0x6c, + 0x83, 0x0f, 0x4a, 0x00, 0x6c, 0x84, 0x45, 0xfa, + 0x00, 0x6c, 0x85, 0x39, 0x66, 0x00, 0x6c, 0x86, + 0x21, 0x40, 0x00, 0x6c, 0x87, 0x55, 0x5b, 0x00, + 0x6c, 0x88, 0x0b, 0xdc, 0x00, 0x6c, 0x89, 0x45, + 0xfb, 0x00, 0x6c, 0x8c, 0x0c, 0xb1, 0x00, 0x6c, + 0x8d, 0x15, 0x0b, 0x00, 0x6c, 0x90, 0x15, 0x13, + 0x00, 0x6c, 0x92, 0x15, 0x12, 0x00, 0x6c, 0x93, + 0x06, 0xf9, 0x00, 0x6c, 0x94, 0x45, 0xfd, 0x00, + 0x6c, 0x95, 0x39, 0x67, 0x00, 0x6c, 0x96, 0x05, + 0x2d, 0x00, 0x6c, 0x97, 0x45, 0xfe, 0x00, 0x6c, + 0x98, 0x42, 0x21, 0x00, 0x6c, 0x99, 0x08, 0x2b, + 0x00, 0x6c, 0x9a, 0x15, 0x0c, 0x00, 0x6c, 0x9b, + 0x15, 0x0e, 0x00, 0x6c, 0x9c, 0x39, 0x68, 0x00, + 0x6c, 0x9f, 0x55, 0x5c, 0x00, 0x6c, 0xa1, 0x0e, + 0x85, 0x00, 0x6c, 0xa2, 0x0b, 0x54, 0x00, 0x6c, + 0xaa, 0x37, 0x49, 0x00, 0x6c, 0xab, 0x0e, 0xa5, + 0x00, 0x6c, 0xac, 0x4c, 0x21, 0x00, 0x6c, 0xad, + 0x45, 0xff, 0x00, 0x6c, 0xae, 0x15, 0x1b, 0x00, + 0x6c, 0xb0, 0x55, 0x5d, 0x00, 0x6c, 0xb1, 0x15, + 0x1c, 0x00, 0x6c, 0xb2, 0x55, 0x5e, 0x00, 0x6c, + 0xb3, 0x05, 0x4f, 0x00, 0x6c, 0xb4, 0x4c, 0x22, + 0x00, 0x6c, 0xb8, 0x0d, 0xf8, 0x00, 0x6c, 0xb9, + 0x0f, 0x09, 0x00, 0x6c, 0xba, 0x15, 0x1e, 0x00, + 0x6c, 0xbb, 0x08, 0xcf, 0x00, 0x6c, 0xbc, 0x09, + 0xaa, 0x00, 0x6c, 0xbd, 0x15, 0x17, 0x00, 0x6c, + 0xbe, 0x15, 0x1d, 0x00, 0x6c, 0xbf, 0x35, 0x58, + 0x00, 0x6c, 0xc1, 0x06, 0xaf, 0x00, 0x6c, 0xc2, + 0x46, 0x00, 0x00, 0x6c, 0xc4, 0x15, 0x14, 0x00, + 0x6c, 0xc5, 0x15, 0x19, 0x00, 0x6c, 0xc6, 0x42, + 0x23, 0x00, 0x6c, 0xc9, 0x0a, 0x98, 0x00, 0x6c, + 0xca, 0x0d, 0x27, 0x00, 0x6c, 0xcc, 0x0d, 0x7b, + 0x00, 0x6c, 0xcd, 0x55, 0x5f, 0x00, 0x6c, 0xcf, + 0x55, 0x60, 0x00, 0x6c, 0xd0, 0x39, 0x69, 0x00, + 0x6c, 0xd1, 0x55, 0x61, 0x00, 0x6c, 0xd2, 0x4c, + 0x23, 0x00, 0x6c, 0xd3, 0x15, 0x16, 0x00, 0x6c, + 0xd4, 0x39, 0x6a, 0x00, 0x6c, 0xd5, 0x0e, 0x4f, + 0x00, 0x6c, 0xd6, 0x39, 0x6b, 0x00, 0x6c, 0xd7, + 0x15, 0x18, 0x00, 0x6c, 0xd9, 0x15, 0x21, 0x00, + 0x6c, 0xda, 0x21, 0x42, 0x00, 0x6c, 0xdb, 0x15, + 0x1f, 0x00, 0x6c, 0xdc, 0x46, 0x02, 0x00, 0x6c, + 0xdd, 0x15, 0x1a, 0x00, 0x6c, 0xe0, 0x39, 0x6c, + 0x00, 0x6c, 0xe1, 0x0e, 0x50, 0x00, 0x6c, 0xe2, + 0x0c, 0xfe, 0x00, 0x6c, 0xe3, 0x06, 0x7d, 0x00, + 0x6c, 0xe5, 0x0c, 0x1f, 0x00, 0x6c, 0xe7, 0x55, + 0x62, 0x00, 0x6c, 0xe8, 0x0b, 0xab, 0x00, 0x6c, + 0xe9, 0x46, 0x03, 0x00, 0x6c, 0xea, 0x15, 0x22, + 0x00, 0x6c, 0xeb, 0x39, 0x6d, 0x00, 0x6c, 0xec, + 0x39, 0x6e, 0x00, 0x6c, 0xed, 0x46, 0x04, 0x00, + 0x6c, 0xee, 0x39, 0x6f, 0x00, 0x6c, 0xef, 0x15, + 0x20, 0x00, 0x6c, 0xf0, 0x0b, 0x39, 0x00, 0x6c, + 0xf1, 0x15, 0x15, 0x00, 0x6c, 0xf2, 0x55, 0x63, + 0x00, 0x6c, 0xf3, 0x04, 0xed, 0x00, 0x6c, 0xf4, + 0x55, 0x64, 0x00, 0x6c, 0xfb, 0x42, 0x22, 0x00, + 0x6d, 0x00, 0x46, 0x06, 0x00, 0x6d, 0x01, 0x3c, + 0x35, 0x00, 0x6d, 0x04, 0x21, 0x43, 0x00, 0x6d, + 0x07, 0x55, 0x65, 0x00, 0x6d, 0x0a, 0x39, 0x70, + 0x00, 0x6d, 0x0b, 0x0f, 0x38, 0x00, 0x6d, 0x0c, + 0x15, 0x2d, 0x00, 0x6d, 0x0e, 0x39, 0x71, 0x00, + 0x6d, 0x0f, 0x55, 0x66, 0x00, 0x6d, 0x11, 0x39, + 0x72, 0x00, 0x6d, 0x12, 0x15, 0x2c, 0x00, 0x6d, + 0x13, 0x55, 0x67, 0x00, 0x6d, 0x17, 0x0a, 0x9a, + 0x00, 0x6d, 0x19, 0x15, 0x29, 0x00, 0x6d, 0x1a, + 0x55, 0x68, 0x00, 0x6d, 0x1b, 0x0f, 0x56, 0x00, + 0x6d, 0x1e, 0x0c, 0x8e, 0x00, 0x6d, 0x1f, 0x15, + 0x23, 0x00, 0x6d, 0x24, 0x46, 0x07, 0x00, 0x6d, + 0x25, 0x0b, 0xe1, 0x00, 0x6d, 0x26, 0x46, 0x08, + 0x00, 0x6d, 0x27, 0x46, 0x09, 0x00, 0x6d, 0x28, + 0x55, 0x69, 0x00, 0x6d, 0x29, 0x04, 0xee, 0x00, + 0x6d, 0x2a, 0x07, 0xd1, 0x00, 0x6d, 0x2b, 0x15, + 0x26, 0x00, 0x6d, 0x2e, 0x39, 0x73, 0x00, 0x6d, + 0x2f, 0x46, 0x0b, 0x00, 0x6d, 0x31, 0x42, 0x24, + 0x00, 0x6d, 0x32, 0x09, 0x31, 0x00, 0x6d, 0x33, + 0x15, 0x2b, 0x00, 0x6d, 0x34, 0x46, 0x1e, 0x00, + 0x6d, 0x35, 0x15, 0x2a, 0x00, 0x6d, 0x36, 0x15, + 0x25, 0x00, 0x6d, 0x38, 0x15, 0x28, 0x00, 0x6d, + 0x39, 0x42, 0x25, 0x00, 0x6d, 0x3b, 0x05, 0xc6, + 0x00, 0x6d, 0x3c, 0x46, 0x0c, 0x00, 0x6d, 0x3d, + 0x15, 0x27, 0x00, 0x6d, 0x3e, 0x0c, 0xff, 0x00, + 0x6d, 0x3f, 0x42, 0x26, 0x00, 0x6d, 0x41, 0x0f, + 0x76, 0x00, 0x6d, 0x44, 0x09, 0xdc, 0x00, 0x6d, + 0x45, 0x0a, 0x99, 0x00, 0x6d, 0x57, 0x39, 0x74, + 0x00, 0x6d, 0x58, 0x42, 0x27, 0x00, 0x6d, 0x59, + 0x15, 0x33, 0x00, 0x6d, 0x5a, 0x15, 0x31, 0x00, + 0x6d, 0x5b, 0x46, 0x0d, 0x00, 0x6d, 0x5c, 0x0d, + 0xbf, 0x00, 0x6d, 0x5e, 0x39, 0x75, 0x00, 0x6d, + 0x5f, 0x55, 0x6a, 0x00, 0x6d, 0x60, 0x46, 0x0e, + 0x00, 0x6d, 0x61, 0x4c, 0x24, 0x00, 0x6d, 0x63, + 0x15, 0x2e, 0x00, 0x6d, 0x64, 0x15, 0x30, 0x00, + 0x6d, 0x65, 0x39, 0x76, 0x00, 0x6d, 0x66, 0x04, + 0xdc, 0x00, 0x6d, 0x67, 0x55, 0x6b, 0x00, 0x6d, + 0x69, 0x07, 0xd2, 0x00, 0x6d, 0x6a, 0x0f, 0xd8, + 0x00, 0x6d, 0x6c, 0x05, 0x9b, 0x00, 0x6d, 0x6e, + 0x0d, 0xd4, 0x00, 0x6d, 0x6f, 0x21, 0x45, 0x00, + 0x6d, 0x70, 0x46, 0x0f, 0x00, 0x6d, 0x74, 0x0f, + 0x4b, 0x00, 0x6d, 0x77, 0x34, 0x0f, 0x00, 0x6d, + 0x78, 0x0a, 0x01, 0x00, 0x6d, 0x79, 0x15, 0x32, + 0x00, 0x6d, 0x7c, 0x4c, 0x25, 0x00, 0x6d, 0x80, + 0x46, 0x10, 0x00, 0x6d, 0x81, 0x46, 0x11, 0x00, + 0x6d, 0x82, 0x39, 0x77, 0x00, 0x6d, 0x85, 0x15, + 0x37, 0x00, 0x6d, 0x87, 0x21, 0x44, 0x00, 0x6d, + 0x88, 0x09, 0xab, 0x00, 0x6d, 0x89, 0x34, 0x2a, + 0x00, 0x6d, 0x8a, 0x46, 0x12, 0x00, 0x6d, 0x8c, + 0x0f, 0x1a, 0x00, 0x6d, 0x8d, 0x46, 0x13, 0x00, + 0x6d, 0x8e, 0x15, 0x34, 0x00, 0x6d, 0x91, 0x46, + 0x14, 0x00, 0x6d, 0x92, 0x55, 0x6c, 0x00, 0x6d, + 0x93, 0x15, 0x2f, 0x00, 0x6d, 0x94, 0x42, 0x28, + 0x00, 0x6d, 0x95, 0x15, 0x35, 0x00, 0x6d, 0x96, + 0x21, 0x46, 0x00, 0x6d, 0x97, 0x55, 0x6d, 0x00, + 0x6d, 0x98, 0x46, 0x15, 0x00, 0x6d, 0x99, 0x0f, + 0xa6, 0x00, 0x6d, 0x9b, 0x0c, 0x6d, 0x00, 0x6d, + 0x9c, 0x0c, 0x9a, 0x00, 0x6d, 0xaa, 0x42, 0x29, + 0x00, 0x6d, 0xab, 0x46, 0x1a, 0x00, 0x6d, 0xac, + 0x21, 0x47, 0x00, 0x6d, 0xae, 0x46, 0x1b, 0x00, + 0x6d, 0xaf, 0x05, 0x94, 0x00, 0x6d, 0xb2, 0x04, + 0xf7, 0x00, 0x6d, 0xb4, 0x46, 0x1c, 0x00, 0x6d, + 0xb5, 0x15, 0x3b, 0x00, 0x6d, 0xb7, 0x55, 0x6e, + 0x00, 0x6d, 0xb8, 0x15, 0x3e, 0x00, 0x6d, 0xb9, + 0x4c, 0x26, 0x00, 0x6d, 0xbc, 0x0f, 0x8b, 0x00, + 0x6d, 0xbd, 0x55, 0x6f, 0x00, 0x6d, 0xbf, 0x39, + 0x78, 0x00, 0x6d, 0xc0, 0x0f, 0x4e, 0x00, 0x6d, + 0xc2, 0x46, 0x1d, 0x00, 0x6d, 0xc4, 0x39, 0x79, + 0x00, 0x6d, 0xc5, 0x15, 0x45, 0x00, 0x6d, 0xc6, + 0x15, 0x3f, 0x00, 0x6d, 0xc7, 0x15, 0x3c, 0x00, + 0x6d, 0xc8, 0x46, 0x1f, 0x00, 0x6d, 0xca, 0x39, + 0x7a, 0x00, 0x6d, 0xcb, 0x0f, 0x9c, 0x00, 0x6d, + 0xcc, 0x15, 0x42, 0x00, 0x6d, 0xce, 0x46, 0x20, + 0x00, 0x6d, 0xcf, 0x21, 0x48, 0x00, 0x6d, 0xd0, + 0x3c, 0x36, 0x00, 0x6d, 0xd1, 0x09, 0x54, 0x00, + 0x6d, 0xd2, 0x15, 0x44, 0x00, 0x6d, 0xd5, 0x15, + 0x49, 0x00, 0x6d, 0xd6, 0x39, 0x7b, 0x00, 0x6d, + 0xd8, 0x0c, 0x6b, 0x00, 0x6d, 0xd9, 0x15, 0x47, + 0x00, 0x6d, 0xda, 0x34, 0x53, 0x00, 0x6d, 0xdb, + 0x42, 0x2a, 0x00, 0x6d, 0xdd, 0x42, 0x2b, 0x00, + 0x6d, 0xde, 0x15, 0x41, 0x00, 0x6d, 0xdf, 0x46, + 0x21, 0x00, 0x6d, 0xe0, 0x55, 0x70, 0x00, 0x6d, + 0xe1, 0x0b, 0x76, 0x00, 0x6d, 0xe2, 0x55, 0x71, + 0x00, 0x6d, 0xe4, 0x15, 0x48, 0x00, 0x6d, 0xe5, + 0x55, 0x72, 0x00, 0x6d, 0xe6, 0x15, 0x3d, 0x00, + 0x6d, 0xe8, 0x15, 0x43, 0x00, 0x6d, 0xe9, 0x39, + 0x7c, 0x00, 0x6d, 0xea, 0x15, 0x4a, 0x00, 0x6d, + 0xeb, 0x04, 0xc0, 0x00, 0x6d, 0xec, 0x15, 0x40, + 0x00, 0x6d, 0xee, 0x15, 0x4b, 0x00, 0x6d, 0xef, + 0x55, 0x73, 0x00, 0x6d, 0xf0, 0x4c, 0x27, 0x00, + 0x6d, 0xf1, 0x0a, 0x02, 0x00, 0x6d, 0xf2, 0x21, + 0x4a, 0x00, 0x6d, 0xf3, 0x09, 0x69, 0x00, 0x6d, + 0xf4, 0x55, 0x74, 0x00, 0x6d, 0xf5, 0x0d, 0xf5, + 0x00, 0x6d, 0xf6, 0x46, 0x22, 0x00, 0x6d, 0xf7, + 0x08, 0x1e, 0x00, 0x6d, 0xf8, 0x21, 0x49, 0x00, + 0x6d, 0xf9, 0x15, 0x38, 0x00, 0x6d, 0xfa, 0x15, + 0x46, 0x00, 0x6d, 0xfb, 0x0c, 0x34, 0x00, 0x6d, + 0xfc, 0x21, 0x4b, 0x00, 0x6e, 0x00, 0x55, 0x75, + 0x00, 0x6e, 0x04, 0x55, 0x76, 0x00, 0x6e, 0x05, + 0x0a, 0x5a, 0x00, 0x6e, 0x07, 0x05, 0xc7, 0x00, + 0x6e, 0x08, 0x08, 0x41, 0x00, 0x6e, 0x09, 0x09, + 0xac, 0x00, 0x6e, 0x0a, 0x15, 0x3a, 0x00, 0x6e, + 0x0b, 0x09, 0x4c, 0x00, 0x6e, 0x13, 0x07, 0x22, + 0x00, 0x6e, 0x15, 0x15, 0x39, 0x00, 0x6e, 0x17, + 0x37, 0x46, 0x00, 0x6e, 0x19, 0x15, 0x4f, 0x00, + 0x6e, 0x1a, 0x1e, 0x14, 0x00, 0x6e, 0x1b, 0x07, + 0x6e, 0x00, 0x6e, 0x1d, 0x15, 0x5e, 0x00, 0x6e, + 0x1e, 0x46, 0x24, 0x00, 0x6e, 0x1f, 0x15, 0x58, + 0x00, 0x6e, 0x20, 0x06, 0x8e, 0x00, 0x6e, 0x21, + 0x0c, 0x49, 0x00, 0x6e, 0x22, 0x39, 0x7d, 0x00, + 0x6e, 0x23, 0x15, 0x53, 0x00, 0x6e, 0x24, 0x15, + 0x5c, 0x00, 0x6e, 0x25, 0x04, 0x73, 0x00, 0x6e, + 0x26, 0x04, 0xd4, 0x00, 0x6e, 0x27, 0x21, 0x4e, + 0x00, 0x6e, 0x29, 0x05, 0x39, 0x00, 0x6e, 0x2b, + 0x15, 0x55, 0x00, 0x6e, 0x2c, 0x0b, 0x0c, 0x00, + 0x6e, 0x2d, 0x15, 0x4c, 0x00, 0x6e, 0x2e, 0x15, + 0x4e, 0x00, 0x6e, 0x2f, 0x07, 0xd3, 0x00, 0x6e, + 0x32, 0x46, 0x26, 0x00, 0x6e, 0x34, 0x34, 0x12, + 0x00, 0x6e, 0x36, 0x46, 0x23, 0x00, 0x6e, 0x38, + 0x15, 0x5f, 0x00, 0x6e, 0x39, 0x21, 0x4c, 0x00, + 0x6e, 0x3a, 0x15, 0x5a, 0x00, 0x6e, 0x3b, 0x55, + 0x77, 0x00, 0x6e, 0x3c, 0x21, 0x4f, 0x00, 0x6e, + 0x3e, 0x15, 0x52, 0x00, 0x6e, 0x42, 0x3c, 0x37, + 0x00, 0x6e, 0x43, 0x15, 0x59, 0x00, 0x6e, 0x44, + 0x42, 0x2c, 0x00, 0x6e, 0x45, 0x4c, 0x28, 0x00, + 0x6e, 0x48, 0x46, 0x27, 0x00, 0x6e, 0x49, 0x46, + 0x28, 0x00, 0x6e, 0x4a, 0x0e, 0xb7, 0x00, 0x6e, + 0x4b, 0x46, 0x29, 0x00, 0x6e, 0x4c, 0x46, 0x2a, + 0x00, 0x6e, 0x4d, 0x15, 0x57, 0x00, 0x6e, 0x4e, + 0x15, 0x5b, 0x00, 0x6e, 0x4f, 0x46, 0x2b, 0x00, + 0x6e, 0x51, 0x39, 0x7e, 0x00, 0x6e, 0x52, 0x55, + 0x78, 0x00, 0x6e, 0x53, 0x46, 0x2c, 0x00, 0x6e, + 0x54, 0x46, 0x2d, 0x00, 0x6e, 0x56, 0x07, 0x84, + 0x00, 0x6e, 0x57, 0x46, 0x2e, 0x00, 0x6e, 0x58, + 0x09, 0xad, 0x00, 0x6e, 0x5b, 0x0b, 0x77, 0x00, + 0x6e, 0x5c, 0x21, 0x4d, 0x00, 0x6e, 0x5d, 0x55, + 0x79, 0x00, 0x6e, 0x5e, 0x42, 0x2d, 0x00, 0x6e, + 0x5f, 0x15, 0x51, 0x00, 0x6e, 0x62, 0x55, 0x7a, + 0x00, 0x6e, 0x63, 0x46, 0x2f, 0x00, 0x6e, 0x67, + 0x0f, 0x19, 0x00, 0x6e, 0x68, 0x55, 0x7b, 0x00, + 0x6e, 0x6b, 0x15, 0x54, 0x00, 0x6e, 0x6e, 0x15, + 0x4d, 0x00, 0x6e, 0x6f, 0x0c, 0x6c, 0x00, 0x6e, + 0x72, 0x15, 0x50, 0x00, 0x6e, 0x73, 0x4c, 0x29, + 0x00, 0x6e, 0x76, 0x15, 0x56, 0x00, 0x6e, 0x7b, + 0x4c, 0x2a, 0x00, 0x6e, 0x7d, 0x4c, 0x2b, 0x00, + 0x6e, 0x7e, 0x0f, 0xf7, 0x00, 0x6e, 0x7f, 0x08, + 0xea, 0x00, 0x6e, 0x80, 0x0e, 0xac, 0x00, 0x6e, + 0x82, 0x15, 0x60, 0x00, 0x6e, 0x89, 0x4c, 0x2c, + 0x00, 0x6e, 0x8c, 0x0d, 0x42, 0x00, 0x6e, 0x8d, + 0x55, 0x7c, 0x00, 0x6e, 0x8f, 0x15, 0x6c, 0x00, + 0x6e, 0x90, 0x07, 0x6f, 0x00, 0x6e, 0x93, 0x46, + 0x31, 0x00, 0x6e, 0x96, 0x09, 0x6a, 0x00, 0x6e, + 0x98, 0x15, 0x62, 0x00, 0x6e, 0x99, 0x55, 0x7d, + 0x00, 0x6e, 0x9c, 0x0f, 0x77, 0x00, 0x6e, 0x9d, + 0x07, 0xd4, 0x00, 0x6e, 0x9f, 0x15, 0x6f, 0x00, + 0x6e, 0xa0, 0x55, 0x7e, 0x00, 0x6e, 0xa2, 0x04, + 0xb2, 0x00, 0x6e, 0xa5, 0x15, 0x6d, 0x00, 0x6e, + 0xa7, 0x46, 0x32, 0x00, 0x6e, 0xaa, 0x15, 0x61, + 0x00, 0x6e, 0xab, 0x34, 0x0c, 0x00, 0x6e, 0xad, + 0x55, 0x7f, 0x00, 0x6e, 0xae, 0x55, 0x80, 0x00, + 0x6e, 0xaf, 0x15, 0x67, 0x00, 0x6e, 0xb1, 0x42, + 0x2e, 0x00, 0x6e, 0xb2, 0x15, 0x69, 0x00, 0x6e, + 0xb3, 0x55, 0x81, 0x00, 0x6e, 0xb4, 0x46, 0x33, + 0x00, 0x6e, 0xb6, 0x0f, 0x39, 0x00, 0x6e, 0xb7, + 0x15, 0x64, 0x00, 0x6e, 0xba, 0x0c, 0x28, 0x00, + 0x6e, 0xbb, 0x55, 0x82, 0x00, 0x6e, 0xbc, 0x4c, + 0x2d, 0x00, 0x6e, 0xbd, 0x15, 0x66, 0x00, 0x6e, + 0xbf, 0x21, 0x50, 0x00, 0x6e, 0xc0, 0x55, 0x83, + 0x00, 0x6e, 0xc1, 0x42, 0x2f, 0x00, 0x6e, 0xc2, + 0x15, 0x6e, 0x00, 0x6e, 0xc3, 0x46, 0x34, 0x00, + 0x6e, 0xc4, 0x15, 0x68, 0x00, 0x6e, 0xc5, 0x0e, + 0xd3, 0x00, 0x6e, 0xc7, 0x39, 0x7f, 0x00, 0x6e, + 0xc8, 0x55, 0x84, 0x00, 0x6e, 0xc9, 0x15, 0x63, + 0x00, 0x6e, 0xca, 0x39, 0x80, 0x00, 0x6e, 0xcb, + 0x08, 0xce, 0x00, 0x6e, 0xcc, 0x15, 0x7b, 0x00, + 0x6e, 0xcd, 0x55, 0x85, 0x00, 0x6e, 0xce, 0x39, + 0x81, 0x00, 0x6e, 0xcf, 0x55, 0x86, 0x00, 0x6e, + 0xd1, 0x05, 0xc8, 0x00, 0x6e, 0xd3, 0x15, 0x65, + 0x00, 0x6e, 0xd4, 0x15, 0x6a, 0x00, 0x6e, 0xd5, + 0x15, 0x6b, 0x00, 0x6e, 0xd9, 0x3c, 0x38, 0x00, + 0x6e, 0xda, 0x4c, 0x2e, 0x00, 0x6e, 0xdb, 0x4c, + 0x2f, 0x00, 0x6e, 0xdd, 0x0b, 0x4c, 0x00, 0x6e, + 0xde, 0x0b, 0x3a, 0x00, 0x6e, 0xe6, 0x3c, 0x24, + 0x00, 0x6e, 0xeb, 0x46, 0x36, 0x00, 0x6e, 0xec, + 0x15, 0x73, 0x00, 0x6e, 0xed, 0x55, 0x87, 0x00, + 0x6e, 0xee, 0x55, 0x88, 0x00, 0x6e, 0xef, 0x15, + 0x79, 0x00, 0x6e, 0xf2, 0x15, 0x77, 0x00, 0x6e, + 0xf4, 0x0c, 0x23, 0x00, 0x6e, 0xf7, 0x15, 0x7e, + 0x00, 0x6e, 0xf8, 0x15, 0x74, 0x00, 0x6e, 0xf9, + 0x46, 0x37, 0x00, 0x6e, 0xfb, 0x46, 0x38, 0x00, + 0x6e, 0xfd, 0x39, 0x82, 0x00, 0x6e, 0xfe, 0x15, + 0x75, 0x00, 0x6e, 0xff, 0x15, 0x5d, 0x00, 0x6f, + 0x01, 0x06, 0x93, 0x00, 0x6f, 0x02, 0x0d, 0xac, + 0x00, 0x6f, 0x04, 0x55, 0x89, 0x00, 0x6f, 0x06, + 0x08, 0xeb, 0x00, 0x6f, 0x08, 0x55, 0x8a, 0x00, + 0x6f, 0x09, 0x08, 0x09, 0x00, 0x6f, 0x0a, 0x46, + 0x39, 0x00, 0x6f, 0x0c, 0x46, 0x3a, 0x00, 0x6f, + 0x0d, 0x55, 0x8b, 0x00, 0x6f, 0x0f, 0x0f, 0xd9, + 0x00, 0x6f, 0x10, 0x42, 0x30, 0x00, 0x6f, 0x11, + 0x15, 0x71, 0x00, 0x6f, 0x13, 0x15, 0x7d, 0x00, + 0x6f, 0x14, 0x05, 0x0b, 0x00, 0x6f, 0x15, 0x0a, + 0xe8, 0x00, 0x6f, 0x16, 0x55, 0x8c, 0x00, 0x6f, + 0x18, 0x46, 0x3b, 0x00, 0x6f, 0x1a, 0x39, 0x83, + 0x00, 0x6f, 0x1b, 0x55, 0x8d, 0x00, 0x6f, 0x20, + 0x0d, 0x2f, 0x00, 0x6f, 0x22, 0x05, 0xfd, 0x00, + 0x6f, 0x23, 0x1e, 0x81, 0x00, 0x6f, 0x25, 0x46, + 0x3c, 0x00, 0x6f, 0x26, 0x4c, 0x30, 0x00, 0x6f, + 0x29, 0x4c, 0x31, 0x00, 0x6f, 0x2a, 0x39, 0x84, + 0x00, 0x6f, 0x2b, 0x0e, 0xad, 0x00, 0x6f, 0x2c, + 0x0b, 0xee, 0x00, 0x6f, 0x2d, 0x55, 0x8f, 0x00, + 0x6f, 0x2f, 0x39, 0x85, 0x00, 0x6f, 0x30, 0x4c, + 0x32, 0x00, 0x6f, 0x31, 0x15, 0x78, 0x00, 0x6f, + 0x32, 0x15, 0x7a, 0x00, 0x6f, 0x33, 0x39, 0x86, + 0x00, 0x6f, 0x35, 0x46, 0x35, 0x00, 0x6f, 0x36, + 0x46, 0x3d, 0x00, 0x6f, 0x38, 0x0a, 0xb4, 0x00, + 0x6f, 0x3b, 0x55, 0x8e, 0x00, 0x6f, 0x3c, 0x46, + 0x3e, 0x00, 0x6f, 0x3e, 0x15, 0x7c, 0x00, 0x6f, + 0x3f, 0x15, 0x76, 0x00, 0x6f, 0x41, 0x15, 0x70, + 0x00, 0x6f, 0x45, 0x05, 0xff, 0x00, 0x6f, 0x4f, + 0x55, 0x90, 0x00, 0x6f, 0x51, 0x1e, 0x60, 0x00, + 0x6f, 0x52, 0x46, 0x40, 0x00, 0x6f, 0x53, 0x55, + 0x91, 0x00, 0x6f, 0x54, 0x07, 0x3f, 0x00, 0x6f, + 0x57, 0x46, 0x41, 0x00, 0x6f, 0x58, 0x15, 0x8a, + 0x00, 0x6f, 0x59, 0x42, 0x31, 0x00, 0x6f, 0x5a, + 0x39, 0x87, 0x00, 0x6f, 0x5b, 0x15, 0x85, 0x00, + 0x6f, 0x5c, 0x0a, 0x9c, 0x00, 0x6f, 0x5d, 0x55, + 0x92, 0x00, 0x6f, 0x5e, 0x39, 0x88, 0x00, 0x6f, + 0x5f, 0x05, 0xc1, 0x00, 0x6f, 0x60, 0x46, 0x42, + 0x00, 0x6f, 0x61, 0x42, 0x32, 0x00, 0x6f, 0x62, + 0x39, 0x89, 0x00, 0x6f, 0x64, 0x09, 0x6b, 0x00, + 0x6f, 0x66, 0x15, 0x8e, 0x00, 0x6f, 0x68, 0x46, + 0x43, 0x00, 0x6f, 0x6c, 0x55, 0x93, 0x00, 0x6f, + 0x6d, 0x15, 0x87, 0x00, 0x6f, 0x6e, 0x36, 0x6c, + 0x00, 0x6f, 0x6f, 0x15, 0x84, 0x00, 0x6f, 0x70, + 0x0b, 0xf5, 0x00, 0x6f, 0x74, 0x15, 0xa7, 0x00, + 0x6f, 0x78, 0x15, 0x81, 0x00, 0x6f, 0x7a, 0x15, + 0x80, 0x00, 0x6f, 0x7c, 0x15, 0x89, 0x00, 0x6f, + 0x7d, 0x39, 0x8a, 0x00, 0x6f, 0x7e, 0x42, 0x33, + 0x00, 0x6f, 0x80, 0x15, 0x83, 0x00, 0x6f, 0x81, + 0x15, 0x82, 0x00, 0x6f, 0x82, 0x15, 0x88, 0x00, + 0x6f, 0x83, 0x55, 0x94, 0x00, 0x6f, 0x84, 0x0a, + 0x45, 0x00, 0x6f, 0x86, 0x15, 0x7f, 0x00, 0x6f, + 0x87, 0x4c, 0x33, 0x00, 0x6f, 0x88, 0x21, 0x51, + 0x00, 0x6f, 0x8b, 0x39, 0x8b, 0x00, 0x6f, 0x8c, + 0x42, 0x34, 0x00, 0x6f, 0x8d, 0x39, 0x8c, 0x00, + 0x6f, 0x8e, 0x15, 0x8b, 0x00, 0x6f, 0x90, 0x46, + 0x44, 0x00, 0x6f, 0x91, 0x15, 0x8c, 0x00, 0x6f, + 0x92, 0x39, 0x8d, 0x00, 0x6f, 0x93, 0x55, 0x95, + 0x00, 0x6f, 0x94, 0x39, 0x8e, 0x00, 0x6f, 0x96, + 0x46, 0x45, 0x00, 0x6f, 0x97, 0x05, 0xfe, 0x00, + 0x6f, 0x98, 0x36, 0x3c, 0x00, 0x6f, 0x9a, 0x39, + 0x8f, 0x00, 0x6f, 0x9d, 0x4c, 0x34, 0x00, 0x6f, + 0x9f, 0x46, 0x47, 0x00, 0x6f, 0xa0, 0x42, 0x35, + 0x00, 0x6f, 0xa1, 0x15, 0x91, 0x00, 0x6f, 0xa3, + 0x15, 0x90, 0x00, 0x6f, 0xa4, 0x15, 0x92, 0x00, + 0x6f, 0xa5, 0x46, 0x48, 0x00, 0x6f, 0xa6, 0x55, + 0x96, 0x00, 0x6f, 0xa7, 0x39, 0x90, 0x00, 0x6f, + 0xa8, 0x39, 0x91, 0x00, 0x6f, 0xaa, 0x15, 0x95, + 0x00, 0x6f, 0xae, 0x4c, 0x35, 0x00, 0x6f, 0xaf, + 0x46, 0x49, 0x00, 0x6f, 0xb0, 0x55, 0x97, 0x00, + 0x6f, 0xb1, 0x0c, 0x3d, 0x00, 0x6f, 0xb3, 0x15, + 0x8f, 0x00, 0x6f, 0xb5, 0x21, 0x52, 0x00, 0x6f, + 0xb6, 0x39, 0x92, 0x00, 0x6f, 0xb7, 0x4c, 0x36, + 0x00, 0x6f, 0xb9, 0x15, 0x93, 0x00, 0x6f, 0xbc, + 0x42, 0x36, 0x00, 0x6f, 0xbe, 0x46, 0x46, 0x00, + 0x6f, 0xc0, 0x07, 0x39, 0x00, 0x6f, 0xc1, 0x0b, + 0x59, 0x00, 0x6f, 0xc2, 0x15, 0x8d, 0x00, 0x6f, + 0xc3, 0x0c, 0xf1, 0x00, 0x6f, 0xc5, 0x55, 0x98, + 0x00, 0x6f, 0xc6, 0x15, 0x94, 0x00, 0x6f, 0xc7, + 0x42, 0x37, 0x00, 0x6f, 0xc8, 0x46, 0x4b, 0x00, + 0x6f, 0xc9, 0x46, 0x4c, 0x00, 0x6f, 0xca, 0x42, + 0x38, 0x00, 0x6f, 0xd4, 0x15, 0x99, 0x00, 0x6f, + 0xd5, 0x15, 0x97, 0x00, 0x6f, 0xd8, 0x15, 0x9a, + 0x00, 0x6f, 0xda, 0x39, 0x93, 0x00, 0x6f, 0xdb, + 0x15, 0x9d, 0x00, 0x6f, 0xde, 0x39, 0x94, 0x00, + 0x6f, 0xdf, 0x15, 0x96, 0x00, 0x6f, 0xe0, 0x07, + 0xfc, 0x00, 0x6f, 0xe1, 0x0c, 0xde, 0x00, 0x6f, + 0xe4, 0x15, 0x36, 0x00, 0x6f, 0xe8, 0x55, 0x99, + 0x00, 0x6f, 0xe9, 0x46, 0x4d, 0x00, 0x6f, 0xeb, + 0x0f, 0x5e, 0x00, 0x6f, 0xec, 0x15, 0x98, 0x00, + 0x6f, 0xee, 0x15, 0x9c, 0x00, 0x6f, 0xef, 0x0b, + 0x55, 0x00, 0x6f, 0xf0, 0x42, 0x39, 0x00, 0x6f, + 0xf1, 0x15, 0x9b, 0x00, 0x6f, 0xf3, 0x15, 0x86, + 0x00, 0x6f, 0xf5, 0x21, 0x53, 0x00, 0x6f, 0xf6, + 0x1b, 0xa4, 0x00, 0x6f, 0xf9, 0x3c, 0x23, 0x00, + 0x6f, 0xfa, 0x15, 0xa0, 0x00, 0x6f, 0xfc, 0x46, + 0x4f, 0x00, 0x6f, 0xfd, 0x55, 0x9a, 0x00, 0x6f, + 0xfe, 0x15, 0xa4, 0x00, 0x70, 0x00, 0x46, 0x50, + 0x00, 0x70, 0x01, 0x15, 0xa2, 0x00, 0x70, 0x05, + 0x21, 0x54, 0x00, 0x70, 0x06, 0x1e, 0x50, 0x00, + 0x70, 0x07, 0x21, 0x55, 0x00, 0x70, 0x09, 0x15, + 0x9e, 0x00, 0x70, 0x0a, 0x46, 0x51, 0x00, 0x70, + 0x0b, 0x15, 0x9f, 0x00, 0x70, 0x0d, 0x4c, 0x37, + 0x00, 0x70, 0x0f, 0x15, 0xa3, 0x00, 0x70, 0x11, + 0x15, 0xa1, 0x00, 0x70, 0x15, 0x0d, 0xc0, 0x00, + 0x70, 0x17, 0x55, 0x9b, 0x00, 0x70, 0x18, 0x15, + 0xa9, 0x00, 0x70, 0x1a, 0x15, 0xa6, 0x00, 0x70, + 0x1b, 0x15, 0xa5, 0x00, 0x70, 0x1d, 0x15, 0xa8, + 0x00, 0x70, 0x1e, 0x0c, 0xac, 0x00, 0x70, 0x1f, + 0x15, 0xaa, 0x00, 0x70, 0x20, 0x4c, 0x38, 0x00, + 0x70, 0x23, 0x46, 0x52, 0x00, 0x70, 0x26, 0x0b, + 0xb3, 0x00, 0x70, 0x27, 0x0b, 0x4d, 0x00, 0x70, + 0x28, 0x21, 0x56, 0x00, 0x70, 0x2c, 0x0a, 0x49, + 0x00, 0x70, 0x2f, 0x55, 0x9c, 0x00, 0x70, 0x30, + 0x15, 0xab, 0x00, 0x70, 0x32, 0x15, 0xad, 0x00, + 0x70, 0x34, 0x55, 0x9d, 0x00, 0x70, 0x37, 0x55, + 0x9e, 0x00, 0x70, 0x39, 0x39, 0x96, 0x00, 0x70, + 0x3a, 0x46, 0x54, 0x00, 0x70, 0x3c, 0x39, 0x97, + 0x00, 0x70, 0x3e, 0x15, 0xac, 0x00, 0x70, 0x43, + 0x46, 0x55, 0x00, 0x70, 0x44, 0x55, 0x9f, 0x00, + 0x70, 0x47, 0x46, 0x56, 0x00, 0x70, 0x48, 0x55, + 0xa0, 0x00, 0x70, 0x49, 0x4c, 0x39, 0x00, 0x70, + 0x4a, 0x4f, 0x52, 0x00, 0x70, 0x4b, 0x46, 0x57, + 0x00, 0x70, 0x4c, 0x15, 0x72, 0x00, 0x70, 0x4e, + 0x42, 0x3a, 0x00, 0x70, 0x51, 0x15, 0xae, 0x00, + 0x70, 0x54, 0x39, 0x99, 0x00, 0x70, 0x55, 0x55, + 0xa1, 0x00, 0x70, 0x58, 0x0c, 0xbf, 0x00, 0x70, + 0x5d, 0x39, 0x9a, 0x00, 0x70, 0x5e, 0x39, 0x9b, + 0x00, 0x70, 0x63, 0x15, 0xaf, 0x00, 0x70, 0x64, + 0x39, 0x9c, 0x00, 0x70, 0x65, 0x46, 0x59, 0x00, + 0x70, 0x69, 0x46, 0x5a, 0x00, 0x70, 0x6b, 0x05, + 0x50, 0x00, 0x70, 0x6c, 0x39, 0x9d, 0x00, 0x70, + 0x6e, 0x46, 0x5b, 0x00, 0x70, 0x6f, 0x0c, 0x6e, + 0x00, 0x70, 0x70, 0x05, 0x83, 0x00, 0x70, 0x75, + 0x42, 0x3b, 0x00, 0x70, 0x76, 0x46, 0x5c, 0x00, + 0x70, 0x78, 0x06, 0x7e, 0x00, 0x70, 0x7c, 0x09, + 0x0a, 0x00, 0x70, 0x7d, 0x08, 0x42, 0x00, 0x70, + 0x7e, 0x39, 0x9e, 0x00, 0x70, 0x81, 0x39, 0x9f, + 0x00, 0x70, 0x85, 0x21, 0x57, 0x00, 0x70, 0x86, + 0x46, 0x5d, 0x00, 0x70, 0x89, 0x0f, 0xcd, 0x00, + 0x70, 0x8a, 0x0a, 0x2c, 0x00, 0x70, 0x8e, 0x05, + 0x0c, 0x00, 0x70, 0x92, 0x15, 0xb1, 0x00, 0x70, + 0x94, 0x55, 0xa2, 0x00, 0x70, 0x95, 0x39, 0xa0, + 0x00, 0x70, 0x96, 0x55, 0xa3, 0x00, 0x70, 0x97, + 0x46, 0x5e, 0x00, 0x70, 0x98, 0x4c, 0x3a, 0x00, + 0x70, 0x99, 0x15, 0xb0, 0x00, 0x70, 0x9b, 0x55, + 0xa4, 0x00, 0x70, 0x9f, 0x46, 0x60, 0x00, 0x70, + 0xa4, 0x42, 0x3c, 0x00, 0x70, 0xab, 0x21, 0x58, + 0x00, 0x70, 0xac, 0x15, 0xb4, 0x00, 0x70, 0xad, + 0x0b, 0x78, 0x00, 0x70, 0xae, 0x15, 0xb7, 0x00, + 0x70, 0xaf, 0x15, 0xb2, 0x00, 0x70, 0xb0, 0x4c, + 0x3b, 0x00, 0x70, 0xb1, 0x46, 0x61, 0x00, 0x70, + 0xb3, 0x15, 0xb6, 0x00, 0x70, 0xb4, 0x55, 0xa5, + 0x00, 0x70, 0xb7, 0x39, 0xa1, 0x00, 0x70, 0xb8, + 0x15, 0xb5, 0x00, 0x70, 0xb9, 0x0c, 0x3a, 0x00, + 0x70, 0xba, 0x04, 0x9d, 0x00, 0x70, 0xbb, 0x20, + 0xad, 0x00, 0x70, 0xc8, 0x0f, 0xbd, 0x00, 0x70, + 0xca, 0x46, 0x64, 0x00, 0x70, 0xcb, 0x15, 0xb9, + 0x00, 0x70, 0xcf, 0x04, 0xca, 0x00, 0x70, 0xd1, + 0x46, 0x65, 0x00, 0x70, 0xd3, 0x39, 0xa2, 0x00, + 0x70, 0xd4, 0x39, 0xa3, 0x00, 0x70, 0xd5, 0x4c, + 0x3c, 0x00, 0x70, 0xd6, 0x4c, 0x3d, 0x00, 0x70, + 0xd8, 0x39, 0xa4, 0x00, 0x70, 0xd9, 0x15, 0xbb, + 0x00, 0x70, 0xdc, 0x39, 0xa5, 0x00, 0x70, 0xdd, + 0x15, 0xba, 0x00, 0x70, 0xdf, 0x15, 0xb8, 0x00, + 0x70, 0xe4, 0x42, 0x3d, 0x00, 0x70, 0xec, 0x46, + 0x63, 0x00, 0x70, 0xf1, 0x15, 0xb3, 0x00, 0x70, + 0xf9, 0x0e, 0x51, 0x00, 0x70, 0xfa, 0x55, 0xa6, + 0x00, 0x70, 0xfd, 0x15, 0xbd, 0x00, 0x71, 0x03, + 0x46, 0x66, 0x00, 0x71, 0x04, 0x21, 0x5a, 0x00, + 0x71, 0x05, 0x55, 0xa7, 0x00, 0x71, 0x06, 0x46, + 0x67, 0x00, 0x71, 0x07, 0x39, 0xa6, 0x00, 0x71, + 0x08, 0x46, 0x68, 0x00, 0x71, 0x09, 0x15, 0xbc, + 0x00, 0x71, 0x0b, 0x55, 0xa8, 0x00, 0x71, 0x0c, + 0x46, 0x69, 0x00, 0x71, 0x0f, 0x21, 0x59, 0x00, + 0x71, 0x14, 0x05, 0x0d, 0x00, 0x71, 0x19, 0x15, + 0xbf, 0x00, 0x71, 0x1a, 0x0e, 0x02, 0x00, 0x71, + 0x1c, 0x15, 0xbe, 0x00, 0x71, 0x1e, 0x42, 0x3f, + 0x00, 0x71, 0x20, 0x39, 0xa7, 0x00, 0x71, 0x21, + 0x0e, 0xc1, 0x00, 0x71, 0x26, 0x09, 0xaf, 0x00, + 0x71, 0x2b, 0x42, 0x3e, 0x00, 0x71, 0x2d, 0x55, + 0xa9, 0x00, 0x71, 0x2e, 0x42, 0x40, 0x00, 0x71, + 0x2f, 0x46, 0x6b, 0x00, 0x71, 0x30, 0x1d, 0xdc, + 0x00, 0x71, 0x31, 0x39, 0xa8, 0x00, 0x71, 0x36, + 0x0a, 0xb5, 0x00, 0x71, 0x38, 0x55, 0xaa, 0x00, + 0x71, 0x3c, 0x09, 0xae, 0x00, 0x71, 0x41, 0x55, + 0xab, 0x00, 0x71, 0x45, 0x4c, 0x3e, 0x00, 0x71, + 0x46, 0x21, 0x5c, 0x00, 0x71, 0x47, 0x21, 0x5d, + 0x00, 0x71, 0x49, 0x1e, 0x82, 0x00, 0x71, 0x4a, + 0x39, 0xa9, 0x00, 0x71, 0x4b, 0x55, 0xac, 0x00, + 0x71, 0x4c, 0x15, 0xc5, 0x00, 0x71, 0x4e, 0x0a, + 0x9d, 0x00, 0x71, 0x50, 0x46, 0x6c, 0x00, 0x71, + 0x51, 0x42, 0x41, 0x00, 0x71, 0x52, 0x39, 0xaa, + 0x00, 0x71, 0x53, 0x46, 0x6d, 0x00, 0x71, 0x55, + 0x15, 0xc1, 0x00, 0x71, 0x56, 0x15, 0xc6, 0x00, + 0x71, 0x57, 0x55, 0xae, 0x00, 0x71, 0x59, 0x05, + 0x0e, 0x00, 0x71, 0x5a, 0x55, 0xaf, 0x00, 0x71, + 0x5c, 0x21, 0x5b, 0x00, 0x71, 0x5e, 0x46, 0x6e, + 0x00, 0x71, 0x60, 0x39, 0xab, 0x00, 0x71, 0x62, + 0x15, 0xc4, 0x00, 0x71, 0x64, 0x0d, 0x17, 0x00, + 0x71, 0x65, 0x15, 0xc0, 0x00, 0x71, 0x66, 0x15, + 0xc3, 0x00, 0x71, 0x67, 0x09, 0xb0, 0x00, 0x71, + 0x68, 0x42, 0x42, 0x00, 0x71, 0x69, 0x0d, 0x65, + 0x00, 0x71, 0x6c, 0x15, 0xc7, 0x00, 0x71, 0x6e, + 0x34, 0x23, 0x00, 0x71, 0x79, 0x39, 0xac, 0x00, + 0x71, 0x7d, 0x0a, 0x9e, 0x00, 0x71, 0x80, 0x46, + 0x71, 0x00, 0x71, 0x84, 0x15, 0xca, 0x00, 0x71, + 0x85, 0x42, 0x43, 0x00, 0x71, 0x87, 0x42, 0x44, + 0x00, 0x71, 0x88, 0x15, 0xc2, 0x00, 0x71, 0x8a, + 0x06, 0xfd, 0x00, 0x71, 0x8c, 0x55, 0xb0, 0x00, + 0x71, 0x8f, 0x15, 0xc8, 0x00, 0x71, 0x92, 0x39, + 0xad, 0x00, 0x71, 0x94, 0x0f, 0x3a, 0x00, 0x71, + 0x95, 0x15, 0xcb, 0x00, 0x71, 0x96, 0x46, 0x70, + 0x00, 0x71, 0x99, 0x20, 0x5d, 0x00, 0x71, 0x9a, + 0x55, 0xb1, 0x00, 0x71, 0x9b, 0x46, 0x72, 0x00, + 0x71, 0x9f, 0x09, 0x59, 0x00, 0x71, 0xa0, 0x46, + 0x73, 0x00, 0x71, 0xa2, 0x46, 0x74, 0x00, 0x71, + 0xa8, 0x15, 0xcc, 0x00, 0x71, 0xac, 0x15, 0xcd, + 0x00, 0x71, 0xae, 0x46, 0x75, 0x00, 0x71, 0xaf, + 0x46, 0x76, 0x00, 0x71, 0xb0, 0x55, 0xb2, 0x00, + 0x71, 0xb1, 0x0c, 0xe4, 0x00, 0x71, 0xb2, 0x4c, + 0x3f, 0x00, 0x71, 0xb3, 0x3c, 0x25, 0x00, 0x71, + 0xb9, 0x15, 0xcf, 0x00, 0x71, 0xba, 0x42, 0x45, + 0x00, 0x71, 0xbe, 0x15, 0xd0, 0x00, 0x71, 0xbf, + 0x55, 0xb3, 0x00, 0x71, 0xc0, 0x55, 0xb4, 0x00, + 0x71, 0xc1, 0x21, 0x5f, 0x00, 0x71, 0xc3, 0x0c, + 0xe9, 0x00, 0x71, 0xc4, 0x42, 0x46, 0x00, 0x71, + 0xc8, 0x0c, 0x6f, 0x00, 0x71, 0xc9, 0x15, 0xd2, + 0x00, 0x71, 0xcb, 0x39, 0xaf, 0x00, 0x71, 0xcc, + 0x55, 0xb5, 0x00, 0x71, 0xce, 0x15, 0xd4, 0x00, + 0x71, 0xd0, 0x0f, 0x9d, 0x00, 0x71, 0xd2, 0x15, + 0xd1, 0x00, 0x71, 0xd3, 0x39, 0xb0, 0x00, 0x71, + 0xd4, 0x15, 0xd3, 0x00, 0x71, 0xd5, 0x05, 0x0f, + 0x00, 0x71, 0xd6, 0x39, 0xb1, 0x00, 0x71, 0xd7, + 0x15, 0xce, 0x00, 0x71, 0xd9, 0x46, 0x78, 0x00, + 0x71, 0xda, 0x55, 0xb6, 0x00, 0x71, 0xdc, 0x46, + 0x79, 0x00, 0x71, 0xdf, 0x11, 0x4e, 0x00, 0x71, + 0xe0, 0x15, 0xd5, 0x00, 0x71, 0xe5, 0x0a, 0xe9, + 0x00, 0x71, 0xe6, 0x08, 0x86, 0x00, 0x71, 0xe7, + 0x15, 0xd7, 0x00, 0x71, 0xec, 0x15, 0xd6, 0x00, + 0x71, 0xed, 0x09, 0xea, 0x00, 0x71, 0xee, 0x10, + 0xee, 0x00, 0x71, 0xf4, 0x4c, 0x40, 0x00, 0x71, + 0xf5, 0x15, 0xd8, 0x00, 0x71, 0xf8, 0x55, 0xb7, + 0x00, 0x71, 0xf9, 0x15, 0xda, 0x00, 0x71, 0xfb, + 0x15, 0xc9, 0x00, 0x71, 0xfc, 0x15, 0xd9, 0x00, + 0x71, 0xfe, 0x21, 0x60, 0x00, 0x71, 0xff, 0x15, + 0xdb, 0x00, 0x72, 0x00, 0x39, 0xb2, 0x00, 0x72, + 0x06, 0x0d, 0x30, 0x00, 0x72, 0x07, 0x46, 0x7a, + 0x00, 0x72, 0x08, 0x55, 0xb8, 0x00, 0x72, 0x09, + 0x55, 0xb9, 0x00, 0x72, 0x0d, 0x15, 0xdc, 0x00, + 0x72, 0x10, 0x15, 0xdd, 0x00, 0x72, 0x13, 0x55, + 0xba, 0x00, 0x72, 0x15, 0x42, 0x47, 0x00, 0x72, + 0x17, 0x4c, 0x41, 0x00, 0x72, 0x1a, 0x55, 0xbb, + 0x00, 0x72, 0x1b, 0x15, 0xde, 0x00, 0x72, 0x1d, + 0x39, 0xb3, 0x00, 0x72, 0x1f, 0x4c, 0x42, 0x00, + 0x72, 0x24, 0x55, 0xbc, 0x00, 0x72, 0x28, 0x1e, + 0x9f, 0x00, 0x72, 0x2a, 0x0b, 0xfa, 0x00, 0x72, + 0x2b, 0x39, 0xb4, 0x00, 0x72, 0x2c, 0x15, 0xe1, + 0x00, 0x72, 0x2d, 0x15, 0xe0, 0x00, 0x72, 0x2f, + 0x55, 0xbd, 0x00, 0x72, 0x30, 0x15, 0xe2, 0x00, + 0x72, 0x32, 0x15, 0xe3, 0x00, 0x72, 0x34, 0x46, + 0x7c, 0x00, 0x72, 0x35, 0x35, 0xf1, 0x00, 0x72, + 0x36, 0x0d, 0xd5, 0x00, 0x72, 0x38, 0x39, 0xb5, + 0x00, 0x72, 0x39, 0x46, 0x7d, 0x00, 0x72, 0x3a, + 0x0e, 0xf8, 0x00, 0x72, 0x3b, 0x15, 0xe4, 0x00, + 0x72, 0x3c, 0x15, 0xe5, 0x00, 0x72, 0x3d, 0x0a, + 0xd8, 0x00, 0x72, 0x3e, 0x08, 0xd0, 0x00, 0x72, + 0x3f, 0x15, 0xe6, 0x00, 0x72, 0x40, 0x15, 0xe7, + 0x00, 0x72, 0x41, 0x39, 0xb6, 0x00, 0x72, 0x42, + 0x46, 0x7e, 0x00, 0x72, 0x43, 0x4c, 0x43, 0x00, + 0x72, 0x45, 0x55, 0xbe, 0x00, 0x72, 0x46, 0x15, + 0xe8, 0x00, 0x72, 0x47, 0x0e, 0x22, 0x00, 0x72, + 0x48, 0x0d, 0x5b, 0x00, 0x72, 0x4b, 0x15, 0xe9, + 0x00, 0x72, 0x4c, 0x0d, 0x0d, 0x00, 0x72, 0x4e, + 0x55, 0xbf, 0x00, 0x72, 0x4f, 0x4c, 0x44, 0x00, + 0x72, 0x50, 0x4c, 0x45, 0x00, 0x72, 0x52, 0x0b, + 0xc9, 0x00, 0x72, 0x53, 0x39, 0xb7, 0x00, 0x72, + 0x55, 0x39, 0xb8, 0x00, 0x72, 0x56, 0x39, 0xb9, + 0x00, 0x72, 0x57, 0x46, 0x7f, 0x00, 0x72, 0x58, + 0x15, 0xea, 0x00, 0x72, 0x59, 0x05, 0x67, 0x00, + 0x72, 0x5a, 0x4c, 0x46, 0x00, 0x72, 0x5b, 0x06, + 0x87, 0x00, 0x72, 0x5c, 0x39, 0xba, 0x00, 0x72, + 0x5d, 0x0e, 0xd2, 0x00, 0x72, 0x5e, 0x55, 0xc0, + 0x00, 0x72, 0x5f, 0x0e, 0xc2, 0x00, 0x72, 0x60, + 0x4c, 0x47, 0x00, 0x72, 0x61, 0x05, 0x34, 0x00, + 0x72, 0x62, 0x0f, 0xda, 0x00, 0x72, 0x63, 0x46, + 0x80, 0x00, 0x72, 0x67, 0x0e, 0x80, 0x00, 0x72, + 0x68, 0x4c, 0x48, 0x00, 0x72, 0x69, 0x0d, 0xfa, + 0x00, 0x72, 0x6b, 0x55, 0xc1, 0x00, 0x72, 0x6e, + 0x46, 0x82, 0x00, 0x72, 0x6f, 0x46, 0x83, 0x00, + 0x72, 0x71, 0x55, 0xc2, 0x00, 0x72, 0x72, 0x0a, + 0x5b, 0x00, 0x72, 0x74, 0x15, 0xeb, 0x00, 0x72, + 0x77, 0x4c, 0x49, 0x00, 0x72, 0x78, 0x46, 0x84, + 0x00, 0x72, 0x79, 0x0c, 0x9b, 0x00, 0x72, 0x7b, + 0x55, 0xc3, 0x00, 0x72, 0x7c, 0x55, 0xc4, 0x00, + 0x72, 0x7d, 0x07, 0x57, 0x00, 0x72, 0x7e, 0x15, + 0xec, 0x00, 0x72, 0x7f, 0x46, 0x85, 0x00, 0x72, + 0x80, 0x08, 0x44, 0x00, 0x72, 0x81, 0x15, 0xee, + 0x00, 0x72, 0x82, 0x15, 0xed, 0x00, 0x72, 0x84, + 0x4c, 0x4a, 0x00, 0x72, 0x87, 0x15, 0xef, 0x00, + 0x72, 0x89, 0x55, 0xc5, 0x00, 0x72, 0x8d, 0x39, + 0xbb, 0x00, 0x72, 0x8e, 0x46, 0x86, 0x00, 0x72, + 0x92, 0x15, 0xf0, 0x00, 0x72, 0x93, 0x55, 0xc6, + 0x00, 0x72, 0x96, 0x15, 0xf1, 0x00, 0x72, 0x9b, + 0x42, 0x49, 0x00, 0x72, 0xa0, 0x06, 0x58, 0x00, + 0x72, 0xa2, 0x15, 0xf2, 0x00, 0x72, 0xa7, 0x15, + 0xf3, 0x00, 0x72, 0xa8, 0x55, 0xc7, 0x00, 0x72, + 0xac, 0x07, 0x58, 0x00, 0x72, 0xad, 0x39, 0xbc, + 0x00, 0x72, 0xae, 0x46, 0x88, 0x00, 0x72, 0xaf, + 0x0d, 0x5c, 0x00, 0x72, 0xb0, 0x46, 0x89, 0x00, + 0x72, 0xb1, 0x21, 0x61, 0x00, 0x72, 0xb2, 0x15, + 0xf5, 0x00, 0x72, 0xb4, 0x39, 0xbd, 0x00, 0x72, + 0xb6, 0x09, 0xdd, 0x00, 0x72, 0xb9, 0x15, 0xf4, + 0x00, 0x72, 0xbe, 0x21, 0x62, 0x00, 0x72, 0xc0, + 0x34, 0x2b, 0x00, 0x72, 0xc1, 0x46, 0x8a, 0x00, + 0x72, 0xc2, 0x06, 0xb0, 0x00, 0x72, 0xc3, 0x15, + 0xf6, 0x00, 0x72, 0xc4, 0x15, 0xf8, 0x00, 0x72, + 0xc6, 0x15, 0xf7, 0x00, 0x72, 0xc7, 0x39, 0xbe, + 0x00, 0x72, 0xc9, 0x4c, 0x4b, 0x00, 0x72, 0xcc, + 0x46, 0x8c, 0x00, 0x72, 0xce, 0x15, 0xf9, 0x00, + 0x72, 0xd0, 0x07, 0x85, 0x00, 0x72, 0xd2, 0x15, + 0xfa, 0x00, 0x72, 0xd5, 0x55, 0xc8, 0x00, 0x72, + 0xd6, 0x55, 0xc9, 0x00, 0x72, 0xd7, 0x06, 0xe1, + 0x00, 0x72, 0xd8, 0x55, 0xca, 0x00, 0x72, 0xd9, + 0x0a, 0xc2, 0x00, 0x72, 0xdb, 0x08, 0x0f, 0x00, + 0x72, 0xdf, 0x55, 0xcb, 0x00, 0x72, 0xe0, 0x15, + 0xfc, 0x00, 0x72, 0xe1, 0x15, 0xfd, 0x00, 0x72, + 0xe2, 0x15, 0xfb, 0x00, 0x72, 0xe5, 0x4c, 0x4c, + 0x00, 0x72, 0xe9, 0x09, 0x19, 0x00, 0x72, 0xec, + 0x0c, 0xa0, 0x00, 0x72, 0xed, 0x06, 0xb1, 0x00, + 0x72, 0xf3, 0x46, 0x8f, 0x00, 0x72, 0xf4, 0x4c, + 0x4d, 0x00, 0x72, 0xf7, 0x15, 0xff, 0x00, 0x72, + 0xf8, 0x0b, 0x6a, 0x00, 0x72, 0xf9, 0x15, 0xfe, + 0x00, 0x72, 0xfa, 0x46, 0x90, 0x00, 0x72, 0xfb, + 0x39, 0xbf, 0x00, 0x72, 0xfc, 0x0f, 0xdb, 0x00, + 0x72, 0xfd, 0x0d, 0x18, 0x00, 0x72, 0xfe, 0x55, + 0xcc, 0x00, 0x73, 0x02, 0x4c, 0x4e, 0x00, 0x73, + 0x04, 0x39, 0xc0, 0x00, 0x73, 0x05, 0x39, 0xc1, + 0x00, 0x73, 0x07, 0x46, 0x91, 0x00, 0x73, 0x0a, + 0x16, 0x02, 0x00, 0x73, 0x0b, 0x4c, 0x4f, 0x00, + 0x73, 0x0d, 0x55, 0xcd, 0x00, 0x73, 0x12, 0x46, + 0x92, 0x00, 0x73, 0x13, 0x55, 0xce, 0x00, 0x73, + 0x16, 0x16, 0x04, 0x00, 0x73, 0x17, 0x16, 0x01, + 0x00, 0x73, 0x18, 0x46, 0x93, 0x00, 0x73, 0x19, + 0x46, 0x94, 0x00, 0x73, 0x1b, 0x0e, 0xe0, 0x00, + 0x73, 0x1c, 0x16, 0x03, 0x00, 0x73, 0x1d, 0x16, + 0x05, 0x00, 0x73, 0x1e, 0x4c, 0x50, 0x00, 0x73, + 0x1f, 0x0f, 0x8c, 0x00, 0x73, 0x22, 0x4c, 0x51, + 0x00, 0x73, 0x24, 0x21, 0x63, 0x00, 0x73, 0x25, + 0x16, 0x09, 0x00, 0x73, 0x27, 0x42, 0x4b, 0x00, + 0x73, 0x28, 0x39, 0xc2, 0x00, 0x73, 0x29, 0x16, + 0x08, 0x00, 0x73, 0x2a, 0x21, 0x64, 0x00, 0x73, + 0x2b, 0x0c, 0xe3, 0x00, 0x73, 0x2c, 0x46, 0x97, + 0x00, 0x73, 0x2e, 0x07, 0x59, 0x00, 0x73, 0x2f, + 0x16, 0x07, 0x00, 0x73, 0x31, 0x39, 0xc3, 0x00, + 0x73, 0x32, 0x55, 0xcf, 0x00, 0x73, 0x33, 0x46, + 0x98, 0x00, 0x73, 0x34, 0x16, 0x06, 0x00, 0x73, + 0x35, 0x55, 0xd0, 0x00, 0x73, 0x36, 0x0f, 0x1b, + 0x00, 0x73, 0x37, 0x0f, 0x1c, 0x00, 0x73, 0x39, + 0x46, 0x96, 0x00, 0x73, 0x3a, 0x4c, 0x52, 0x00, + 0x73, 0x3b, 0x4c, 0x53, 0x00, 0x73, 0x3d, 0x46, + 0x99, 0x00, 0x73, 0x3e, 0x16, 0x0a, 0x00, 0x73, + 0x3f, 0x05, 0x10, 0x00, 0x73, 0x43, 0x39, 0xc4, + 0x00, 0x73, 0x44, 0x08, 0x08, 0x00, 0x73, 0x45, + 0x08, 0xb0, 0x00, 0x73, 0x4d, 0x4c, 0x54, 0x00, + 0x73, 0x4e, 0x16, 0x0b, 0x00, 0x73, 0x4f, 0x16, + 0x0c, 0x00, 0x73, 0x50, 0x42, 0x4c, 0x00, 0x73, + 0x52, 0x46, 0x9a, 0x00, 0x73, 0x56, 0x55, 0xd1, + 0x00, 0x73, 0x57, 0x16, 0x0e, 0x00, 0x73, 0x58, + 0x4c, 0x55, 0x00, 0x73, 0x5d, 0x55, 0xd2, 0x00, + 0x73, 0x5e, 0x55, 0xd3, 0x00, 0x73, 0x5f, 0x55, + 0xd4, 0x00, 0x73, 0x60, 0x55, 0xd5, 0x00, 0x73, + 0x63, 0x09, 0x4d, 0x00, 0x73, 0x66, 0x42, 0x4d, + 0x00, 0x73, 0x67, 0x4c, 0x56, 0x00, 0x73, 0x68, + 0x16, 0x10, 0x00, 0x73, 0x69, 0x55, 0xd6, 0x00, + 0x73, 0x6a, 0x16, 0x0f, 0x00, 0x73, 0x6b, 0x46, + 0x9c, 0x00, 0x73, 0x6c, 0x39, 0xc5, 0x00, 0x73, + 0x6e, 0x46, 0x9e, 0x00, 0x73, 0x6f, 0x46, 0x9f, + 0x00, 0x73, 0x70, 0x16, 0x11, 0x00, 0x73, 0x71, + 0x46, 0xa0, 0x00, 0x73, 0x72, 0x05, 0xab, 0x00, + 0x73, 0x75, 0x16, 0x13, 0x00, 0x73, 0x77, 0x21, + 0x65, 0x00, 0x73, 0x78, 0x16, 0x12, 0x00, 0x73, + 0x79, 0x55, 0xd7, 0x00, 0x73, 0x7a, 0x16, 0x15, + 0x00, 0x73, 0x7b, 0x16, 0x14, 0x00, 0x73, 0x7c, + 0x39, 0xc6, 0x00, 0x73, 0x80, 0x55, 0xd8, 0x00, + 0x73, 0x81, 0x46, 0xa1, 0x00, 0x73, 0x83, 0x39, + 0xc7, 0x00, 0x73, 0x84, 0x07, 0x70, 0x00, 0x73, + 0x85, 0x39, 0xc8, 0x00, 0x73, 0x86, 0x39, 0xc9, + 0x00, 0x73, 0x87, 0x0f, 0x70, 0x00, 0x73, 0x89, + 0x06, 0xc4, 0x00, 0x73, 0x8a, 0x46, 0xa2, 0x00, + 0x73, 0x8b, 0x05, 0x26, 0x00, 0x73, 0x8e, 0x55, + 0xd9, 0x00, 0x73, 0x90, 0x55, 0xda, 0x00, 0x73, + 0x93, 0x55, 0xdb, 0x00, 0x73, 0x94, 0x46, 0xa3, + 0x00, 0x73, 0x95, 0x39, 0xca, 0x00, 0x73, 0x96, + 0x06, 0xe2, 0x00, 0x73, 0x97, 0x55, 0xdc, 0x00, + 0x73, 0x98, 0x46, 0xa4, 0x00, 0x73, 0x9c, 0x46, + 0xa5, 0x00, 0x73, 0x9e, 0x39, 0xcb, 0x00, 0x73, + 0x9f, 0x39, 0xcc, 0x00, 0x73, 0xa0, 0x39, 0xcd, + 0x00, 0x73, 0xa2, 0x42, 0x4e, 0x00, 0x73, 0xa5, + 0x46, 0xa6, 0x00, 0x73, 0xa6, 0x39, 0xce, 0x00, + 0x73, 0xa8, 0x3c, 0x3f, 0x00, 0x73, 0xa9, 0x06, + 0x1d, 0x00, 0x73, 0xaa, 0x55, 0xdd, 0x00, 0x73, + 0xab, 0x39, 0xcf, 0x00, 0x73, 0xad, 0x55, 0xde, + 0x00, 0x73, 0xb2, 0x0f, 0xb0, 0x00, 0x73, 0xb3, + 0x16, 0x17, 0x00, 0x73, 0xb5, 0x39, 0xd0, 0x00, + 0x73, 0xb7, 0x39, 0xd1, 0x00, 0x73, 0xb9, 0x46, + 0xa7, 0x00, 0x73, 0xba, 0x35, 0xea, 0x00, 0x73, + 0xbb, 0x16, 0x19, 0x00, 0x73, 0xbc, 0x39, 0xd2, + 0x00, 0x73, 0xbd, 0x21, 0x66, 0x00, 0x73, 0xbf, + 0x46, 0xa8, 0x00, 0x73, 0xc0, 0x16, 0x1a, 0x00, + 0x73, 0xc2, 0x05, 0x51, 0x00, 0x73, 0xc5, 0x46, + 0xa9, 0x00, 0x73, 0xc6, 0x55, 0xdf, 0x00, 0x73, + 0xc8, 0x16, 0x16, 0x00, 0x73, 0xc9, 0x21, 0x67, + 0x00, 0x73, 0xca, 0x08, 0x87, 0x00, 0x73, 0xcb, + 0x46, 0xaa, 0x00, 0x73, 0xcc, 0x55, 0xe0, 0x00, + 0x73, 0xcd, 0x0b, 0xdd, 0x00, 0x73, 0xce, 0x16, + 0x18, 0x00, 0x73, 0xcf, 0x39, 0xd3, 0x00, 0x73, + 0xd2, 0x21, 0x6a, 0x00, 0x73, 0xd3, 0x55, 0xe1, + 0x00, 0x73, 0xd6, 0x21, 0x68, 0x00, 0x73, 0xd9, + 0x39, 0xd4, 0x00, 0x73, 0xdd, 0x55, 0xe2, 0x00, + 0x73, 0xde, 0x16, 0x1d, 0x00, 0x73, 0xe0, 0x09, + 0x1a, 0x00, 0x73, 0xe1, 0x46, 0xab, 0x00, 0x73, + 0xe3, 0x21, 0x69, 0x00, 0x73, 0xe4, 0x3c, 0x39, + 0x00, 0x73, 0xe5, 0x16, 0x1b, 0x00, 0x73, 0xe6, + 0x55, 0xe3, 0x00, 0x73, 0xe7, 0x46, 0xac, 0x00, + 0x73, 0xe9, 0x39, 0xd5, 0x00, 0x73, 0xea, 0x07, + 0x14, 0x00, 0x73, 0xed, 0x0d, 0x5d, 0x00, 0x73, + 0xee, 0x16, 0x1c, 0x00, 0x73, 0xf1, 0x16, 0x37, + 0x00, 0x73, 0xf4, 0x39, 0xd6, 0x00, 0x73, 0xf5, + 0x21, 0x6c, 0x00, 0x73, 0xf7, 0x55, 0xe4, 0x00, + 0x73, 0xf8, 0x16, 0x22, 0x00, 0x73, 0xf9, 0x46, + 0xad, 0x00, 0x73, 0xfa, 0x46, 0xaf, 0x00, 0x73, + 0xfb, 0x55, 0xe5, 0x00, 0x73, 0xfd, 0x39, 0xd7, + 0x00, 0x73, 0xfe, 0x07, 0x71, 0x00, 0x73, 0xff, + 0x55, 0xe6, 0x00, 0x74, 0x00, 0x55, 0xe7, 0x00, + 0x74, 0x01, 0x46, 0xb0, 0x00, 0x74, 0x03, 0x06, + 0x7f, 0x00, 0x74, 0x04, 0x39, 0xd8, 0x00, 0x74, + 0x05, 0x16, 0x1f, 0x00, 0x74, 0x06, 0x0f, 0x67, + 0x00, 0x74, 0x07, 0x21, 0x6b, 0x00, 0x74, 0x09, + 0x0f, 0x78, 0x00, 0x74, 0x0a, 0x39, 0xd9, 0x00, + 0x74, 0x11, 0x55, 0xe8, 0x00, 0x74, 0x13, 0x46, + 0xae, 0x00, 0x74, 0x1a, 0x39, 0xda, 0x00, 0x74, + 0x1b, 0x39, 0xdb, 0x00, 0x74, 0x21, 0x3c, 0x3a, + 0x00, 0x74, 0x22, 0x1e, 0x34, 0x00, 0x74, 0x24, + 0x39, 0xdc, 0x00, 0x74, 0x25, 0x16, 0x21, 0x00, + 0x74, 0x26, 0x21, 0x6d, 0x00, 0x74, 0x28, 0x39, + 0xdd, 0x00, 0x74, 0x29, 0x21, 0x6f, 0x00, 0x74, + 0x2a, 0x21, 0x6e, 0x00, 0x74, 0x2b, 0x42, 0x4f, + 0x00, 0x74, 0x2c, 0x39, 0xde, 0x00, 0x74, 0x2d, + 0x55, 0xe9, 0x00, 0x74, 0x2e, 0x21, 0x70, 0x00, + 0x74, 0x2f, 0x39, 0xdf, 0x00, 0x74, 0x30, 0x39, + 0xe0, 0x00, 0x74, 0x31, 0x39, 0xe1, 0x00, 0x74, + 0x32, 0x16, 0x23, 0x00, 0x74, 0x33, 0x0f, 0x9e, + 0x00, 0x74, 0x34, 0x06, 0xcf, 0x00, 0x74, 0x35, + 0x0d, 0x90, 0x00, 0x74, 0x36, 0x0d, 0x00, 0x00, + 0x74, 0x39, 0x39, 0xe2, 0x00, 0x74, 0x3a, 0x16, + 0x24, 0x00, 0x74, 0x3f, 0x16, 0x26, 0x00, 0x74, + 0x40, 0x46, 0xb2, 0x00, 0x74, 0x41, 0x16, 0x29, + 0x00, 0x74, 0x43, 0x46, 0xb3, 0x00, 0x74, 0x44, + 0x39, 0xe3, 0x00, 0x74, 0x46, 0x42, 0x50, 0x00, + 0x74, 0x47, 0x39, 0xe4, 0x00, 0x74, 0x4b, 0x39, + 0xe5, 0x00, 0x74, 0x4d, 0x39, 0xe6, 0x00, 0x74, + 0x51, 0x39, 0xe7, 0x00, 0x74, 0x52, 0x46, 0xb4, + 0x00, 0x74, 0x53, 0x46, 0xb1, 0x00, 0x74, 0x55, + 0x16, 0x25, 0x00, 0x74, 0x57, 0x39, 0xe8, 0x00, + 0x74, 0x59, 0x16, 0x28, 0x00, 0x74, 0x5a, 0x07, + 0x9e, 0x00, 0x74, 0x5b, 0x04, 0xef, 0x00, 0x74, + 0x5c, 0x16, 0x2a, 0x00, 0x74, 0x5d, 0x46, 0xb5, + 0x00, 0x74, 0x5e, 0x0a, 0x36, 0x00, 0x74, 0x5f, + 0x16, 0x27, 0x00, 0x74, 0x60, 0x0f, 0xa4, 0x00, + 0x74, 0x62, 0x42, 0x51, 0x00, 0x74, 0x63, 0x16, + 0x2d, 0x00, 0x74, 0x64, 0x1d, 0x35, 0x00, 0x74, + 0x66, 0x39, 0xe9, 0x00, 0x74, 0x67, 0x55, 0xea, + 0x00, 0x74, 0x68, 0x55, 0xeb, 0x00, 0x74, 0x69, + 0x16, 0x2b, 0x00, 0x74, 0x6a, 0x16, 0x2e, 0x00, + 0x74, 0x6b, 0x39, 0xea, 0x00, 0x74, 0x6d, 0x42, + 0x52, 0x00, 0x74, 0x6e, 0x55, 0xec, 0x00, 0x74, + 0x6f, 0x16, 0x20, 0x00, 0x74, 0x70, 0x16, 0x2c, + 0x00, 0x74, 0x71, 0x39, 0xeb, 0x00, 0x74, 0x72, + 0x4c, 0x57, 0x00, 0x74, 0x73, 0x08, 0x2c, 0x00, + 0x74, 0x76, 0x16, 0x2f, 0x00, 0x74, 0x7e, 0x16, + 0x30, 0x00, 0x74, 0x80, 0x39, 0xec, 0x00, 0x74, + 0x81, 0x46, 0xb6, 0x00, 0x74, 0x83, 0x0f, 0x68, + 0x00, 0x74, 0x85, 0x39, 0xed, 0x00, 0x74, 0x86, + 0x39, 0xee, 0x00, 0x74, 0x87, 0x39, 0xef, 0x00, + 0x74, 0x88, 0x46, 0xb7, 0x00, 0x74, 0x89, 0x21, + 0x72, 0x00, 0x74, 0x8b, 0x16, 0x31, 0x00, 0x74, + 0x8f, 0x55, 0xed, 0x00, 0x74, 0x90, 0x39, 0xf0, + 0x00, 0x74, 0x91, 0x55, 0xee, 0x00, 0x74, 0x92, + 0x46, 0xb9, 0x00, 0x74, 0x97, 0x46, 0xba, 0x00, + 0x74, 0x98, 0x39, 0xf1, 0x00, 0x74, 0x99, 0x46, + 0xbb, 0x00, 0x74, 0x9a, 0x55, 0xef, 0x00, 0x74, + 0x9c, 0x39, 0xf2, 0x00, 0x74, 0x9e, 0x16, 0x32, + 0x00, 0x74, 0x9f, 0x21, 0x73, 0x00, 0x74, 0xa0, + 0x39, 0xf3, 0x00, 0x74, 0xa1, 0x46, 0xbc, 0x00, + 0x74, 0xa2, 0x16, 0x1e, 0x00, 0x74, 0xa3, 0x39, + 0xf4, 0x00, 0x74, 0xa5, 0x46, 0xbd, 0x00, 0x74, + 0xa6, 0x42, 0x53, 0x00, 0x74, 0xa7, 0x16, 0x33, + 0x00, 0x74, 0xa8, 0x39, 0xf5, 0x00, 0x74, 0xa9, + 0x42, 0x54, 0x00, 0x74, 0xaa, 0x46, 0xbe, 0x00, + 0x74, 0xab, 0x39, 0xf6, 0x00, 0x74, 0xae, 0x55, + 0xf0, 0x00, 0x74, 0xaf, 0x4c, 0x58, 0x00, 0x74, + 0xb0, 0x06, 0x00, 0x00, 0x74, 0xb1, 0x55, 0xf1, + 0x00, 0x74, 0xb2, 0x55, 0xf2, 0x00, 0x74, 0xb5, + 0x39, 0xf7, 0x00, 0x74, 0xb9, 0x46, 0xbf, 0x00, + 0x74, 0xba, 0x46, 0xc1, 0x00, 0x74, 0xbb, 0x46, + 0xc0, 0x00, 0x74, 0xbd, 0x08, 0xd1, 0x00, 0x74, + 0xbf, 0x39, 0xf8, 0x00, 0x74, 0xc8, 0x39, 0xf9, + 0x00, 0x74, 0xc9, 0x42, 0x55, 0x00, 0x74, 0xca, + 0x16, 0x34, 0x00, 0x74, 0xcc, 0x55, 0xf3, 0x00, + 0x74, 0xcf, 0x16, 0x35, 0x00, 0x74, 0xd0, 0x55, + 0xf4, 0x00, 0x74, 0xd3, 0x55, 0xf5, 0x00, 0x74, + 0xd4, 0x16, 0x36, 0x00, 0x74, 0xd6, 0x46, 0xc2, + 0x00, 0x74, 0xd8, 0x46, 0xc3, 0x00, 0x74, 0xda, + 0x39, 0xfa, 0x00, 0x74, 0xdb, 0x55, 0xf7, 0x00, + 0x74, 0xdc, 0x04, 0xdd, 0x00, 0x74, 0xde, 0x39, + 0xfb, 0x00, 0x74, 0xdf, 0x4c, 0x59, 0x00, 0x74, + 0xe0, 0x16, 0x38, 0x00, 0x74, 0xe2, 0x0d, 0xad, + 0x00, 0x74, 0xe3, 0x16, 0x39, 0x00, 0x74, 0xe4, + 0x4c, 0x5a, 0x00, 0x74, 0xe6, 0x05, 0xe0, 0x00, + 0x74, 0xe7, 0x16, 0x3a, 0x00, 0x74, 0xe8, 0x55, + 0xf8, 0x00, 0x74, 0xe9, 0x16, 0x3b, 0x00, 0x74, + 0xea, 0x55, 0xf9, 0x00, 0x74, 0xeb, 0x46, 0xc4, + 0x00, 0x74, 0xee, 0x16, 0x3c, 0x00, 0x74, 0xef, + 0x37, 0x50, 0x00, 0x74, 0xf0, 0x16, 0x3e, 0x00, + 0x74, 0xf1, 0x16, 0x3f, 0x00, 0x74, 0xf2, 0x16, + 0x3d, 0x00, 0x74, 0xf4, 0x4c, 0x5b, 0x00, 0x74, + 0xf6, 0x0d, 0xc5, 0x00, 0x74, 0xf7, 0x16, 0x41, + 0x00, 0x74, 0xf8, 0x16, 0x40, 0x00, 0x74, 0xfa, + 0x46, 0xc6, 0x00, 0x74, 0xfb, 0x4c, 0x5c, 0x00, + 0x74, 0xfc, 0x55, 0xfb, 0x00, 0x74, 0xff, 0x42, + 0x56, 0x00, 0x75, 0x01, 0x21, 0x74, 0x00, 0x75, + 0x03, 0x16, 0x43, 0x00, 0x75, 0x04, 0x16, 0x42, + 0x00, 0x75, 0x05, 0x16, 0x44, 0x00, 0x75, 0x06, + 0x55, 0xfc, 0x00, 0x75, 0x0c, 0x16, 0x45, 0x00, + 0x75, 0x0d, 0x16, 0x47, 0x00, 0x75, 0x0e, 0x16, + 0x46, 0x00, 0x75, 0x11, 0x08, 0x0b, 0x00, 0x75, + 0x12, 0x55, 0xfd, 0x00, 0x75, 0x13, 0x16, 0x49, + 0x00, 0x75, 0x15, 0x16, 0x48, 0x00, 0x75, 0x16, + 0x4c, 0x5d, 0x00, 0x75, 0x17, 0x42, 0x57, 0x00, + 0x75, 0x18, 0x06, 0x01, 0x00, 0x75, 0x1a, 0x0a, + 0x19, 0x00, 0x75, 0x1c, 0x0c, 0x36, 0x00, 0x75, + 0x1e, 0x16, 0x4a, 0x00, 0x75, 0x1f, 0x0a, 0x5c, + 0x00, 0x75, 0x20, 0x46, 0xc8, 0x00, 0x75, 0x21, + 0x4c, 0x5e, 0x00, 0x75, 0x22, 0x35, 0xde, 0x00, + 0x75, 0x23, 0x08, 0x88, 0x00, 0x75, 0x24, 0x46, + 0xc9, 0x00, 0x75, 0x25, 0x05, 0x1b, 0x00, 0x75, + 0x26, 0x16, 0x4b, 0x00, 0x75, 0x27, 0x55, 0xfe, + 0x00, 0x75, 0x28, 0x0f, 0x3b, 0x00, 0x75, 0x29, + 0x55, 0xff, 0x00, 0x75, 0x2a, 0x46, 0xca, 0x00, + 0x75, 0x2b, 0x0e, 0x33, 0x00, 0x75, 0x2c, 0x16, + 0x4c, 0x00, 0x75, 0x2f, 0x20, 0xf2, 0x00, 0x75, + 0x30, 0x0c, 0x3e, 0x00, 0x75, 0x31, 0x0f, 0x1d, + 0x00, 0x75, 0x32, 0x07, 0xd5, 0x00, 0x75, 0x33, + 0x0a, 0x03, 0x00, 0x75, 0x36, 0x56, 0x00, 0x00, + 0x75, 0x37, 0x0b, 0x89, 0x00, 0x75, 0x38, 0x10, + 0xc9, 0x00, 0x75, 0x39, 0x56, 0x01, 0x00, 0x75, + 0x3a, 0x0b, 0xca, 0x00, 0x75, 0x3b, 0x05, 0x68, + 0x00, 0x75, 0x3c, 0x16, 0x4d, 0x00, 0x75, 0x3d, + 0x46, 0xcd, 0x00, 0x75, 0x3e, 0x46, 0xce, 0x00, + 0x75, 0x3f, 0x4c, 0x5f, 0x00, 0x75, 0x40, 0x46, + 0xcf, 0x00, 0x75, 0x43, 0x56, 0x02, 0x00, 0x75, + 0x44, 0x16, 0x4e, 0x00, 0x75, 0x46, 0x16, 0x53, + 0x00, 0x75, 0x47, 0x56, 0x03, 0x00, 0x75, 0x48, + 0x46, 0xd0, 0x00, 0x75, 0x49, 0x16, 0x51, 0x00, + 0x75, 0x4a, 0x16, 0x50, 0x00, 0x75, 0x4b, 0x13, + 0xc7, 0x00, 0x75, 0x4c, 0x05, 0x84, 0x00, 0x75, + 0x4d, 0x16, 0x4f, 0x00, 0x75, 0x4e, 0x39, 0xfc, + 0x00, 0x75, 0x4f, 0x04, 0x9e, 0x00, 0x75, 0x50, + 0x46, 0xd1, 0x00, 0x75, 0x51, 0x0d, 0x3e, 0x00, + 0x75, 0x52, 0x46, 0xd2, 0x00, 0x75, 0x54, 0x0d, + 0x5e, 0x00, 0x75, 0x57, 0x56, 0x04, 0x00, 0x75, + 0x59, 0x0f, 0x79, 0x00, 0x75, 0x5a, 0x16, 0x54, + 0x00, 0x75, 0x5b, 0x16, 0x52, 0x00, 0x75, 0x5c, + 0x0b, 0x9a, 0x00, 0x75, 0x5d, 0x0a, 0x4a, 0x00, + 0x75, 0x5e, 0x4c, 0x60, 0x00, 0x75, 0x5f, 0x56, + 0x05, 0x00, 0x75, 0x60, 0x0d, 0x3f, 0x00, 0x75, + 0x61, 0x56, 0x06, 0x00, 0x75, 0x62, 0x0d, 0x9f, + 0x00, 0x75, 0x64, 0x16, 0x56, 0x00, 0x75, 0x65, + 0x0f, 0x74, 0x00, 0x75, 0x66, 0x07, 0x23, 0x00, + 0x75, 0x67, 0x16, 0x57, 0x00, 0x75, 0x69, 0x16, + 0x55, 0x00, 0x75, 0x6a, 0x0d, 0x6a, 0x00, 0x75, + 0x6b, 0x16, 0x58, 0x00, 0x75, 0x6c, 0x3c, 0x3b, + 0x00, 0x75, 0x6d, 0x16, 0x59, 0x00, 0x75, 0x6f, + 0x21, 0x75, 0x00, 0x75, 0x70, 0x04, 0x9f, 0x00, + 0x75, 0x71, 0x46, 0xd4, 0x00, 0x75, 0x72, 0x46, + 0xd3, 0x00, 0x75, 0x73, 0x09, 0xde, 0x00, 0x75, + 0x74, 0x16, 0x5e, 0x00, 0x75, 0x75, 0x37, 0x51, + 0x00, 0x75, 0x76, 0x16, 0x5b, 0x00, 0x75, 0x77, + 0x0c, 0xc5, 0x00, 0x75, 0x78, 0x16, 0x5a, 0x00, + 0x75, 0x79, 0x39, 0xfd, 0x00, 0x75, 0x7a, 0x46, + 0xd5, 0x00, 0x75, 0x7b, 0x56, 0x07, 0x00, 0x75, + 0x7c, 0x56, 0x08, 0x00, 0x75, 0x7d, 0x46, 0xd6, + 0x00, 0x75, 0x7e, 0x46, 0xd7, 0x00, 0x75, 0x7f, + 0x06, 0x40, 0x00, 0x75, 0x81, 0x39, 0xfe, 0x00, + 0x75, 0x82, 0x16, 0x61, 0x00, 0x75, 0x85, 0x56, + 0x09, 0x00, 0x75, 0x86, 0x16, 0x5c, 0x00, 0x75, + 0x87, 0x16, 0x5d, 0x00, 0x75, 0x89, 0x16, 0x60, + 0x00, 0x75, 0x8a, 0x16, 0x5f, 0x00, 0x75, 0x8b, + 0x0d, 0x97, 0x00, 0x75, 0x8c, 0x46, 0xd8, 0x00, + 0x75, 0x8e, 0x0a, 0xc4, 0x00, 0x75, 0x8f, 0x0a, + 0xc3, 0x00, 0x75, 0x90, 0x39, 0xff, 0x00, 0x75, + 0x91, 0x06, 0x59, 0x00, 0x75, 0x92, 0x3a, 0x00, + 0x00, 0x75, 0x93, 0x3a, 0x01, 0x00, 0x75, 0x94, + 0x16, 0x62, 0x00, 0x75, 0x95, 0x56, 0x0a, 0x00, + 0x75, 0x99, 0x4c, 0x61, 0x00, 0x75, 0x9a, 0x16, + 0x63, 0x00, 0x75, 0x9c, 0x56, 0x0b, 0x00, 0x75, + 0x9d, 0x16, 0x64, 0x00, 0x75, 0xa2, 0x46, 0xda, + 0x00, 0x75, 0xa3, 0x16, 0x66, 0x00, 0x75, 0xa4, + 0x4c, 0x62, 0x00, 0x75, 0xa5, 0x16, 0x65, 0x00, + 0x75, 0xab, 0x04, 0xf8, 0x00, 0x75, 0xb0, 0x46, + 0xdc, 0x00, 0x75, 0xb1, 0x16, 0x6e, 0x00, 0x75, + 0xb2, 0x0d, 0x7c, 0x00, 0x75, 0xb3, 0x16, 0x68, + 0x00, 0x75, 0xb4, 0x3a, 0x02, 0x00, 0x75, 0xb5, + 0x16, 0x6a, 0x00, 0x75, 0xb7, 0x46, 0xdd, 0x00, + 0x75, 0xb8, 0x16, 0x6c, 0x00, 0x75, 0xb9, 0x0a, + 0x04, 0x00, 0x75, 0xba, 0x56, 0x0c, 0x00, 0x75, + 0xbc, 0x16, 0x6d, 0x00, 0x75, 0xbd, 0x16, 0x6b, + 0x00, 0x75, 0xbe, 0x08, 0xec, 0x00, 0x75, 0xbf, + 0x46, 0xde, 0x00, 0x75, 0xc0, 0x46, 0xdf, 0x00, + 0x75, 0xc1, 0x4c, 0x63, 0x00, 0x75, 0xc2, 0x16, + 0x67, 0x00, 0x75, 0xc3, 0x16, 0x69, 0x00, 0x75, + 0xc4, 0x4c, 0x64, 0x00, 0x75, 0xc5, 0x0d, 0xb4, + 0x00, 0x75, 0xc6, 0x46, 0xe0, 0x00, 0x75, 0xc7, + 0x09, 0xb1, 0x00, 0x75, 0xca, 0x16, 0x70, 0x00, + 0x75, 0xcc, 0x4c, 0x65, 0x00, 0x75, 0xcd, 0x16, + 0x6f, 0x00, 0x75, 0xce, 0x42, 0x59, 0x00, 0x75, + 0xcf, 0x46, 0xe1, 0x00, 0x75, 0xd2, 0x16, 0x71, + 0x00, 0x75, 0xd3, 0x46, 0xe2, 0x00, 0x75, 0xd4, + 0x08, 0xd2, 0x00, 0x75, 0xd5, 0x08, 0x1f, 0x00, + 0x75, 0xd7, 0x4c, 0x66, 0x00, 0x75, 0xd8, 0x0c, + 0x71, 0x00, 0x75, 0xd9, 0x16, 0x72, 0x00, 0x75, + 0xdb, 0x0b, 0xe7, 0x00, 0x75, 0xdc, 0x4c, 0x67, + 0x00, 0x75, 0xdd, 0x46, 0xe3, 0x00, 0x75, 0xde, + 0x16, 0x74, 0x00, 0x75, 0xdf, 0x46, 0xe4, 0x00, + 0x75, 0xe0, 0x46, 0xe5, 0x00, 0x75, 0xe1, 0x4c, + 0x68, 0x00, 0x75, 0xe2, 0x0f, 0x69, 0x00, 0x75, + 0xe3, 0x16, 0x73, 0x00, 0x75, 0xe4, 0x3a, 0x03, + 0x00, 0x75, 0xe7, 0x46, 0xe6, 0x00, 0x75, 0xe9, + 0x0a, 0xeb, 0x00, 0x75, 0xec, 0x37, 0x52, 0x00, + 0x75, 0xee, 0x46, 0xe7, 0x00, 0x75, 0xef, 0x4c, + 0x69, 0x00, 0x75, 0xf0, 0x16, 0x79, 0x00, 0x75, + 0xf1, 0x46, 0xe8, 0x00, 0x75, 0xf2, 0x16, 0x7b, + 0x00, 0x75, 0xf3, 0x16, 0x7c, 0x00, 0x75, 0xf4, + 0x0b, 0x92, 0x00, 0x75, 0xf9, 0x3a, 0x04, 0x00, + 0x75, 0xfa, 0x16, 0x7a, 0x00, 0x75, 0xfc, 0x16, + 0x77, 0x00, 0x75, 0xfe, 0x16, 0x75, 0x00, 0x75, + 0xff, 0x16, 0x76, 0x00, 0x76, 0x00, 0x3a, 0x05, + 0x00, 0x76, 0x01, 0x16, 0x78, 0x00, 0x76, 0x02, + 0x42, 0x5a, 0x00, 0x76, 0x03, 0x46, 0xe9, 0x00, + 0x76, 0x04, 0x4c, 0x6a, 0x00, 0x76, 0x07, 0x46, + 0xeb, 0x00, 0x76, 0x08, 0x42, 0x5b, 0x00, 0x76, + 0x09, 0x16, 0x7f, 0x00, 0x76, 0x0a, 0x3a, 0x06, + 0x00, 0x76, 0x0b, 0x16, 0x7d, 0x00, 0x76, 0x0c, + 0x4c, 0x6b, 0x00, 0x76, 0x0d, 0x16, 0x7e, 0x00, + 0x76, 0x0f, 0x46, 0xec, 0x00, 0x76, 0x12, 0x56, + 0x0d, 0x00, 0x76, 0x13, 0x46, 0xef, 0x00, 0x76, + 0x15, 0x3a, 0x07, 0x00, 0x76, 0x16, 0x3a, 0x08, + 0x00, 0x76, 0x18, 0x46, 0xea, 0x00, 0x76, 0x19, + 0x3a, 0x09, 0x00, 0x76, 0x1b, 0x46, 0xf0, 0x00, + 0x76, 0x1c, 0x46, 0xf1, 0x00, 0x76, 0x1d, 0x4c, + 0x6c, 0x00, 0x76, 0x1e, 0x3a, 0x0a, 0x00, 0x76, + 0x1f, 0x16, 0x80, 0x00, 0x76, 0x20, 0x16, 0x82, + 0x00, 0x76, 0x21, 0x16, 0x83, 0x00, 0x76, 0x22, + 0x16, 0x84, 0x00, 0x76, 0x23, 0x56, 0x0e, 0x00, + 0x76, 0x24, 0x16, 0x85, 0x00, 0x76, 0x25, 0x46, + 0xf3, 0x00, 0x76, 0x26, 0x36, 0x45, 0x00, 0x76, + 0x27, 0x16, 0x81, 0x00, 0x76, 0x28, 0x46, 0xf4, + 0x00, 0x76, 0x29, 0x56, 0x0f, 0x00, 0x76, 0x2d, + 0x3a, 0x0b, 0x00, 0x76, 0x30, 0x16, 0x87, 0x00, + 0x76, 0x32, 0x4c, 0x6d, 0x00, 0x76, 0x33, 0x46, + 0xf6, 0x00, 0x76, 0x34, 0x16, 0x86, 0x00, 0x76, + 0x35, 0x3a, 0x0c, 0x00, 0x76, 0x38, 0x4c, 0x6e, + 0x00, 0x76, 0x39, 0x56, 0x10, 0x00, 0x76, 0x3a, + 0x56, 0x11, 0x00, 0x76, 0x3b, 0x16, 0x88, 0x00, + 0x76, 0x3c, 0x46, 0xf5, 0x00, 0x76, 0x40, 0x56, + 0x12, 0x00, 0x76, 0x41, 0x46, 0xf9, 0x00, 0x76, + 0x42, 0x0f, 0x8d, 0x00, 0x76, 0x43, 0x3a, 0x0d, + 0x00, 0x76, 0x44, 0x56, 0x13, 0x00, 0x76, 0x45, + 0x4c, 0x6f, 0x00, 0x76, 0x46, 0x16, 0x8b, 0x00, + 0x76, 0x47, 0x16, 0x89, 0x00, 0x76, 0x48, 0x16, + 0x8a, 0x00, 0x76, 0x49, 0x46, 0xfb, 0x00, 0x76, + 0x4a, 0x4c, 0x70, 0x00, 0x76, 0x4b, 0x3a, 0x0e, + 0x00, 0x76, 0x4c, 0x06, 0x1e, 0x00, 0x76, 0x4e, + 0x37, 0x53, 0x00, 0x76, 0x52, 0x0f, 0x0a, 0x00, + 0x76, 0x55, 0x46, 0xfc, 0x00, 0x76, 0x56, 0x0e, + 0x1a, 0x00, 0x76, 0x58, 0x16, 0x8d, 0x00, 0x76, + 0x59, 0x56, 0x14, 0x00, 0x76, 0x5c, 0x16, 0x8c, + 0x00, 0x76, 0x5f, 0x4c, 0x71, 0x00, 0x76, 0x61, + 0x16, 0x8e, 0x00, 0x76, 0x62, 0x16, 0x8f, 0x00, + 0x76, 0x64, 0x42, 0x5c, 0x00, 0x76, 0x65, 0x3a, + 0x0f, 0x00, 0x76, 0x67, 0x16, 0x93, 0x00, 0x76, + 0x68, 0x16, 0x90, 0x00, 0x76, 0x69, 0x16, 0x91, + 0x00, 0x76, 0x6a, 0x16, 0x92, 0x00, 0x76, 0x6c, + 0x16, 0x94, 0x00, 0x76, 0x6d, 0x3a, 0x10, 0x00, + 0x76, 0x6e, 0x46, 0xfe, 0x00, 0x76, 0x6f, 0x3a, + 0x11, 0x00, 0x76, 0x70, 0x16, 0x95, 0x00, 0x76, + 0x71, 0x3a, 0x12, 0x00, 0x76, 0x72, 0x16, 0x96, + 0x00, 0x76, 0x74, 0x3a, 0x13, 0x00, 0x76, 0x76, + 0x16, 0x97, 0x00, 0x76, 0x78, 0x16, 0x98, 0x00, + 0x76, 0x7a, 0x0d, 0x43, 0x00, 0x76, 0x7b, 0x0c, + 0x4a, 0x00, 0x76, 0x7c, 0x16, 0x99, 0x00, 0x76, + 0x7d, 0x0d, 0x28, 0x00, 0x76, 0x7e, 0x0d, 0xa6, + 0x00, 0x76, 0x80, 0x16, 0x9a, 0x00, 0x76, 0x81, + 0x42, 0x5d, 0x00, 0x76, 0x82, 0x21, 0x76, 0x00, + 0x76, 0x83, 0x16, 0x9b, 0x00, 0x76, 0x84, 0x0c, + 0x24, 0x00, 0x76, 0x85, 0x56, 0x15, 0x00, 0x76, + 0x86, 0x05, 0x85, 0x00, 0x76, 0x87, 0x07, 0xd6, + 0x00, 0x76, 0x88, 0x16, 0x9c, 0x00, 0x76, 0x8b, + 0x16, 0x9d, 0x00, 0x76, 0x8c, 0x56, 0x16, 0x00, + 0x76, 0x8d, 0x56, 0x17, 0x00, 0x76, 0x8e, 0x16, + 0x9e, 0x00, 0x76, 0x90, 0x08, 0x77, 0x00, 0x76, + 0x93, 0x16, 0xa0, 0x00, 0x76, 0x95, 0x46, 0xff, + 0x00, 0x76, 0x96, 0x16, 0x9f, 0x00, 0x76, 0x99, + 0x16, 0xa1, 0x00, 0x76, 0x9a, 0x16, 0xa2, 0x00, + 0x76, 0x9b, 0x21, 0x79, 0x00, 0x76, 0x9c, 0x21, + 0x77, 0x00, 0x76, 0x9d, 0x42, 0x5e, 0x00, 0x76, + 0x9e, 0x21, 0x78, 0x00, 0x76, 0x9f, 0x56, 0x18, + 0x00, 0x76, 0xa0, 0x47, 0x01, 0x00, 0x76, 0xa1, + 0x47, 0x00, 0x00, 0x76, 0xa2, 0x56, 0x19, 0x00, + 0x76, 0xa3, 0x56, 0x1a, 0x00, 0x76, 0xa4, 0x3a, + 0x14, 0x00, 0x76, 0xa5, 0x3a, 0x15, 0x00, 0x76, + 0xa6, 0x21, 0x7a, 0x00, 0x76, 0xa7, 0x47, 0x02, + 0x00, 0x76, 0xa8, 0x47, 0x03, 0x00, 0x76, 0xaa, + 0x42, 0x5f, 0x00, 0x76, 0xad, 0x4c, 0x72, 0x00, + 0x76, 0xae, 0x0d, 0x7d, 0x00, 0x76, 0xaf, 0x47, + 0x04, 0x00, 0x76, 0xb0, 0x16, 0xa3, 0x00, 0x76, + 0xb4, 0x16, 0xa4, 0x00, 0x76, 0xb6, 0x42, 0x60, + 0x00, 0x76, 0xb7, 0x1d, 0x1c, 0x00, 0x76, 0xb8, + 0x16, 0xa5, 0x00, 0x76, 0xb9, 0x16, 0xa6, 0x00, + 0x76, 0xba, 0x16, 0xa7, 0x00, 0x76, 0xbd, 0x4c, + 0x73, 0x00, 0x76, 0xbf, 0x08, 0x7c, 0x00, 0x76, + 0xc1, 0x56, 0x1b, 0x00, 0x76, 0xc2, 0x16, 0xa8, + 0x00, 0x76, 0xc3, 0x0d, 0x0c, 0x00, 0x76, 0xc5, + 0x3a, 0x16, 0x00, 0x76, 0xc6, 0x0e, 0x8d, 0x00, + 0x76, 0xc8, 0x04, 0xf0, 0x00, 0x76, 0xc9, 0x47, + 0x06, 0x00, 0x76, 0xca, 0x04, 0xf9, 0x00, 0x76, + 0xcb, 0x56, 0x1c, 0x00, 0x76, 0xcc, 0x3a, 0x17, + 0x00, 0x76, 0xcd, 0x16, 0xa9, 0x00, 0x76, 0xce, + 0x42, 0x61, 0x00, 0x76, 0xd2, 0x16, 0xab, 0x00, + 0x76, 0xd4, 0x42, 0x62, 0x00, 0x76, 0xd6, 0x16, + 0xaa, 0x00, 0x76, 0xd7, 0x0c, 0x6a, 0x00, 0x76, + 0xd9, 0x4c, 0x74, 0x00, 0x76, 0xdb, 0x0a, 0x5d, + 0x00, 0x76, 0xdc, 0x14, 0xd8, 0x00, 0x76, 0xde, + 0x16, 0xac, 0x00, 0x76, 0xdf, 0x0e, 0xcd, 0x00, + 0x76, 0xe0, 0x56, 0x1e, 0x00, 0x76, 0xe1, 0x16, + 0xad, 0x00, 0x76, 0xe3, 0x06, 0x02, 0x00, 0x76, + 0xe4, 0x0d, 0x6b, 0x00, 0x76, 0xe5, 0x16, 0xae, + 0x00, 0x76, 0xe6, 0x42, 0x63, 0x00, 0x76, 0xe7, + 0x16, 0xaf, 0x00, 0x76, 0xe8, 0x47, 0x08, 0x00, + 0x76, 0xea, 0x16, 0xb0, 0x00, 0x76, 0xeb, 0x4c, + 0x75, 0x00, 0x76, 0xec, 0x3a, 0x18, 0x00, 0x76, + 0xee, 0x0e, 0xe8, 0x00, 0x76, 0xf0, 0x4c, 0x76, + 0x00, 0x76, 0xf1, 0x42, 0x64, 0x00, 0x76, 0xf2, + 0x0e, 0xe1, 0x00, 0x76, 0xf4, 0x0b, 0xda, 0x00, + 0x76, 0xf6, 0x56, 0x1f, 0x00, 0x76, 0xf8, 0x0a, + 0xec, 0x00, 0x76, 0xf9, 0x4c, 0x77, 0x00, 0x76, + 0xfb, 0x16, 0xb2, 0x00, 0x76, 0xfc, 0x3a, 0x19, + 0x00, 0x76, 0xfe, 0x09, 0x6c, 0x00, 0x77, 0x00, + 0x4c, 0x78, 0x00, 0x77, 0x01, 0x09, 0xb2, 0x00, + 0x77, 0x04, 0x16, 0xb5, 0x00, 0x77, 0x06, 0x56, + 0x20, 0x00, 0x77, 0x07, 0x16, 0xb4, 0x00, 0x77, + 0x08, 0x16, 0xb3, 0x00, 0x77, 0x09, 0x0d, 0x91, + 0x00, 0x77, 0x0a, 0x42, 0x65, 0x00, 0x77, 0x0b, + 0x06, 0x03, 0x00, 0x77, 0x0c, 0x07, 0x5d, 0x00, + 0x77, 0x0e, 0x4c, 0x79, 0x00, 0x77, 0x12, 0x56, + 0x21, 0x00, 0x77, 0x14, 0x56, 0x22, 0x00, 0x77, + 0x15, 0x56, 0x23, 0x00, 0x77, 0x17, 0x47, 0x0a, + 0x00, 0x77, 0x19, 0x42, 0x66, 0x00, 0x77, 0x1a, + 0x47, 0x0b, 0x00, 0x77, 0x1b, 0x16, 0xbb, 0x00, + 0x77, 0x1c, 0x56, 0x24, 0x00, 0x77, 0x1e, 0x34, + 0x2d, 0x00, 0x77, 0x1f, 0x0a, 0x05, 0x00, 0x77, + 0x20, 0x0e, 0xbe, 0x00, 0x77, 0x22, 0x4c, 0x7a, + 0x00, 0x77, 0x24, 0x16, 0xb7, 0x00, 0x77, 0x25, + 0x16, 0xb9, 0x00, 0x77, 0x26, 0x16, 0xba, 0x00, + 0x77, 0x28, 0x4c, 0x7b, 0x00, 0x77, 0x29, 0x16, + 0xb6, 0x00, 0x77, 0x2d, 0x47, 0x0c, 0x00, 0x77, + 0x2e, 0x56, 0x25, 0x00, 0x77, 0x2f, 0x4c, 0x7c, + 0x00, 0x77, 0x34, 0x3a, 0x1a, 0x00, 0x77, 0x35, + 0x47, 0x0d, 0x00, 0x77, 0x36, 0x3a, 0x1b, 0x00, + 0x77, 0x37, 0x16, 0xbc, 0x00, 0x77, 0x38, 0x16, + 0xbd, 0x00, 0x77, 0x39, 0x4c, 0x7d, 0x00, 0x77, + 0x3a, 0x0b, 0xcb, 0x00, 0x77, 0x3c, 0x06, 0x1f, + 0x00, 0x77, 0x3d, 0x56, 0x26, 0x00, 0x77, 0x3e, + 0x4c, 0x7e, 0x00, 0x77, 0x40, 0x0b, 0xa3, 0x00, + 0x77, 0x42, 0x56, 0x27, 0x00, 0x77, 0x45, 0x4c, + 0x7f, 0x00, 0x77, 0x46, 0x21, 0x7c, 0x00, 0x77, + 0x47, 0x16, 0xbe, 0x00, 0x77, 0x4a, 0x4c, 0x80, + 0x00, 0x77, 0x4d, 0x42, 0x67, 0x00, 0x77, 0x4e, + 0x42, 0x68, 0x00, 0x77, 0x4f, 0x4c, 0x81, 0x00, + 0x77, 0x52, 0x56, 0x28, 0x00, 0x77, 0x56, 0x56, + 0x29, 0x00, 0x77, 0x57, 0x56, 0x2a, 0x00, 0x77, + 0x58, 0x47, 0x12, 0x00, 0x77, 0x5a, 0x16, 0xbf, + 0x00, 0x77, 0x5b, 0x16, 0xc2, 0x00, 0x77, 0x5c, + 0x3a, 0x1c, 0x00, 0x77, 0x5e, 0x4c, 0x82, 0x00, + 0x77, 0x5f, 0x3a, 0x1d, 0x00, 0x77, 0x60, 0x3a, + 0x1e, 0x00, 0x77, 0x61, 0x0a, 0x2d, 0x00, 0x77, + 0x62, 0x1e, 0xc5, 0x00, 0x77, 0x63, 0x0c, 0x9c, + 0x00, 0x77, 0x64, 0x4c, 0x83, 0x00, 0x77, 0x65, + 0x16, 0xc3, 0x00, 0x77, 0x66, 0x0e, 0x81, 0x00, + 0x77, 0x67, 0x4c, 0x84, 0x00, 0x77, 0x68, 0x16, + 0xc0, 0x00, 0x77, 0x6a, 0x37, 0x55, 0x00, 0x77, + 0x6b, 0x16, 0xc1, 0x00, 0x77, 0x6c, 0x4c, 0x85, + 0x00, 0x77, 0x70, 0x56, 0x2b, 0x00, 0x77, 0x72, + 0x3a, 0x1f, 0x00, 0x77, 0x73, 0x56, 0x2c, 0x00, + 0x77, 0x74, 0x56, 0x2d, 0x00, 0x77, 0x79, 0x16, + 0xc6, 0x00, 0x77, 0x7a, 0x42, 0x69, 0x00, 0x77, + 0x7c, 0x47, 0x14, 0x00, 0x77, 0x7d, 0x3a, 0x20, + 0x00, 0x77, 0x7e, 0x16, 0xc5, 0x00, 0x77, 0x7f, + 0x16, 0xc4, 0x00, 0x77, 0x80, 0x42, 0x6a, 0x00, + 0x77, 0x84, 0x4c, 0x86, 0x00, 0x77, 0x8b, 0x16, + 0xc8, 0x00, 0x77, 0x8c, 0x4c, 0x87, 0x00, 0x77, + 0x8d, 0x4c, 0x88, 0x00, 0x77, 0x8e, 0x16, 0xc7, + 0x00, 0x77, 0x91, 0x16, 0xc9, 0x00, 0x77, 0x94, + 0x42, 0x6b, 0x00, 0x77, 0x95, 0x3a, 0x21, 0x00, + 0x77, 0x96, 0x4c, 0x89, 0x00, 0x77, 0x9a, 0x47, + 0x17, 0x00, 0x77, 0x9e, 0x16, 0xcb, 0x00, 0x77, + 0x9f, 0x47, 0x18, 0x00, 0x77, 0xa0, 0x16, 0xca, + 0x00, 0x77, 0xa2, 0x47, 0x19, 0x00, 0x77, 0xa4, + 0x47, 0x1a, 0x00, 0x77, 0xa5, 0x0e, 0x1d, 0x00, + 0x77, 0xa7, 0x4c, 0x8a, 0x00, 0x77, 0xa9, 0x37, + 0x56, 0x00, 0x77, 0xaa, 0x3a, 0x22, 0x00, 0x77, + 0xac, 0x09, 0x60, 0x00, 0x77, 0xad, 0x0f, 0x8e, + 0x00, 0x77, 0xae, 0x56, 0x30, 0x00, 0x77, 0xaf, + 0x4c, 0x8b, 0x00, 0x77, 0xb0, 0x16, 0xcc, 0x00, + 0x77, 0xb1, 0x56, 0x31, 0x00, 0x77, 0xb3, 0x0c, + 0x8f, 0x00, 0x77, 0xb5, 0x56, 0x32, 0x00, 0x77, + 0xb6, 0x16, 0xcd, 0x00, 0x77, 0xb7, 0x4c, 0x8c, + 0x00, 0x77, 0xb9, 0x16, 0xce, 0x00, 0x77, 0xbb, + 0x16, 0xd2, 0x00, 0x77, 0xbc, 0x16, 0xd0, 0x00, + 0x77, 0xbd, 0x16, 0xd1, 0x00, 0x77, 0xbe, 0x4c, + 0x8d, 0x00, 0x77, 0xbf, 0x16, 0xcf, 0x00, 0x77, + 0xc3, 0x56, 0x33, 0x00, 0x77, 0xc7, 0x16, 0xd3, + 0x00, 0x77, 0xc9, 0x4c, 0x8e, 0x00, 0x77, 0xcd, + 0x16, 0xd4, 0x00, 0x77, 0xd1, 0x4c, 0x8f, 0x00, + 0x77, 0xd2, 0x56, 0x34, 0x00, 0x77, 0xd5, 0x56, + 0x35, 0x00, 0x77, 0xd7, 0x16, 0xd5, 0x00, 0x77, + 0xd9, 0x4c, 0x90, 0x00, 0x77, 0xda, 0x16, 0xd6, + 0x00, 0x77, 0xdb, 0x0e, 0xc3, 0x00, 0x77, 0xdc, + 0x16, 0xd7, 0x00, 0x77, 0xde, 0x47, 0x1b, 0x00, + 0x77, 0xdf, 0x47, 0x1c, 0x00, 0x77, 0xe0, 0x42, + 0x6c, 0x00, 0x77, 0xe2, 0x0e, 0xfc, 0x00, 0x77, + 0xe3, 0x16, 0xd8, 0x00, 0x77, 0xe4, 0x47, 0x1d, + 0x00, 0x77, 0xe5, 0x0b, 0x8c, 0x00, 0x77, 0xe6, + 0x3a, 0x23, 0x00, 0x77, 0xe7, 0x0d, 0x20, 0x00, + 0x77, 0xe9, 0x06, 0xe3, 0x00, 0x77, 0xea, 0x47, + 0x1e, 0x00, 0x77, 0xec, 0x47, 0x1f, 0x00, 0x77, + 0xed, 0x0b, 0x79, 0x00, 0x77, 0xee, 0x16, 0xd9, + 0x00, 0x77, 0xef, 0x06, 0xb2, 0x00, 0x77, 0xf0, + 0x3a, 0x24, 0x00, 0x77, 0xf1, 0x4c, 0x91, 0x00, + 0x77, 0xf3, 0x0a, 0x74, 0x00, 0x77, 0xf4, 0x3a, + 0x25, 0x00, 0x77, 0xf8, 0x56, 0x36, 0x00, 0x77, + 0xfb, 0x47, 0x20, 0x00, 0x77, 0xfc, 0x16, 0xda, + 0x00, 0x78, 0x02, 0x08, 0x2d, 0x00, 0x78, 0x05, + 0x47, 0x22, 0x00, 0x78, 0x06, 0x3a, 0x26, 0x00, + 0x78, 0x09, 0x47, 0x23, 0x00, 0x78, 0x0c, 0x16, + 0xdb, 0x00, 0x78, 0x0d, 0x47, 0x24, 0x00, 0x78, + 0x0e, 0x56, 0x37, 0x00, 0x78, 0x11, 0x56, 0x38, + 0x00, 0x78, 0x12, 0x16, 0xdc, 0x00, 0x78, 0x14, + 0x07, 0x5a, 0x00, 0x78, 0x15, 0x08, 0x45, 0x00, + 0x78, 0x19, 0x47, 0x25, 0x00, 0x78, 0x1d, 0x56, + 0x39, 0x00, 0x78, 0x20, 0x16, 0xde, 0x00, 0x78, + 0x21, 0x21, 0x7e, 0x00, 0x78, 0x22, 0x3a, 0x27, + 0x00, 0x78, 0x23, 0x56, 0x3a, 0x00, 0x78, 0x25, + 0x0c, 0x50, 0x00, 0x78, 0x26, 0x08, 0x46, 0x00, + 0x78, 0x27, 0x06, 0x68, 0x00, 0x78, 0x2c, 0x47, + 0x26, 0x00, 0x78, 0x2d, 0x3a, 0x28, 0x00, 0x78, + 0x2e, 0x3a, 0x29, 0x00, 0x78, 0x30, 0x3a, 0x2a, + 0x00, 0x78, 0x32, 0x0e, 0x52, 0x00, 0x78, 0x34, + 0x0d, 0x01, 0x00, 0x78, 0x35, 0x3a, 0x2b, 0x00, + 0x78, 0x37, 0x4c, 0x92, 0x00, 0x78, 0x3a, 0x0c, + 0x51, 0x00, 0x78, 0x3f, 0x07, 0xee, 0x00, 0x78, + 0x43, 0x42, 0x6e, 0x00, 0x78, 0x44, 0x56, 0x3b, + 0x00, 0x78, 0x45, 0x16, 0xe0, 0x00, 0x78, 0x47, + 0x47, 0x27, 0x00, 0x78, 0x48, 0x56, 0x3c, 0x00, + 0x78, 0x4c, 0x56, 0x3d, 0x00, 0x78, 0x4e, 0x21, + 0x7f, 0x00, 0x78, 0x4f, 0x34, 0x1e, 0x00, 0x78, + 0x51, 0x3c, 0x3c, 0x00, 0x78, 0x52, 0x56, 0x3e, + 0x00, 0x78, 0x5c, 0x4c, 0x93, 0x00, 0x78, 0x5d, + 0x09, 0xb3, 0x00, 0x78, 0x5e, 0x56, 0x3f, 0x00, + 0x78, 0x60, 0x56, 0x40, 0x00, 0x78, 0x61, 0x56, + 0x41, 0x00, 0x78, 0x63, 0x56, 0x42, 0x00, 0x78, + 0x64, 0x21, 0x80, 0x00, 0x78, 0x68, 0x3a, 0x2c, + 0x00, 0x78, 0x6a, 0x47, 0x28, 0x00, 0x78, 0x6b, + 0x0f, 0x7a, 0x00, 0x78, 0x6c, 0x07, 0xd7, 0x00, + 0x78, 0x6e, 0x42, 0x6f, 0x00, 0x78, 0x6f, 0x07, + 0x5b, 0x00, 0x78, 0x72, 0x0d, 0x37, 0x00, 0x78, + 0x74, 0x16, 0xe2, 0x00, 0x78, 0x7a, 0x21, 0x81, + 0x00, 0x78, 0x7c, 0x16, 0xe4, 0x00, 0x78, 0x7e, + 0x4c, 0x94, 0x00, 0x78, 0x81, 0x07, 0x9f, 0x00, + 0x78, 0x86, 0x16, 0xe3, 0x00, 0x78, 0x87, 0x0c, + 0x12, 0x00, 0x78, 0x8a, 0x47, 0x2a, 0x00, 0x78, + 0x8c, 0x16, 0xe6, 0x00, 0x78, 0x8d, 0x05, 0x95, + 0x00, 0x78, 0x8e, 0x16, 0xe1, 0x00, 0x78, 0x8f, + 0x56, 0x43, 0x00, 0x78, 0x91, 0x34, 0x43, 0x00, + 0x78, 0x93, 0x04, 0xd2, 0x00, 0x78, 0x94, 0x47, + 0x2b, 0x00, 0x78, 0x95, 0x08, 0x5c, 0x00, 0x78, + 0x97, 0x0f, 0xf8, 0x00, 0x78, 0x98, 0x4c, 0x95, + 0x00, 0x78, 0x9a, 0x16, 0xe5, 0x00, 0x78, 0x9d, + 0x47, 0x2d, 0x00, 0x78, 0x9e, 0x3a, 0x2d, 0x00, + 0x78, 0x9f, 0x47, 0x2e, 0x00, 0x78, 0xa1, 0x4c, + 0x96, 0x00, 0x78, 0xa3, 0x16, 0xe7, 0x00, 0x78, + 0xa4, 0x47, 0x2c, 0x00, 0x78, 0xa7, 0x0e, 0x1b, + 0x00, 0x78, 0xa8, 0x56, 0x44, 0x00, 0x78, 0xa9, + 0x0a, 0x7d, 0x00, 0x78, 0xaa, 0x16, 0xe9, 0x00, + 0x78, 0xac, 0x56, 0x45, 0x00, 0x78, 0xad, 0x42, + 0x72, 0x00, 0x78, 0xaf, 0x16, 0xea, 0x00, 0x78, + 0xb0, 0x42, 0x70, 0x00, 0x78, 0xb1, 0x4c, 0x97, + 0x00, 0x78, 0xb2, 0x56, 0x46, 0x00, 0x78, 0xb3, + 0x4c, 0x98, 0x00, 0x78, 0xb5, 0x16, 0xe8, 0x00, + 0x78, 0xba, 0x05, 0xac, 0x00, 0x78, 0xbb, 0x47, + 0x2f, 0x00, 0x78, 0xbc, 0x16, 0xf0, 0x00, 0x78, + 0xbd, 0x56, 0x47, 0x00, 0x78, 0xbe, 0x16, 0xef, + 0x00, 0x78, 0xbf, 0x56, 0x48, 0x00, 0x78, 0xc1, + 0x08, 0xd3, 0x00, 0x78, 0xc5, 0x16, 0xf1, 0x00, + 0x78, 0xc6, 0x16, 0xec, 0x00, 0x78, 0xc7, 0x56, + 0x49, 0x00, 0x78, 0xc8, 0x3a, 0x2e, 0x00, 0x78, + 0xc9, 0x4c, 0x99, 0x00, 0x78, 0xca, 0x16, 0xf2, + 0x00, 0x78, 0xcb, 0x16, 0xed, 0x00, 0x78, 0xcc, + 0x3a, 0x2f, 0x00, 0x78, 0xce, 0x3a, 0x30, 0x00, + 0x78, 0xd0, 0x0d, 0x6c, 0x00, 0x78, 0xd1, 0x16, + 0xeb, 0x00, 0x78, 0xd2, 0x56, 0x4a, 0x00, 0x78, + 0xd3, 0x4c, 0x9a, 0x00, 0x78, 0xd4, 0x16, 0xee, + 0x00, 0x78, 0xd5, 0x47, 0x30, 0x00, 0x78, 0xd6, + 0x56, 0x4b, 0x00, 0x78, 0xda, 0x16, 0xf5, 0x00, + 0x78, 0xdb, 0x56, 0x4c, 0x00, 0x78, 0xdf, 0x56, + 0x4d, 0x00, 0x78, 0xe0, 0x3a, 0x32, 0x00, 0x78, + 0xe1, 0x3a, 0x33, 0x00, 0x78, 0xe4, 0x3a, 0x31, + 0x00, 0x78, 0xe6, 0x47, 0x31, 0x00, 0x78, 0xe7, + 0x16, 0xf4, 0x00, 0x78, 0xe8, 0x0e, 0x8f, 0x00, + 0x78, 0xea, 0x56, 0x4e, 0x00, 0x78, 0xec, 0x16, + 0xf3, 0x00, 0x78, 0xef, 0x04, 0xaf, 0x00, 0x78, + 0xf2, 0x3a, 0x34, 0x00, 0x78, 0xf3, 0x56, 0x4f, + 0x00, 0x78, 0xf4, 0x16, 0xf7, 0x00, 0x78, 0xf6, + 0x56, 0x50, 0x00, 0x78, 0xf7, 0x3a, 0x35, 0x00, + 0x78, 0xf9, 0x47, 0x32, 0x00, 0x78, 0xfa, 0x47, + 0x33, 0x00, 0x78, 0xfb, 0x3a, 0x36, 0x00, 0x78, + 0xfd, 0x16, 0xf6, 0x00, 0x78, 0xfe, 0x47, 0x34, + 0x00, 0x78, 0xff, 0x56, 0x51, 0x00, 0x79, 0x00, + 0x42, 0x73, 0x00, 0x79, 0x01, 0x09, 0xb4, 0x00, + 0x79, 0x06, 0x56, 0x52, 0x00, 0x79, 0x07, 0x16, + 0xf8, 0x00, 0x79, 0x0c, 0x4c, 0x9b, 0x00, 0x79, + 0x0e, 0x0a, 0xc5, 0x00, 0x79, 0x10, 0x47, 0x36, + 0x00, 0x79, 0x11, 0x16, 0xfa, 0x00, 0x79, 0x12, + 0x16, 0xf9, 0x00, 0x79, 0x19, 0x16, 0xfb, 0x00, + 0x79, 0x1a, 0x56, 0x53, 0x00, 0x79, 0x1b, 0x47, + 0x37, 0x00, 0x79, 0x1c, 0x42, 0x74, 0x00, 0x79, + 0x1e, 0x56, 0x54, 0x00, 0x79, 0x1f, 0x4c, 0x9c, + 0x00, 0x79, 0x20, 0x56, 0x55, 0x00, 0x79, 0x25, + 0x47, 0x38, 0x00, 0x79, 0x26, 0x16, 0xdd, 0x00, + 0x79, 0x27, 0x4c, 0x9d, 0x00, 0x79, 0x28, 0x4c, + 0x9e, 0x00, 0x79, 0x29, 0x56, 0x56, 0x00, 0x79, + 0x2a, 0x16, 0xdf, 0x00, 0x79, 0x2b, 0x16, 0xfd, + 0x00, 0x79, 0x2c, 0x16, 0xfc, 0x00, 0x79, 0x2d, + 0x56, 0x57, 0x00, 0x79, 0x2e, 0x42, 0x75, 0x00, + 0x79, 0x30, 0x21, 0x82, 0x00, 0x79, 0x31, 0x3a, + 0x37, 0x00, 0x79, 0x34, 0x42, 0x76, 0x00, 0x79, + 0x35, 0x56, 0x58, 0x00, 0x79, 0x3a, 0x4a, 0xba, + 0x00, 0x79, 0x3b, 0x3a, 0x39, 0x00, 0x79, 0x3c, + 0x0f, 0xb1, 0x00, 0x79, 0x3d, 0x3a, 0x3a, 0x00, + 0x79, 0x3e, 0x08, 0xfe, 0x00, 0x79, 0x3f, 0x4c, + 0x9f, 0x00, 0x79, 0x40, 0x16, 0xfe, 0x00, 0x79, + 0x41, 0x07, 0x0d, 0x00, 0x79, 0x42, 0x4c, 0xa0, + 0x00, 0x79, 0x44, 0x56, 0x59, 0x00, 0x79, 0x45, + 0x3a, 0x3b, 0x00, 0x79, 0x46, 0x42, 0x77, 0x00, + 0x79, 0x47, 0x06, 0x5a, 0x00, 0x79, 0x48, 0x34, + 0x17, 0x00, 0x79, 0x49, 0x08, 0xb1, 0x00, 0x79, + 0x4a, 0x47, 0x39, 0x00, 0x79, 0x4b, 0x56, 0x5a, + 0x00, 0x79, 0x4f, 0x56, 0x5b, 0x00, 0x79, 0x50, + 0x34, 0x4f, 0x00, 0x79, 0x51, 0x56, 0x5c, 0x00, + 0x79, 0x53, 0x17, 0x04, 0x00, 0x79, 0x54, 0x4c, + 0xa1, 0x00, 0x79, 0x55, 0x17, 0x03, 0x00, 0x79, + 0x56, 0x0a, 0xc6, 0x00, 0x79, 0x57, 0x17, 0x00, + 0x00, 0x79, 0x58, 0x47, 0x3a, 0x00, 0x79, 0x5a, + 0x17, 0x02, 0x00, 0x79, 0x5b, 0x3a, 0x3c, 0x00, + 0x79, 0x5c, 0x3a, 0x3d, 0x00, 0x79, 0x5d, 0x34, + 0x27, 0x00, 0x79, 0x5e, 0x21, 0x84, 0x00, 0x79, + 0x5f, 0x17, 0x01, 0x00, 0x79, 0x60, 0x16, 0xff, + 0x00, 0x79, 0x62, 0x0c, 0xe0, 0x00, 0x79, 0x65, + 0x21, 0x85, 0x00, 0x79, 0x67, 0x47, 0x3c, 0x00, + 0x79, 0x68, 0x0d, 0xae, 0x00, 0x79, 0x69, 0x56, + 0x5d, 0x00, 0x79, 0x6b, 0x4c, 0xa2, 0x00, 0x79, + 0x6d, 0x08, 0x47, 0x00, 0x79, 0x72, 0x47, 0x3d, + 0x00, 0x79, 0x77, 0x0c, 0x72, 0x00, 0x79, 0x79, + 0x42, 0x78, 0x00, 0x79, 0x7a, 0x17, 0x05, 0x00, + 0x79, 0x7b, 0x56, 0x5e, 0x00, 0x79, 0x7c, 0x4c, + 0xa3, 0x00, 0x79, 0x7e, 0x56, 0x5f, 0x00, 0x79, + 0x7f, 0x17, 0x06, 0x00, 0x79, 0x80, 0x17, 0x1c, + 0x00, 0x79, 0x81, 0x06, 0xd0, 0x00, 0x79, 0x84, + 0x0f, 0xe3, 0x00, 0x79, 0x85, 0x0a, 0xb7, 0x00, + 0x79, 0x8a, 0x17, 0x07, 0x00, 0x79, 0x8b, 0x3a, + 0x3e, 0x00, 0x79, 0x8c, 0x56, 0x60, 0x00, 0x79, + 0x8d, 0x34, 0x0d, 0x00, 0x79, 0x8e, 0x0c, 0x13, + 0x00, 0x79, 0x8f, 0x0d, 0xf1, 0x00, 0x79, 0x91, + 0x56, 0x61, 0x00, 0x79, 0x93, 0x56, 0x62, 0x00, + 0x79, 0x94, 0x21, 0x86, 0x00, 0x79, 0x95, 0x47, + 0x3e, 0x00, 0x79, 0x96, 0x3a, 0x3f, 0x00, 0x79, + 0x98, 0x3a, 0x40, 0x00, 0x79, 0x9b, 0x21, 0x88, + 0x00, 0x79, 0x9c, 0x56, 0x63, 0x00, 0x79, 0x9d, + 0x17, 0x08, 0x00, 0x79, 0xa1, 0x47, 0x3f, 0x00, + 0x79, 0xa6, 0x06, 0x94, 0x00, 0x79, 0xa7, 0x17, + 0x09, 0x00, 0x79, 0xa8, 0x56, 0x64, 0x00, 0x79, + 0xa9, 0x47, 0x40, 0x00, 0x79, 0xaa, 0x17, 0x0b, + 0x00, 0x79, 0xab, 0x4c, 0xa4, 0x00, 0x79, 0xae, + 0x17, 0x0c, 0x00, 0x79, 0xaf, 0x56, 0x65, 0x00, + 0x79, 0xb0, 0x0c, 0xdf, 0x00, 0x79, 0xb1, 0x1e, + 0x4e, 0x00, 0x79, 0xb3, 0x17, 0x0d, 0x00, 0x79, + 0xb4, 0x47, 0x41, 0x00, 0x79, 0xb8, 0x3a, 0x41, + 0x00, 0x79, 0xb9, 0x17, 0x0e, 0x00, 0x79, 0xba, + 0x17, 0x0f, 0x00, 0x79, 0xbb, 0x3a, 0x42, 0x00, + 0x79, 0xbd, 0x06, 0xd1, 0x00, 0x79, 0xbe, 0x05, + 0x53, 0x00, 0x79, 0xbf, 0x0c, 0x9d, 0x00, 0x79, + 0xc0, 0x09, 0x32, 0x00, 0x79, 0xc1, 0x08, 0xb2, + 0x00, 0x79, 0xc2, 0x47, 0x42, 0x00, 0x79, 0xc4, + 0x4c, 0xa5, 0x00, 0x79, 0xc7, 0x47, 0x43, 0x00, + 0x79, 0xc8, 0x42, 0x79, 0x00, 0x79, 0xc9, 0x17, + 0x10, 0x00, 0x79, 0xca, 0x3a, 0x43, 0x00, 0x79, + 0xcb, 0x09, 0x33, 0x00, 0x79, 0xcc, 0x47, 0x44, + 0x00, 0x79, 0xcd, 0x47, 0x45, 0x00, 0x79, 0xcf, + 0x56, 0x66, 0x00, 0x79, 0xd1, 0x05, 0x4a, 0x00, + 0x79, 0xd2, 0x0d, 0xb5, 0x00, 0x79, 0xd4, 0x42, + 0x7b, 0x00, 0x79, 0xd5, 0x17, 0x11, 0x00, 0x79, + 0xd6, 0x47, 0x46, 0x00, 0x79, 0xd8, 0x0d, 0x7f, + 0x00, 0x79, 0xda, 0x3a, 0x44, 0x00, 0x79, 0xdd, + 0x56, 0x67, 0x00, 0x79, 0xde, 0x42, 0x7c, 0x00, + 0x79, 0xdf, 0x0a, 0xc7, 0x00, 0x79, 0xe0, 0x56, + 0x68, 0x00, 0x79, 0xe1, 0x17, 0x14, 0x00, 0x79, + 0xe2, 0x56, 0x69, 0x00, 0x79, 0xe3, 0x17, 0x15, + 0x00, 0x79, 0xe4, 0x0d, 0x1f, 0x00, 0x79, 0xe5, + 0x56, 0x6a, 0x00, 0x79, 0xe6, 0x0a, 0x07, 0x00, + 0x79, 0xe7, 0x17, 0x12, 0x00, 0x79, 0xe9, 0x0b, + 0x9f, 0x00, 0x79, 0xea, 0x4c, 0xa6, 0x00, 0x79, + 0xeb, 0x42, 0x7d, 0x00, 0x79, 0xec, 0x17, 0x13, + 0x00, 0x79, 0xed, 0x42, 0x7e, 0x00, 0x79, 0xf0, + 0x09, 0xb6, 0x00, 0x79, 0xf1, 0x56, 0x6b, 0x00, + 0x79, 0xf8, 0x56, 0x6c, 0x00, 0x79, 0xfb, 0x04, + 0xa0, 0x00, 0x79, 0xfc, 0x56, 0x6d, 0x00, 0x7a, + 0x00, 0x06, 0x43, 0x00, 0x7a, 0x02, 0x4c, 0xa7, + 0x00, 0x7a, 0x03, 0x3a, 0x45, 0x00, 0x7a, 0x05, + 0x36, 0x33, 0x00, 0x7a, 0x07, 0x56, 0x6e, 0x00, + 0x7a, 0x08, 0x17, 0x16, 0x00, 0x7a, 0x09, 0x3a, + 0x46, 0x00, 0x7a, 0x0a, 0x47, 0x4b, 0x00, 0x7a, + 0x0b, 0x0c, 0x14, 0x00, 0x7a, 0x0c, 0x4c, 0xa8, + 0x00, 0x7a, 0x0d, 0x17, 0x17, 0x00, 0x7a, 0x0e, + 0x0a, 0x6b, 0x00, 0x7a, 0x11, 0x3a, 0x47, 0x00, + 0x7a, 0x14, 0x0e, 0xb9, 0x00, 0x7a, 0x15, 0x47, + 0x4c, 0x00, 0x7a, 0x17, 0x0d, 0x95, 0x00, 0x7a, + 0x18, 0x17, 0x18, 0x00, 0x7a, 0x19, 0x17, 0x19, + 0x00, 0x7a, 0x1a, 0x0b, 0x93, 0x00, 0x7a, 0x1b, + 0x47, 0x4d, 0x00, 0x7a, 0x1c, 0x0f, 0x8f, 0x00, + 0x7a, 0x1e, 0x3a, 0x48, 0x00, 0x7a, 0x1f, 0x17, + 0x1b, 0x00, 0x7a, 0x20, 0x17, 0x1a, 0x00, 0x7a, + 0x21, 0x56, 0x6f, 0x00, 0x7a, 0x27, 0x56, 0x70, + 0x00, 0x7a, 0x2b, 0x56, 0x71, 0x00, 0x7a, 0x2d, + 0x3a, 0x49, 0x00, 0x7a, 0x2e, 0x09, 0x1b, 0x00, + 0x7a, 0x2f, 0x56, 0x72, 0x00, 0x7a, 0x30, 0x4c, + 0xa9, 0x00, 0x7a, 0x31, 0x17, 0x1d, 0x00, 0x7a, + 0x32, 0x04, 0xb4, 0x00, 0x7a, 0x34, 0x56, 0x73, + 0x00, 0x7a, 0x35, 0x56, 0x74, 0x00, 0x7a, 0x37, + 0x17, 0x20, 0x00, 0x7a, 0x38, 0x47, 0x4f, 0x00, + 0x7a, 0x39, 0x3a, 0x4a, 0x00, 0x7a, 0x3a, 0x4c, + 0xaa, 0x00, 0x7a, 0x3b, 0x17, 0x1e, 0x00, 0x7a, + 0x3c, 0x05, 0x54, 0x00, 0x7a, 0x3d, 0x07, 0x24, + 0x00, 0x7a, 0x3e, 0x17, 0x1f, 0x00, 0x7a, 0x3f, + 0x07, 0xd8, 0x00, 0x7a, 0x40, 0x34, 0x1f, 0x00, + 0x7a, 0x42, 0x0e, 0x36, 0x00, 0x7a, 0x43, 0x17, + 0x21, 0x00, 0x7a, 0x44, 0x4c, 0xab, 0x00, 0x7a, + 0x45, 0x3a, 0x4b, 0x00, 0x7a, 0x46, 0x0e, 0x82, + 0x00, 0x7a, 0x47, 0x47, 0x50, 0x00, 0x7a, 0x48, + 0x56, 0x75, 0x00, 0x7a, 0x49, 0x17, 0x23, 0x00, + 0x7a, 0x4c, 0x3a, 0x4c, 0x00, 0x7a, 0x4d, 0x0a, + 0x75, 0x00, 0x7a, 0x4e, 0x04, 0xf1, 0x00, 0x7a, + 0x4f, 0x05, 0x3a, 0x00, 0x7a, 0x50, 0x04, 0x70, + 0x00, 0x7a, 0x55, 0x56, 0x76, 0x00, 0x7a, 0x56, + 0x47, 0x51, 0x00, 0x7a, 0x57, 0x17, 0x22, 0x00, + 0x7a, 0x59, 0x47, 0x52, 0x00, 0x7a, 0x5c, 0x47, + 0x53, 0x00, 0x7a, 0x5d, 0x3a, 0x4d, 0x00, 0x7a, + 0x5f, 0x47, 0x54, 0x00, 0x7a, 0x60, 0x4f, 0x56, + 0x00, 0x7a, 0x61, 0x17, 0x24, 0x00, 0x7a, 0x62, + 0x17, 0x25, 0x00, 0x7a, 0x63, 0x09, 0xdf, 0x00, + 0x7a, 0x65, 0x56, 0x77, 0x00, 0x7a, 0x67, 0x47, + 0x55, 0x00, 0x7a, 0x69, 0x17, 0x26, 0x00, 0x7a, + 0x6a, 0x47, 0x56, 0x00, 0x7a, 0x6b, 0x05, 0xad, + 0x00, 0x7a, 0x6d, 0x3a, 0x4f, 0x00, 0x7a, 0x70, + 0x17, 0x28, 0x00, 0x7a, 0x74, 0x07, 0x40, 0x00, + 0x7a, 0x75, 0x47, 0x57, 0x00, 0x7a, 0x76, 0x06, + 0x80, 0x00, 0x7a, 0x78, 0x3a, 0x50, 0x00, 0x7a, + 0x79, 0x17, 0x29, 0x00, 0x7a, 0x7a, 0x06, 0xed, + 0x00, 0x7a, 0x7d, 0x17, 0x2a, 0x00, 0x7a, 0x7e, + 0x56, 0x78, 0x00, 0x7a, 0x7f, 0x0a, 0xa0, 0x00, + 0x7a, 0x80, 0x4c, 0xac, 0x00, 0x7a, 0x81, 0x0c, + 0xa5, 0x00, 0x7a, 0x82, 0x47, 0x58, 0x00, 0x7a, + 0x83, 0x0a, 0x84, 0x00, 0x7a, 0x84, 0x08, 0x65, + 0x00, 0x7a, 0x85, 0x42, 0x7f, 0x00, 0x7a, 0x86, + 0x4c, 0xad, 0x00, 0x7a, 0x88, 0x17, 0x2b, 0x00, + 0x7a, 0x8a, 0x47, 0x59, 0x00, 0x7a, 0x8b, 0x56, + 0x79, 0x00, 0x7a, 0x90, 0x47, 0x5a, 0x00, 0x7a, + 0x91, 0x56, 0x7a, 0x00, 0x7a, 0x92, 0x0b, 0xa0, + 0x00, 0x7a, 0x93, 0x0a, 0xed, 0x00, 0x7a, 0x94, + 0x4c, 0xae, 0x00, 0x7a, 0x95, 0x17, 0x2d, 0x00, + 0x7a, 0x96, 0x17, 0x2f, 0x00, 0x7a, 0x97, 0x17, + 0x2c, 0x00, 0x7a, 0x98, 0x17, 0x2e, 0x00, 0x7a, + 0x9e, 0x56, 0x7b, 0x00, 0x7a, 0x9f, 0x06, 0xf8, + 0x00, 0x7a, 0xa0, 0x3a, 0x51, 0x00, 0x7a, 0xa3, + 0x3a, 0x52, 0x00, 0x7a, 0xa9, 0x17, 0x30, 0x00, + 0x7a, 0xaa, 0x06, 0xfc, 0x00, 0x7a, 0xac, 0x47, + 0x5b, 0x00, 0x7a, 0xae, 0x06, 0x81, 0x00, 0x7a, + 0xaf, 0x0f, 0x3c, 0x00, 0x7a, 0xb0, 0x17, 0x32, + 0x00, 0x7a, 0xb3, 0x3a, 0x53, 0x00, 0x7a, 0xb5, + 0x4c, 0xaf, 0x00, 0x7a, 0xb6, 0x17, 0x33, 0x00, + 0x7a, 0xb9, 0x47, 0x5e, 0x00, 0x7a, 0xba, 0x04, + 0xd0, 0x00, 0x7a, 0xbb, 0x3a, 0x54, 0x00, 0x7a, + 0xbc, 0x3a, 0x55, 0x00, 0x7a, 0xbd, 0x4c, 0xb0, + 0x00, 0x7a, 0xbe, 0x47, 0x5f, 0x00, 0x7a, 0xbf, + 0x17, 0x36, 0x00, 0x7a, 0xc3, 0x05, 0xd4, 0x00, + 0x7a, 0xc4, 0x17, 0x35, 0x00, 0x7a, 0xc5, 0x17, + 0x34, 0x00, 0x7a, 0xc6, 0x3a, 0x56, 0x00, 0x7a, + 0xc7, 0x17, 0x38, 0x00, 0x7a, 0xc8, 0x17, 0x31, + 0x00, 0x7a, 0xc9, 0x56, 0x7c, 0x00, 0x7a, 0xca, + 0x17, 0x39, 0x00, 0x7a, 0xcb, 0x0f, 0x71, 0x00, + 0x7a, 0xcc, 0x47, 0x61, 0x00, 0x7a, 0xcd, 0x17, + 0x3a, 0x00, 0x7a, 0xce, 0x42, 0x81, 0x00, 0x7a, + 0xcf, 0x17, 0x3b, 0x00, 0x7a, 0xd1, 0x21, 0x89, + 0x00, 0x7a, 0xd2, 0x11, 0xc5, 0x00, 0x7a, 0xd3, + 0x17, 0x3d, 0x00, 0x7a, 0xd5, 0x17, 0x3c, 0x00, + 0x7a, 0xd9, 0x17, 0x3e, 0x00, 0x7a, 0xda, 0x17, + 0x3f, 0x00, 0x7a, 0xdb, 0x56, 0x7d, 0x00, 0x7a, + 0xdc, 0x0f, 0x7d, 0x00, 0x7a, 0xdd, 0x17, 0x40, + 0x00, 0x7a, 0xdf, 0x1c, 0x08, 0x00, 0x7a, 0xe0, + 0x09, 0xb7, 0x00, 0x7a, 0xe1, 0x17, 0x41, 0x00, + 0x7a, 0xe2, 0x17, 0x42, 0x00, 0x7a, 0xe3, 0x09, + 0x61, 0x00, 0x7a, 0xe5, 0x0c, 0x90, 0x00, 0x7a, + 0xe6, 0x17, 0x43, 0x00, 0x7a, 0xe7, 0x21, 0x8a, + 0x00, 0x7a, 0xe8, 0x47, 0x62, 0x00, 0x7a, 0xe9, + 0x56, 0x7e, 0x00, 0x7a, 0xea, 0x0b, 0x66, 0x00, + 0x7a, 0xeb, 0x21, 0x8c, 0x00, 0x7a, 0xec, 0x56, + 0x7f, 0x00, 0x7a, 0xed, 0x17, 0x44, 0x00, 0x7a, + 0xef, 0x0b, 0x7a, 0x00, 0x7a, 0xf0, 0x17, 0x45, + 0x00, 0x7a, 0xf1, 0x56, 0x80, 0x00, 0x7a, 0xf4, + 0x47, 0x63, 0x00, 0x7a, 0xf6, 0x06, 0x9d, 0x00, + 0x7a, 0xf8, 0x10, 0x76, 0x00, 0x7a, 0xf9, 0x0b, + 0x9b, 0x00, 0x7a, 0xfa, 0x08, 0xdf, 0x00, 0x7a, + 0xfb, 0x56, 0x81, 0x00, 0x7a, 0xfd, 0x42, 0x82, + 0x00, 0x7a, 0xfe, 0x4c, 0xb1, 0x00, 0x7a, 0xff, + 0x06, 0x04, 0x00, 0x7b, 0x02, 0x17, 0x46, 0x00, + 0x7b, 0x04, 0x17, 0x53, 0x00, 0x7b, 0x06, 0x17, + 0x49, 0x00, 0x7b, 0x07, 0x3a, 0x57, 0x00, 0x7b, + 0x08, 0x06, 0x82, 0x00, 0x7b, 0x0a, 0x17, 0x48, + 0x00, 0x7b, 0x0b, 0x17, 0x55, 0x00, 0x7b, 0x0f, + 0x17, 0x47, 0x00, 0x7b, 0x11, 0x09, 0xb8, 0x00, + 0x7b, 0x12, 0x42, 0x83, 0x00, 0x7b, 0x14, 0x3a, + 0x58, 0x00, 0x7b, 0x18, 0x17, 0x4b, 0x00, 0x7b, + 0x19, 0x17, 0x4c, 0x00, 0x7b, 0x1b, 0x0c, 0x25, + 0x00, 0x7b, 0x1e, 0x17, 0x4d, 0x00, 0x7b, 0x1f, + 0x56, 0x82, 0x00, 0x7b, 0x20, 0x05, 0xbc, 0x00, + 0x7b, 0x23, 0x56, 0x83, 0x00, 0x7b, 0x25, 0x0a, + 0x20, 0x00, 0x7b, 0x26, 0x0d, 0xd6, 0x00, 0x7b, + 0x27, 0x3a, 0x59, 0x00, 0x7b, 0x28, 0x17, 0x4f, + 0x00, 0x7b, 0x29, 0x56, 0x84, 0x00, 0x7b, 0x2a, + 0x47, 0x68, 0x00, 0x7b, 0x2b, 0x4c, 0xb2, 0x00, + 0x7b, 0x2c, 0x0b, 0x48, 0x00, 0x7b, 0x2d, 0x42, + 0x84, 0x00, 0x7b, 0x2e, 0x47, 0x69, 0x00, 0x7b, + 0x2f, 0x47, 0x6a, 0x00, 0x7b, 0x30, 0x56, 0x85, + 0x00, 0x7b, 0x31, 0x3a, 0x5a, 0x00, 0x7b, 0x33, + 0x17, 0x4a, 0x00, 0x7b, 0x34, 0x56, 0x86, 0x00, + 0x7b, 0x35, 0x17, 0x4e, 0x00, 0x7b, 0x36, 0x17, + 0x50, 0x00, 0x7b, 0x39, 0x08, 0x6b, 0x00, 0x7b, + 0x3b, 0x42, 0x85, 0x00, 0x7b, 0x3d, 0x47, 0x67, + 0x00, 0x7b, 0x3f, 0x56, 0x87, 0x00, 0x7b, 0x40, + 0x56, 0x88, 0x00, 0x7b, 0x41, 0x47, 0x6e, 0x00, + 0x7b, 0x45, 0x17, 0x57, 0x00, 0x7b, 0x46, 0x0d, + 0xa0, 0x00, 0x7b, 0x47, 0x3a, 0x5b, 0x00, 0x7b, + 0x48, 0x0d, 0x3a, 0x00, 0x7b, 0x49, 0x0c, 0x73, + 0x00, 0x7b, 0x4b, 0x06, 0xd2, 0x00, 0x7b, 0x4c, + 0x17, 0x56, 0x00, 0x7b, 0x4d, 0x17, 0x54, 0x00, + 0x7b, 0x4e, 0x3a, 0x5c, 0x00, 0x7b, 0x4f, 0x0d, + 0x49, 0x00, 0x7b, 0x50, 0x17, 0x51, 0x00, 0x7b, + 0x51, 0x0b, 0x9c, 0x00, 0x7b, 0x52, 0x0c, 0x75, + 0x00, 0x7b, 0x53, 0x37, 0x5d, 0x00, 0x7b, 0x54, + 0x0c, 0x74, 0x00, 0x7b, 0x55, 0x47, 0x70, 0x00, + 0x7b, 0x56, 0x08, 0x66, 0x00, 0x7b, 0x5d, 0x17, + 0x69, 0x00, 0x7b, 0x60, 0x3a, 0x5d, 0x00, 0x7b, + 0x64, 0x47, 0x72, 0x00, 0x7b, 0x65, 0x17, 0x59, + 0x00, 0x7b, 0x66, 0x47, 0x73, 0x00, 0x7b, 0x67, + 0x17, 0x5b, 0x00, 0x7b, 0x69, 0x3a, 0x5e, 0x00, + 0x7b, 0x6a, 0x56, 0x89, 0x00, 0x7b, 0x6c, 0x17, + 0x5e, 0x00, 0x7b, 0x6d, 0x3a, 0x5f, 0x00, 0x7b, + 0x6e, 0x17, 0x5f, 0x00, 0x7b, 0x6f, 0x42, 0x86, + 0x00, 0x7b, 0x70, 0x17, 0x5c, 0x00, 0x7b, 0x71, + 0x17, 0x5d, 0x00, 0x7b, 0x72, 0x3a, 0x60, 0x00, + 0x7b, 0x73, 0x47, 0x74, 0x00, 0x7b, 0x74, 0x17, + 0x5a, 0x00, 0x7b, 0x75, 0x17, 0x58, 0x00, 0x7b, + 0x77, 0x4c, 0xb3, 0x00, 0x7b, 0x79, 0x47, 0x71, + 0x00, 0x7b, 0x7a, 0x17, 0x52, 0x00, 0x7b, 0x7f, + 0x47, 0x6d, 0x00, 0x7b, 0x84, 0x56, 0x8a, 0x00, + 0x7b, 0x86, 0x0e, 0x1f, 0x00, 0x7b, 0x87, 0x05, + 0x55, 0x00, 0x7b, 0x89, 0x56, 0x8b, 0x00, 0x7b, + 0x8b, 0x17, 0x66, 0x00, 0x7b, 0x8d, 0x17, 0x63, + 0x00, 0x7b, 0x8e, 0x56, 0x8c, 0x00, 0x7b, 0x8f, + 0x17, 0x68, 0x00, 0x7b, 0x90, 0x47, 0x77, 0x00, + 0x7b, 0x91, 0x3a, 0x61, 0x00, 0x7b, 0x92, 0x17, + 0x67, 0x00, 0x7b, 0x94, 0x0d, 0x29, 0x00, 0x7b, + 0x95, 0x0e, 0xb3, 0x00, 0x7b, 0x96, 0x56, 0x8d, + 0x00, 0x7b, 0x97, 0x08, 0x89, 0x00, 0x7b, 0x98, + 0x17, 0x61, 0x00, 0x7b, 0x99, 0x17, 0x6a, 0x00, + 0x7b, 0x9a, 0x17, 0x65, 0x00, 0x7b, 0x9b, 0x47, + 0x78, 0x00, 0x7b, 0x9c, 0x17, 0x64, 0x00, 0x7b, + 0x9d, 0x17, 0x60, 0x00, 0x7b, 0x9e, 0x21, 0x8d, + 0x00, 0x7b, 0x9f, 0x17, 0x62, 0x00, 0x7b, 0xa0, + 0x4c, 0xb4, 0x00, 0x7b, 0xa1, 0x06, 0x05, 0x00, + 0x7b, 0xa5, 0x56, 0x8e, 0x00, 0x7b, 0xaa, 0x0b, + 0x7b, 0x00, 0x7b, 0xac, 0x4c, 0xb5, 0x00, 0x7b, + 0xad, 0x0a, 0xa1, 0x00, 0x7b, 0xaf, 0x3a, 0x62, + 0x00, 0x7b, 0xb0, 0x4c, 0xb6, 0x00, 0x7b, 0xb1, + 0x0d, 0x36, 0x00, 0x7b, 0xb2, 0x56, 0x8f, 0x00, + 0x7b, 0xb4, 0x17, 0x6f, 0x00, 0x7b, 0xb5, 0x47, + 0x7a, 0x00, 0x7b, 0xb6, 0x56, 0x90, 0x00, 0x7b, + 0xb8, 0x0d, 0x38, 0x00, 0x7b, 0xba, 0x56, 0x91, + 0x00, 0x7b, 0xbb, 0x56, 0x92, 0x00, 0x7b, 0xbc, + 0x47, 0x7b, 0x00, 0x7b, 0xbd, 0x56, 0x93, 0x00, + 0x7b, 0xc0, 0x0a, 0x85, 0x00, 0x7b, 0xc1, 0x17, + 0x6c, 0x00, 0x7b, 0xc2, 0x56, 0x94, 0x00, 0x7b, + 0xc4, 0x0d, 0x63, 0x00, 0x7b, 0xc5, 0x47, 0x7c, + 0x00, 0x7b, 0xc6, 0x17, 0x70, 0x00, 0x7b, 0xc7, + 0x0e, 0x23, 0x00, 0x7b, 0xc8, 0x56, 0x95, 0x00, + 0x7b, 0xc9, 0x0b, 0x99, 0x00, 0x7b, 0xca, 0x47, + 0x7d, 0x00, 0x7b, 0xcb, 0x17, 0x6b, 0x00, 0x7b, + 0xcc, 0x17, 0x6d, 0x00, 0x7b, 0xcf, 0x17, 0x6e, + 0x00, 0x7b, 0xd4, 0x47, 0x80, 0x00, 0x7b, 0xd6, + 0x47, 0x81, 0x00, 0x7b, 0xd7, 0x3a, 0x63, 0x00, + 0x7b, 0xd9, 0x3a, 0x64, 0x00, 0x7b, 0xda, 0x47, + 0x82, 0x00, 0x7b, 0xdb, 0x56, 0x96, 0x00, 0x7b, + 0xdd, 0x17, 0x71, 0x00, 0x7b, 0xe0, 0x08, 0xf0, + 0x00, 0x7b, 0xe4, 0x0c, 0x9e, 0x00, 0x7b, 0xe5, + 0x17, 0x76, 0x00, 0x7b, 0xe6, 0x17, 0x75, 0x00, + 0x7b, 0xe8, 0x4c, 0xb7, 0x00, 0x7b, 0xe9, 0x17, + 0x72, 0x00, 0x7b, 0xea, 0x47, 0x83, 0x00, 0x7b, + 0xed, 0x0f, 0xdc, 0x00, 0x7b, 0xf0, 0x47, 0x84, + 0x00, 0x7b, 0xf2, 0x4c, 0xb8, 0x00, 0x7b, 0xf3, + 0x17, 0x7b, 0x00, 0x7b, 0xf4, 0x56, 0x97, 0x00, + 0x7b, 0xf5, 0x56, 0x98, 0x00, 0x7b, 0xf6, 0x17, + 0x7f, 0x00, 0x7b, 0xf7, 0x17, 0x7c, 0x00, 0x7b, + 0xf8, 0x4c, 0xb9, 0x00, 0x7b, 0xf9, 0x56, 0x99, + 0x00, 0x7b, 0xfa, 0x56, 0x9a, 0x00, 0x7b, 0xfc, + 0x4c, 0xba, 0x00, 0x7b, 0xfe, 0x4c, 0xbb, 0x00, + 0x7c, 0x00, 0x17, 0x78, 0x00, 0x7c, 0x01, 0x42, + 0x87, 0x00, 0x7c, 0x02, 0x56, 0x9b, 0x00, 0x7c, + 0x03, 0x47, 0x85, 0x00, 0x7c, 0x04, 0x56, 0x9c, + 0x00, 0x7c, 0x06, 0x56, 0x9d, 0x00, 0x7c, 0x07, + 0x17, 0x79, 0x00, 0x7c, 0x09, 0x4c, 0xbc, 0x00, + 0x7c, 0x0b, 0x3a, 0x65, 0x00, 0x7c, 0x0c, 0x56, + 0x9e, 0x00, 0x7c, 0x0d, 0x17, 0x7e, 0x00, 0x7c, + 0x0e, 0x47, 0x86, 0x00, 0x7c, 0x0f, 0x3a, 0x66, + 0x00, 0x7c, 0x11, 0x17, 0x73, 0x00, 0x7c, 0x12, + 0x10, 0xea, 0x00, 0x7c, 0x13, 0x17, 0x7a, 0x00, + 0x7c, 0x14, 0x17, 0x74, 0x00, 0x7c, 0x17, 0x17, + 0x7d, 0x00, 0x7c, 0x19, 0x56, 0x9f, 0x00, 0x7c, + 0x1b, 0x56, 0xa0, 0x00, 0x7c, 0x1e, 0x1e, 0x3b, + 0x00, 0x7c, 0x1f, 0x17, 0x83, 0x00, 0x7c, 0x20, + 0x3a, 0x67, 0x00, 0x7c, 0x21, 0x06, 0x06, 0x00, + 0x7c, 0x23, 0x17, 0x80, 0x00, 0x7c, 0x25, 0x56, + 0xa1, 0x00, 0x7c, 0x26, 0x3a, 0x68, 0x00, 0x7c, + 0x27, 0x17, 0x81, 0x00, 0x7c, 0x28, 0x4c, 0xbd, + 0x00, 0x7c, 0x2a, 0x17, 0x82, 0x00, 0x7c, 0x2b, + 0x17, 0x85, 0x00, 0x7c, 0x2c, 0x56, 0xa2, 0x00, + 0x7c, 0x2f, 0x4c, 0xbe, 0x00, 0x7c, 0x31, 0x3a, + 0x69, 0x00, 0x7c, 0x33, 0x42, 0x88, 0x00, 0x7c, + 0x34, 0x56, 0xa3, 0x00, 0x7c, 0x36, 0x3a, 0x6a, + 0x00, 0x7c, 0x37, 0x17, 0x84, 0x00, 0x7c, 0x38, + 0x0d, 0x8a, 0x00, 0x7c, 0x39, 0x56, 0xa4, 0x00, + 0x7c, 0x3a, 0x56, 0xa5, 0x00, 0x7c, 0x3d, 0x17, + 0x86, 0x00, 0x7c, 0x3e, 0x0f, 0xc4, 0x00, 0x7c, + 0x3f, 0x0e, 0x3d, 0x00, 0x7c, 0x40, 0x17, 0x8b, + 0x00, 0x7c, 0x42, 0x4c, 0xbf, 0x00, 0x7c, 0x43, + 0x17, 0x88, 0x00, 0x7c, 0x45, 0x47, 0x87, 0x00, + 0x7c, 0x46, 0x56, 0xa6, 0x00, 0x7c, 0x4a, 0x47, + 0x88, 0x00, 0x7c, 0x4c, 0x17, 0x87, 0x00, 0x7c, + 0x4d, 0x0a, 0x76, 0x00, 0x7c, 0x4f, 0x17, 0x8a, + 0x00, 0x7c, 0x50, 0x17, 0x8c, 0x00, 0x7c, 0x51, + 0x3a, 0x6b, 0x00, 0x7c, 0x52, 0x4c, 0xc0, 0x00, + 0x7c, 0x53, 0x4c, 0xc1, 0x00, 0x7c, 0x54, 0x17, + 0x89, 0x00, 0x7c, 0x55, 0x56, 0xa7, 0x00, 0x7c, + 0x56, 0x17, 0x90, 0x00, 0x7c, 0x57, 0x47, 0x89, + 0x00, 0x7c, 0x58, 0x17, 0x8d, 0x00, 0x7c, 0x59, + 0x3a, 0x6c, 0x00, 0x7c, 0x5a, 0x56, 0xa8, 0x00, + 0x7c, 0x5b, 0x4c, 0xc2, 0x00, 0x7c, 0x5c, 0x4c, + 0xc3, 0x00, 0x7c, 0x5d, 0x4c, 0xc4, 0x00, 0x7c, + 0x5e, 0x47, 0x8a, 0x00, 0x7c, 0x5f, 0x17, 0x8e, + 0x00, 0x7c, 0x60, 0x17, 0x77, 0x00, 0x7c, 0x61, + 0x47, 0x8b, 0x00, 0x7c, 0x63, 0x56, 0xa9, 0x00, + 0x7c, 0x64, 0x17, 0x8f, 0x00, 0x7c, 0x65, 0x17, + 0x91, 0x00, 0x7c, 0x67, 0x3a, 0x6d, 0x00, 0x7c, + 0x69, 0x47, 0x8c, 0x00, 0x7c, 0x6c, 0x17, 0x92, + 0x00, 0x7c, 0x6d, 0x42, 0x8a, 0x00, 0x7c, 0x6e, + 0x3a, 0x6e, 0x00, 0x7c, 0x6f, 0x47, 0x8d, 0x00, + 0x7c, 0x70, 0x3a, 0x6f, 0x00, 0x7c, 0x72, 0x4c, + 0xc5, 0x00, 0x7c, 0x73, 0x0e, 0x16, 0x00, 0x7c, + 0x75, 0x17, 0x93, 0x00, 0x7c, 0x79, 0x42, 0x8b, + 0x00, 0x7c, 0x7b, 0x37, 0x0e, 0x00, 0x7c, 0x7c, + 0x56, 0xab, 0x00, 0x7c, 0x7d, 0x4c, 0xc6, 0x00, + 0x7c, 0x7e, 0x0e, 0xee, 0x00, 0x7c, 0x81, 0x06, + 0xc6, 0x00, 0x7c, 0x82, 0x06, 0xff, 0x00, 0x7c, + 0x83, 0x17, 0x94, 0x00, 0x7c, 0x86, 0x56, 0xac, + 0x00, 0x7c, 0x87, 0x4c, 0xc7, 0x00, 0x7c, 0x89, + 0x0e, 0x04, 0x00, 0x7c, 0x8b, 0x0a, 0x2e, 0x00, + 0x7c, 0x8d, 0x0e, 0xbc, 0x00, 0x7c, 0x8f, 0x42, + 0x8c, 0x00, 0x7c, 0x90, 0x17, 0x95, 0x00, 0x7c, + 0x92, 0x0f, 0x7b, 0x00, 0x7c, 0x94, 0x42, 0x8d, + 0x00, 0x7c, 0x95, 0x0d, 0x2a, 0x00, 0x7c, 0x97, + 0x0a, 0xc8, 0x00, 0x7c, 0x98, 0x0c, 0xea, 0x00, + 0x7c, 0x9b, 0x09, 0x57, 0x00, 0x7c, 0x9e, 0x4c, + 0xc8, 0x00, 0x7c, 0x9f, 0x04, 0x84, 0x00, 0x7c, + 0xa0, 0x42, 0x8e, 0x00, 0x7c, 0xa1, 0x17, 0x9a, + 0x00, 0x7c, 0xa2, 0x17, 0x98, 0x00, 0x7c, 0xa4, + 0x17, 0x96, 0x00, 0x7c, 0xa5, 0x05, 0xdd, 0x00, + 0x7c, 0xa6, 0x47, 0x91, 0x00, 0x7c, 0xa7, 0x09, + 0xb9, 0x00, 0x7c, 0xa8, 0x17, 0x9b, 0x00, 0x7c, + 0xab, 0x17, 0x99, 0x00, 0x7c, 0xad, 0x17, 0x97, + 0x00, 0x7c, 0xae, 0x17, 0x9f, 0x00, 0x7c, 0xb0, + 0x56, 0xad, 0x00, 0x7c, 0xb1, 0x17, 0x9e, 0x00, + 0x7c, 0xb2, 0x17, 0x9d, 0x00, 0x7c, 0xb3, 0x17, + 0x9c, 0x00, 0x7c, 0xb6, 0x47, 0x93, 0x00, 0x7c, + 0xb7, 0x47, 0x94, 0x00, 0x7c, 0xb9, 0x17, 0xa0, + 0x00, 0x7c, 0xba, 0x4c, 0xc9, 0x00, 0x7c, 0xbb, + 0x56, 0xae, 0x00, 0x7c, 0xbc, 0x3a, 0x70, 0x00, + 0x7c, 0xbd, 0x17, 0xa1, 0x00, 0x7c, 0xbe, 0x21, + 0x8e, 0x00, 0x7c, 0xbf, 0x3a, 0x71, 0x00, 0x7c, + 0xc0, 0x17, 0xa2, 0x00, 0x7c, 0xc2, 0x17, 0xa4, + 0x00, 0x7c, 0xc4, 0x47, 0x96, 0x00, 0x7c, 0xc5, + 0x17, 0xa3, 0x00, 0x7c, 0xc7, 0x4c, 0xca, 0x00, + 0x7c, 0xc8, 0x3a, 0x72, 0x00, 0x7c, 0xc9, 0x3a, + 0x73, 0x00, 0x7c, 0xca, 0x07, 0x86, 0x00, 0x7c, + 0xcd, 0x47, 0x98, 0x00, 0x7c, 0xce, 0x0a, 0xba, + 0x00, 0x7c, 0xcf, 0x56, 0xaf, 0x00, 0x7c, 0xd2, + 0x17, 0xa6, 0x00, 0x7c, 0xd3, 0x4c, 0xcb, 0x00, + 0x7c, 0xd4, 0x56, 0xb0, 0x00, 0x7c, 0xd5, 0x42, + 0x8f, 0x00, 0x7c, 0xd6, 0x36, 0x84, 0x00, 0x7c, + 0xd7, 0x3a, 0x74, 0x00, 0x7c, 0xd8, 0x17, 0xa5, + 0x00, 0x7c, 0xd9, 0x3a, 0x75, 0x00, 0x7c, 0xda, + 0x4c, 0xcc, 0x00, 0x7c, 0xdc, 0x17, 0xa7, 0x00, + 0x7c, 0xdd, 0x3a, 0x76, 0x00, 0x7c, 0xde, 0x0e, + 0x05, 0x00, 0x7c, 0xdf, 0x0a, 0xee, 0x00, 0x7c, + 0xe0, 0x07, 0xd9, 0x00, 0x7c, 0xe2, 0x17, 0xa8, + 0x00, 0x7c, 0xe6, 0x47, 0x9b, 0x00, 0x7c, 0xe7, + 0x0f, 0x90, 0x00, 0x7c, 0xe9, 0x56, 0xb1, 0x00, + 0x7c, 0xeb, 0x3a, 0x77, 0x00, 0x7c, 0xef, 0x17, + 0xaa, 0x00, 0x7c, 0xf2, 0x17, 0xab, 0x00, 0x7c, + 0xf4, 0x17, 0xac, 0x00, 0x7c, 0xf5, 0x47, 0x9d, + 0x00, 0x7c, 0xf6, 0x17, 0xad, 0x00, 0x7c, 0xf8, + 0x08, 0xb3, 0x00, 0x7c, 0xfa, 0x17, 0xae, 0x00, + 0x7c, 0xfb, 0x07, 0x25, 0x00, 0x7c, 0xfe, 0x06, + 0x84, 0x00, 0x7d, 0x00, 0x06, 0x44, 0x00, 0x7d, + 0x02, 0x17, 0xb0, 0x00, 0x7d, 0x03, 0x47, 0x9e, + 0x00, 0x7d, 0x04, 0x0e, 0xff, 0x00, 0x7d, 0x05, + 0x07, 0xda, 0x00, 0x7d, 0x06, 0x17, 0xaf, 0x00, + 0x7d, 0x07, 0x3a, 0x78, 0x00, 0x7d, 0x08, 0x3a, + 0x79, 0x00, 0x7d, 0x09, 0x3a, 0x7a, 0x00, 0x7d, + 0x0a, 0x17, 0xb3, 0x00, 0x7d, 0x0b, 0x0e, 0xf2, + 0x00, 0x7d, 0x0d, 0x0c, 0xf2, 0x00, 0x7d, 0x0f, + 0x56, 0xb2, 0x00, 0x7d, 0x10, 0x0d, 0xa5, 0x00, + 0x7d, 0x11, 0x56, 0xb3, 0x00, 0x7d, 0x12, 0x47, + 0xa0, 0x00, 0x7d, 0x13, 0x3a, 0x7b, 0x00, 0x7d, + 0x14, 0x09, 0x6d, 0x00, 0x7d, 0x15, 0x17, 0xb2, + 0x00, 0x7d, 0x16, 0x56, 0xb4, 0x00, 0x7d, 0x17, + 0x08, 0xff, 0x00, 0x7d, 0x18, 0x07, 0xdb, 0x00, + 0x7d, 0x19, 0x08, 0xb4, 0x00, 0x7d, 0x1a, 0x06, + 0x83, 0x00, 0x7d, 0x1b, 0x0e, 0x06, 0x00, 0x7d, + 0x1c, 0x17, 0xb1, 0x00, 0x7d, 0x1d, 0x3a, 0x7c, + 0x00, 0x7d, 0x1e, 0x47, 0xa1, 0x00, 0x7d, 0x20, + 0x0a, 0xc9, 0x00, 0x7d, 0x21, 0x0e, 0x70, 0x00, + 0x7d, 0x22, 0x08, 0x67, 0x00, 0x7d, 0x23, 0x3a, + 0x7d, 0x00, 0x7d, 0x26, 0x56, 0xb5, 0x00, 0x7d, + 0x2a, 0x56, 0xb6, 0x00, 0x7d, 0x2b, 0x08, 0xb5, + 0x00, 0x7d, 0x2c, 0x0b, 0xf9, 0x00, 0x7d, 0x2d, + 0x56, 0xb7, 0x00, 0x7d, 0x2e, 0x17, 0xb6, 0x00, + 0x7d, 0x2f, 0x0f, 0xa7, 0x00, 0x7d, 0x30, 0x08, + 0x49, 0x00, 0x7d, 0x31, 0x42, 0x90, 0x00, 0x7d, + 0x32, 0x17, 0xb7, 0x00, 0x7d, 0x33, 0x0a, 0x08, + 0x00, 0x7d, 0x35, 0x17, 0xb9, 0x00, 0x7d, 0x39, + 0x09, 0xba, 0x00, 0x7d, 0x3a, 0x08, 0x20, 0x00, + 0x7d, 0x3c, 0x4c, 0xcd, 0x00, 0x7d, 0x3d, 0x47, + 0xa4, 0x00, 0x7d, 0x3e, 0x47, 0xa5, 0x00, 0x7d, + 0x3f, 0x17, 0xb8, 0x00, 0x7d, 0x40, 0x47, 0xa6, + 0x00, 0x7d, 0x41, 0x3a, 0x7e, 0x00, 0x7d, 0x42, + 0x09, 0x34, 0x00, 0x7d, 0x43, 0x07, 0x72, 0x00, + 0x7d, 0x44, 0x0a, 0xca, 0x00, 0x7d, 0x45, 0x17, + 0xb4, 0x00, 0x7d, 0x46, 0x17, 0xba, 0x00, 0x7d, + 0x47, 0x47, 0xa7, 0x00, 0x7d, 0x48, 0x21, 0x8f, + 0x00, 0x7d, 0x4b, 0x17, 0xb5, 0x00, 0x7d, 0x4c, + 0x07, 0x26, 0x00, 0x7d, 0x4d, 0x4c, 0xce, 0x00, + 0x7d, 0x4e, 0x17, 0xbd, 0x00, 0x7d, 0x4f, 0x17, + 0xc1, 0x00, 0x7d, 0x50, 0x07, 0x41, 0x00, 0x7d, + 0x51, 0x56, 0xb8, 0x00, 0x7d, 0x53, 0x3a, 0x7f, + 0x00, 0x7d, 0x55, 0x36, 0x3a, 0x00, 0x7d, 0x56, + 0x17, 0xbc, 0x00, 0x7d, 0x57, 0x56, 0xb9, 0x00, + 0x7d, 0x59, 0x3a, 0x80, 0x00, 0x7d, 0x5a, 0x47, + 0xab, 0x00, 0x7d, 0x5b, 0x17, 0xc5, 0x00, 0x7d, + 0x5c, 0x42, 0x91, 0x00, 0x7d, 0x5d, 0x3a, 0x81, + 0x00, 0x7d, 0x5e, 0x07, 0xdc, 0x00, 0x7d, 0x61, + 0x0f, 0x57, 0x00, 0x7d, 0x62, 0x04, 0x80, 0x00, + 0x7d, 0x63, 0x17, 0xc2, 0x00, 0x7d, 0x65, 0x56, + 0xba, 0x00, 0x7d, 0x66, 0x06, 0x85, 0x00, 0x7d, + 0x67, 0x56, 0xbb, 0x00, 0x7d, 0x68, 0x17, 0xbf, + 0x00, 0x7d, 0x6a, 0x47, 0xac, 0x00, 0x7d, 0x6e, + 0x17, 0xc0, 0x00, 0x7d, 0x70, 0x47, 0xad, 0x00, + 0x7d, 0x71, 0x0c, 0x77, 0x00, 0x7d, 0x72, 0x17, + 0xbe, 0x00, 0x7d, 0x73, 0x17, 0xbb, 0x00, 0x7d, + 0x75, 0x05, 0x86, 0x00, 0x7d, 0x76, 0x0a, 0x88, + 0x00, 0x7d, 0x78, 0x56, 0xbc, 0x00, 0x7d, 0x79, + 0x07, 0x5c, 0x00, 0x7d, 0x7a, 0x3a, 0x82, 0x00, + 0x7d, 0x7b, 0x56, 0xbd, 0x00, 0x7d, 0x7d, 0x17, + 0xc7, 0x00, 0x7d, 0x7f, 0x47, 0xaf, 0x00, 0x7d, + 0x81, 0x56, 0xbe, 0x00, 0x7d, 0x82, 0x4c, 0xcf, + 0x00, 0x7d, 0x83, 0x42, 0x92, 0x00, 0x7d, 0x85, + 0x4c, 0xd0, 0x00, 0x7d, 0x86, 0x3a, 0x83, 0x00, + 0x7d, 0x88, 0x47, 0xb1, 0x00, 0x7d, 0x89, 0x17, + 0xc4, 0x00, 0x7d, 0x8b, 0x3a, 0x84, 0x00, 0x7d, + 0x8c, 0x3a, 0x85, 0x00, 0x7d, 0x8d, 0x4c, 0xd1, + 0x00, 0x7d, 0x8f, 0x17, 0xc6, 0x00, 0x7d, 0x91, + 0x4c, 0xd2, 0x00, 0x7d, 0x93, 0x17, 0xc3, 0x00, + 0x7d, 0x96, 0x56, 0xbf, 0x00, 0x7d, 0x97, 0x47, + 0xb2, 0x00, 0x7d, 0x99, 0x07, 0x27, 0x00, 0x7d, + 0x9a, 0x0b, 0x13, 0x00, 0x7d, 0x9b, 0x17, 0xc8, + 0x00, 0x7d, 0x9c, 0x0a, 0xf0, 0x00, 0x7d, 0x9d, + 0x47, 0xb4, 0x00, 0x7d, 0x9e, 0x4c, 0xd3, 0x00, + 0x7d, 0x9f, 0x17, 0xd5, 0x00, 0x7d, 0xa0, 0x21, + 0x92, 0x00, 0x7d, 0xa2, 0x17, 0xd1, 0x00, 0x7d, + 0xa3, 0x17, 0xcb, 0x00, 0x7d, 0xa6, 0x42, 0x93, + 0x00, 0x7d, 0xa7, 0x47, 0xb5, 0x00, 0x7d, 0xaa, + 0x47, 0xb6, 0x00, 0x7d, 0xab, 0x17, 0xcf, 0x00, + 0x7d, 0xac, 0x09, 0x26, 0x00, 0x7d, 0xad, 0x04, + 0xa1, 0x00, 0x7d, 0xae, 0x17, 0xca, 0x00, 0x7d, + 0xaf, 0x17, 0xd2, 0x00, 0x7d, 0xb0, 0x17, 0xd6, + 0x00, 0x7d, 0xb1, 0x07, 0xdd, 0x00, 0x7d, 0xb2, + 0x0e, 0xe2, 0x00, 0x7d, 0xb3, 0x4c, 0xd4, 0x00, + 0x7d, 0xb4, 0x0b, 0xf2, 0x00, 0x7d, 0xb5, 0x17, + 0xcc, 0x00, 0x7d, 0xb6, 0x47, 0xb7, 0x00, 0x7d, + 0xb7, 0x21, 0x91, 0x00, 0x7d, 0xb8, 0x17, 0xd4, + 0x00, 0x7d, 0xb9, 0x4c, 0xd5, 0x00, 0x7d, 0xba, + 0x17, 0xc9, 0x00, 0x7d, 0xbb, 0x0b, 0x7c, 0x00, + 0x7d, 0xbd, 0x17, 0xce, 0x00, 0x7d, 0xbe, 0x04, + 0x81, 0x00, 0x7d, 0xbf, 0x0e, 0xd6, 0x00, 0x7d, + 0xc0, 0x47, 0xb8, 0x00, 0x7d, 0xc2, 0x42, 0x94, + 0x00, 0x7d, 0xc3, 0x56, 0xc0, 0x00, 0x7d, 0xc4, + 0x56, 0xc1, 0x00, 0x7d, 0xc5, 0x56, 0xc2, 0x00, + 0x7d, 0xc6, 0x56, 0xc3, 0x00, 0x7d, 0xc7, 0x17, + 0xcd, 0x00, 0x7d, 0xca, 0x06, 0xd3, 0x00, 0x7d, + 0xcb, 0x0d, 0x80, 0x00, 0x7d, 0xcc, 0x3a, 0x86, + 0x00, 0x7d, 0xcd, 0x56, 0xc4, 0x00, 0x7d, 0xce, + 0x56, 0xc5, 0x00, 0x7d, 0xcf, 0x0a, 0xef, 0x00, + 0x7d, 0xd0, 0x4c, 0xd6, 0x00, 0x7d, 0xd1, 0x0f, + 0x98, 0x00, 0x7d, 0xd2, 0x09, 0x79, 0x00, 0x7d, + 0xd5, 0x17, 0xfd, 0x00, 0x7d, 0xd6, 0x21, 0x93, + 0x00, 0x7d, 0xd7, 0x47, 0xb9, 0x00, 0x7d, 0xd8, + 0x17, 0xd7, 0x00, 0x7d, 0xd9, 0x47, 0xba, 0x00, + 0x7d, 0xda, 0x0a, 0xa2, 0x00, 0x7d, 0xdc, 0x17, + 0xd3, 0x00, 0x7d, 0xdd, 0x17, 0xd8, 0x00, 0x7d, + 0xde, 0x17, 0xda, 0x00, 0x7d, 0xe0, 0x0c, 0x15, + 0x00, 0x7d, 0xe1, 0x17, 0xdd, 0x00, 0x7d, 0xe2, + 0x56, 0xc7, 0x00, 0x7d, 0xe3, 0x34, 0x0a, 0x00, + 0x7d, 0xe4, 0x17, 0xd9, 0x00, 0x7d, 0xe5, 0x4c, + 0xd7, 0x00, 0x7d, 0xe6, 0x47, 0xbb, 0x00, 0x7d, + 0xe8, 0x0e, 0x24, 0x00, 0x7d, 0xe9, 0x06, 0x07, + 0x00, 0x7d, 0xea, 0x56, 0xc8, 0x00, 0x7d, 0xeb, + 0x3a, 0x87, 0x00, 0x7d, 0xec, 0x0e, 0xd7, 0x00, + 0x7d, 0xed, 0x56, 0xc9, 0x00, 0x7d, 0xef, 0x04, + 0xa2, 0x00, 0x7d, 0xf1, 0x3a, 0x88, 0x00, 0x7d, + 0xf2, 0x17, 0xdc, 0x00, 0x7d, 0xf4, 0x34, 0x57, + 0x00, 0x7d, 0xf5, 0x4c, 0xd8, 0x00, 0x7d, 0xf6, + 0x4c, 0xd9, 0x00, 0x7d, 0xf9, 0x3a, 0x89, 0x00, + 0x7d, 0xfa, 0x56, 0xca, 0x00, 0x7d, 0xfb, 0x17, + 0xdb, 0x00, 0x7e, 0x00, 0x56, 0xc6, 0x00, 0x7e, + 0x01, 0x05, 0x11, 0x00, 0x7e, 0x04, 0x0c, 0xc4, + 0x00, 0x7e, 0x05, 0x17, 0xde, 0x00, 0x7e, 0x08, + 0x3a, 0x8a, 0x00, 0x7e, 0x09, 0x17, 0xe5, 0x00, + 0x7e, 0x0a, 0x17, 0xdf, 0x00, 0x7e, 0x0b, 0x17, + 0xe6, 0x00, 0x7e, 0x10, 0x47, 0xbf, 0x00, 0x7e, + 0x11, 0x3a, 0x8b, 0x00, 0x7e, 0x12, 0x17, 0xe2, + 0x00, 0x7e, 0x15, 0x3a, 0x8c, 0x00, 0x7e, 0x17, + 0x47, 0xc0, 0x00, 0x7e, 0x1b, 0x0d, 0x31, 0x00, + 0x7e, 0x1c, 0x56, 0xcb, 0x00, 0x7e, 0x1d, 0x47, + 0xc1, 0x00, 0x7e, 0x1e, 0x08, 0xf6, 0x00, 0x7e, + 0x1f, 0x17, 0xe4, 0x00, 0x7e, 0x20, 0x3a, 0x8d, + 0x00, 0x7e, 0x21, 0x17, 0xe1, 0x00, 0x7e, 0x22, + 0x17, 0xe7, 0x00, 0x7e, 0x23, 0x17, 0xe0, 0x00, + 0x7e, 0x26, 0x09, 0x4e, 0x00, 0x7e, 0x27, 0x47, + 0xc2, 0x00, 0x7e, 0x28, 0x42, 0x95, 0x00, 0x7e, + 0x2b, 0x0e, 0x53, 0x00, 0x7e, 0x2c, 0x47, 0xc3, + 0x00, 0x7e, 0x2d, 0x56, 0xcc, 0x00, 0x7e, 0x2e, + 0x09, 0x56, 0x00, 0x7e, 0x2f, 0x4c, 0xda, 0x00, + 0x7e, 0x31, 0x17, 0xe3, 0x00, 0x7e, 0x32, 0x17, + 0xef, 0x00, 0x7e, 0x33, 0x56, 0xcd, 0x00, 0x7e, + 0x35, 0x17, 0xeb, 0x00, 0x7e, 0x36, 0x4c, 0xdb, + 0x00, 0x7e, 0x37, 0x17, 0xee, 0x00, 0x7e, 0x39, + 0x17, 0xec, 0x00, 0x7e, 0x3a, 0x17, 0xf0, 0x00, + 0x7e, 0x3b, 0x17, 0xea, 0x00, 0x7e, 0x3d, 0x17, + 0xd0, 0x00, 0x7e, 0x3e, 0x0a, 0x77, 0x00, 0x7e, + 0x3f, 0x56, 0xce, 0x00, 0x7e, 0x41, 0x0d, 0x5f, + 0x00, 0x7e, 0x43, 0x17, 0xed, 0x00, 0x7e, 0x44, + 0x4c, 0xdc, 0x00, 0x7e, 0x45, 0x47, 0xc4, 0x00, + 0x7e, 0x46, 0x17, 0xe8, 0x00, 0x7e, 0x47, 0x3a, + 0x8e, 0x00, 0x7e, 0x48, 0x37, 0x67, 0x00, 0x7e, + 0x4a, 0x0a, 0xa3, 0x00, 0x7e, 0x4b, 0x07, 0x28, + 0x00, 0x7e, 0x4d, 0x09, 0x35, 0x00, 0x7e, 0x4e, + 0x56, 0xcf, 0x00, 0x7e, 0x50, 0x56, 0xd0, 0x00, + 0x7e, 0x52, 0x21, 0x94, 0x00, 0x7e, 0x54, 0x09, + 0xeb, 0x00, 0x7e, 0x55, 0x0a, 0xb8, 0x00, 0x7e, + 0x56, 0x17, 0xf3, 0x00, 0x7e, 0x58, 0x56, 0xd1, + 0x00, 0x7e, 0x59, 0x17, 0xf5, 0x00, 0x7e, 0x5a, + 0x17, 0xf6, 0x00, 0x7e, 0x5d, 0x17, 0xf2, 0x00, + 0x7e, 0x5e, 0x17, 0xf4, 0x00, 0x7e, 0x5f, 0x56, + 0xd2, 0x00, 0x7e, 0x61, 0x1e, 0x11, 0x00, 0x7e, + 0x62, 0x3a, 0x8f, 0x00, 0x7e, 0x65, 0x56, 0xd3, + 0x00, 0x7e, 0x66, 0x17, 0xe9, 0x00, 0x7e, 0x67, + 0x17, 0xf1, 0x00, 0x7e, 0x69, 0x17, 0xf9, 0x00, + 0x7e, 0x6a, 0x17, 0xf8, 0x00, 0x7e, 0x6b, 0x1d, + 0xf7, 0x00, 0x7e, 0x6d, 0x0e, 0xa8, 0x00, 0x7e, + 0x6e, 0x3a, 0x90, 0x00, 0x7e, 0x6f, 0x4c, 0xdd, + 0x00, 0x7e, 0x70, 0x07, 0x01, 0x00, 0x7e, 0x73, + 0x3a, 0x91, 0x00, 0x7e, 0x75, 0x47, 0xc5, 0x00, + 0x7e, 0x78, 0x4c, 0xde, 0x00, 0x7e, 0x79, 0x17, + 0xf7, 0x00, 0x7e, 0x7b, 0x17, 0xfb, 0x00, 0x7e, + 0x7c, 0x17, 0xfa, 0x00, 0x7e, 0x7d, 0x17, 0xfe, + 0x00, 0x7e, 0x7e, 0x47, 0xc6, 0x00, 0x7e, 0x7f, + 0x18, 0x00, 0x00, 0x7e, 0x81, 0x4c, 0xdf, 0x00, + 0x7e, 0x82, 0x08, 0x8a, 0x00, 0x7e, 0x83, 0x17, + 0xfc, 0x00, 0x7e, 0x86, 0x47, 0xc7, 0x00, 0x7e, + 0x87, 0x47, 0xc8, 0x00, 0x7e, 0x88, 0x18, 0x01, + 0x00, 0x7e, 0x89, 0x18, 0x02, 0x00, 0x7e, 0x8a, + 0x20, 0xa7, 0x00, 0x7e, 0x8c, 0x18, 0x03, 0x00, + 0x7e, 0x8d, 0x3a, 0x92, 0x00, 0x7e, 0x8e, 0x18, + 0x09, 0x00, 0x7e, 0x8f, 0x0c, 0x35, 0x00, 0x7e, + 0x90, 0x18, 0x05, 0x00, 0x7e, 0x91, 0x3a, 0x93, + 0x00, 0x7e, 0x92, 0x18, 0x04, 0x00, 0x7e, 0x93, + 0x18, 0x06, 0x00, 0x7e, 0x94, 0x18, 0x07, 0x00, + 0x7e, 0x95, 0x56, 0xd4, 0x00, 0x7e, 0x96, 0x18, + 0x08, 0x00, 0x7e, 0x98, 0x3a, 0x94, 0x00, 0x7e, + 0x9a, 0x47, 0xca, 0x00, 0x7e, 0x9b, 0x18, 0x0a, + 0x00, 0x7e, 0x9c, 0x18, 0x0b, 0x00, 0x7e, 0x9d, + 0x56, 0xd5, 0x00, 0x7e, 0x9e, 0x56, 0xd6, 0x00, + 0x7f, 0x36, 0x06, 0x08, 0x00, 0x7f, 0x38, 0x18, + 0x0c, 0x00, 0x7f, 0x3a, 0x18, 0x0d, 0x00, 0x7f, + 0x3b, 0x47, 0xcd, 0x00, 0x7f, 0x3c, 0x47, 0xcc, + 0x00, 0x7f, 0x3d, 0x4c, 0xe0, 0x00, 0x7f, 0x3e, + 0x47, 0xce, 0x00, 0x7f, 0x3f, 0x56, 0xd7, 0x00, + 0x7f, 0x43, 0x47, 0xcf, 0x00, 0x7f, 0x44, 0x3a, + 0x95, 0x00, 0x7f, 0x45, 0x18, 0x0e, 0x00, 0x7f, + 0x47, 0x21, 0x95, 0x00, 0x7f, 0x4c, 0x18, 0x0f, + 0x00, 0x7f, 0x4d, 0x18, 0x10, 0x00, 0x7f, 0x4e, + 0x18, 0x11, 0x00, 0x7f, 0x4f, 0x3a, 0x96, 0x00, + 0x7f, 0x50, 0x18, 0x12, 0x00, 0x7f, 0x51, 0x18, + 0x13, 0x00, 0x7f, 0x52, 0x3a, 0x97, 0x00, 0x7f, + 0x53, 0x3a, 0x98, 0x00, 0x7f, 0x54, 0x18, 0x15, + 0x00, 0x7f, 0x55, 0x18, 0x14, 0x00, 0x7f, 0x58, + 0x18, 0x16, 0x00, 0x7f, 0x5b, 0x4c, 0xe1, 0x00, + 0x7f, 0x5c, 0x56, 0xd8, 0x00, 0x7f, 0x5d, 0x4c, + 0xe2, 0x00, 0x7f, 0x5f, 0x18, 0x17, 0x00, 0x7f, + 0x60, 0x18, 0x18, 0x00, 0x7f, 0x61, 0x3a, 0x99, + 0x00, 0x7f, 0x63, 0x47, 0xd3, 0x00, 0x7f, 0x64, + 0x47, 0xd4, 0x00, 0x7f, 0x65, 0x4c, 0xe3, 0x00, + 0x7f, 0x66, 0x56, 0xd9, 0x00, 0x7f, 0x67, 0x18, + 0x1b, 0x00, 0x7f, 0x68, 0x18, 0x19, 0x00, 0x7f, + 0x69, 0x18, 0x1a, 0x00, 0x7f, 0x6a, 0x08, 0x51, + 0x00, 0x7f, 0x6b, 0x07, 0x29, 0x00, 0x7f, 0x6d, + 0x47, 0xd5, 0x00, 0x7f, 0x6e, 0x0b, 0x94, 0x00, + 0x7f, 0x70, 0x0d, 0x47, 0x00, 0x7f, 0x71, 0x4c, + 0xe4, 0x00, 0x7f, 0x72, 0x34, 0x29, 0x00, 0x7f, + 0x75, 0x0d, 0x03, 0x00, 0x7f, 0x77, 0x0d, 0x81, + 0x00, 0x7f, 0x78, 0x18, 0x1c, 0x00, 0x7f, 0x79, + 0x13, 0x36, 0x00, 0x7f, 0x7d, 0x47, 0xd6, 0x00, + 0x7f, 0x7e, 0x47, 0xd7, 0x00, 0x7f, 0x7f, 0x4c, + 0xe5, 0x00, 0x7f, 0x80, 0x4c, 0xe6, 0x00, 0x7f, + 0x82, 0x18, 0x1d, 0x00, 0x7f, 0x83, 0x18, 0x1f, + 0x00, 0x7f, 0x85, 0x0f, 0x4f, 0x00, 0x7f, 0x86, + 0x18, 0x1e, 0x00, 0x7f, 0x87, 0x18, 0x21, 0x00, + 0x7f, 0x88, 0x18, 0x20, 0x00, 0x7f, 0x8a, 0x36, + 0xfe, 0x00, 0x7f, 0x8b, 0x4c, 0xe7, 0x00, 0x7f, + 0x8c, 0x18, 0x22, 0x00, 0x7f, 0x8d, 0x56, 0xdb, + 0x00, 0x7f, 0x8e, 0x0d, 0x92, 0x00, 0x7f, 0x8f, + 0x56, 0xdc, 0x00, 0x7f, 0x90, 0x47, 0xd8, 0x00, + 0x7f, 0x91, 0x3a, 0x9a, 0x00, 0x7f, 0x94, 0x18, + 0x23, 0x00, 0x7f, 0x96, 0x47, 0xdb, 0x00, 0x7f, + 0x97, 0x42, 0x96, 0x00, 0x7f, 0x9a, 0x18, 0x26, + 0x00, 0x7f, 0x9c, 0x47, 0xdc, 0x00, 0x7f, 0x9d, + 0x18, 0x25, 0x00, 0x7f, 0x9e, 0x18, 0x24, 0x00, + 0x7f, 0xa1, 0x21, 0x96, 0x00, 0x7f, 0xa2, 0x4c, + 0xe8, 0x00, 0x7f, 0xa3, 0x18, 0x27, 0x00, 0x7f, + 0xa4, 0x07, 0x08, 0x00, 0x7f, 0xa6, 0x56, 0xdd, + 0x00, 0x7f, 0xa8, 0x0a, 0xa4, 0x00, 0x7f, 0xa9, + 0x06, 0x5b, 0x00, 0x7f, 0xaa, 0x56, 0xde, 0x00, + 0x7f, 0xad, 0x47, 0xdd, 0x00, 0x7f, 0xae, 0x18, + 0x2b, 0x00, 0x7f, 0xaf, 0x18, 0x28, 0x00, 0x7f, + 0xb2, 0x18, 0x29, 0x00, 0x7f, 0xb4, 0x56, 0xdf, + 0x00, 0x7f, 0xb6, 0x18, 0x2c, 0x00, 0x7f, 0xb8, + 0x18, 0x2d, 0x00, 0x7f, 0xb9, 0x18, 0x2a, 0x00, + 0x7f, 0xbc, 0x56, 0xe0, 0x00, 0x7f, 0xbd, 0x21, + 0x97, 0x00, 0x7f, 0xbf, 0x3a, 0x9b, 0x00, 0x7f, + 0xc0, 0x56, 0xe1, 0x00, 0x7f, 0xc1, 0x05, 0x27, + 0x00, 0x7f, 0xc3, 0x47, 0xdf, 0x00, 0x7f, 0xc5, + 0x18, 0x2f, 0x00, 0x7f, 0xc6, 0x18, 0x30, 0x00, + 0x7f, 0xc8, 0x56, 0xe2, 0x00, 0x7f, 0xca, 0x18, + 0x31, 0x00, 0x7f, 0xcc, 0x0f, 0x4c, 0x00, 0x7f, + 0xce, 0x3a, 0x9c, 0x00, 0x7f, 0xcf, 0x47, 0xe0, + 0x00, 0x7f, 0xd2, 0x09, 0x36, 0x00, 0x7f, 0xd4, + 0x18, 0x33, 0x00, 0x7f, 0xd5, 0x18, 0x32, 0x00, + 0x7f, 0xdb, 0x42, 0x97, 0x00, 0x7f, 0xdf, 0x3a, + 0x9d, 0x00, 0x7f, 0xe0, 0x0a, 0x2f, 0x00, 0x7f, + 0xe1, 0x18, 0x34, 0x00, 0x7f, 0xe3, 0x47, 0xe1, + 0x00, 0x7f, 0xe5, 0x3a, 0x9e, 0x00, 0x7f, 0xe6, + 0x18, 0x35, 0x00, 0x7f, 0xe8, 0x56, 0xe3, 0x00, + 0x7f, 0xe9, 0x18, 0x36, 0x00, 0x7f, 0xeb, 0x06, + 0x21, 0x00, 0x7f, 0xec, 0x3a, 0x9f, 0x00, 0x7f, + 0xee, 0x3a, 0xa0, 0x00, 0x7f, 0xef, 0x3a, 0xa1, + 0x00, 0x7f, 0xf0, 0x06, 0x09, 0x00, 0x7f, 0xf2, + 0x47, 0xe2, 0x00, 0x7f, 0xf3, 0x18, 0x37, 0x00, + 0x7f, 0xf9, 0x18, 0x38, 0x00, 0x7f, 0xfa, 0x3a, + 0xa2, 0x00, 0x7f, 0xfb, 0x0e, 0x8b, 0x00, 0x7f, + 0xfc, 0x0f, 0x4d, 0x00, 0x7f, 0xfd, 0x4c, 0xe9, + 0x00, 0x7f, 0xfe, 0x4c, 0xea, 0x00, 0x7f, 0xff, + 0x4c, 0xeb, 0x00, 0x80, 0x00, 0x0f, 0x3e, 0x00, + 0x80, 0x01, 0x0f, 0xdd, 0x00, 0x80, 0x02, 0x37, + 0x13, 0x00, 0x80, 0x03, 0x07, 0xdf, 0x00, 0x80, + 0x04, 0x18, 0x3b, 0x00, 0x80, 0x05, 0x09, 0x00, + 0x00, 0x80, 0x06, 0x18, 0x3a, 0x00, 0x80, 0x07, + 0x4c, 0xec, 0x00, 0x80, 0x08, 0x47, 0xe4, 0x00, + 0x80, 0x0a, 0x47, 0xe3, 0x00, 0x80, 0x0b, 0x18, + 0x3c, 0x00, 0x80, 0x0c, 0x08, 0xd5, 0x00, 0x80, + 0x0d, 0x4c, 0xed, 0x00, 0x80, 0x0e, 0x3a, 0xa3, + 0x00, 0x80, 0x0f, 0x56, 0xe4, 0x00, 0x80, 0x10, + 0x0b, 0x31, 0x00, 0x80, 0x11, 0x3a, 0xa4, 0x00, + 0x80, 0x12, 0x18, 0x3d, 0x00, 0x80, 0x13, 0x56, + 0xe5, 0x00, 0x80, 0x14, 0x3a, 0xa5, 0x00, 0x80, + 0x15, 0x07, 0xde, 0x00, 0x80, 0x16, 0x47, 0xe5, + 0x00, 0x80, 0x17, 0x0e, 0xe3, 0x00, 0x80, 0x18, + 0x18, 0x3e, 0x00, 0x80, 0x19, 0x18, 0x3f, 0x00, + 0x80, 0x1c, 0x18, 0x40, 0x00, 0x80, 0x1d, 0x56, + 0xe6, 0x00, 0x80, 0x1e, 0x4c, 0xee, 0x00, 0x80, + 0x1f, 0x56, 0xe7, 0x00, 0x80, 0x20, 0x56, 0xe8, + 0x00, 0x80, 0x21, 0x18, 0x41, 0x00, 0x80, 0x24, + 0x3a, 0xa6, 0x00, 0x80, 0x26, 0x3a, 0xa7, 0x00, + 0x80, 0x28, 0x18, 0x42, 0x00, 0x80, 0x2c, 0x47, + 0xe6, 0x00, 0x80, 0x2e, 0x56, 0xe9, 0x00, 0x80, + 0x30, 0x47, 0xe7, 0x00, 0x80, 0x33, 0x08, 0xd6, + 0x00, 0x80, 0x34, 0x56, 0xea, 0x00, 0x80, 0x35, + 0x42, 0x98, 0x00, 0x80, 0x36, 0x0e, 0xf9, 0x00, + 0x80, 0x37, 0x42, 0x99, 0x00, 0x80, 0x39, 0x4c, + 0xef, 0x00, 0x80, 0x3a, 0x3a, 0xa8, 0x00, 0x80, + 0x3b, 0x18, 0x44, 0x00, 0x80, 0x3c, 0x3a, 0xa9, + 0x00, 0x80, 0x3d, 0x0b, 0x7d, 0x00, 0x80, 0x3e, + 0x56, 0xeb, 0x00, 0x80, 0x3f, 0x18, 0x43, 0x00, + 0x80, 0x40, 0x56, 0xec, 0x00, 0x80, 0x43, 0x47, + 0xe8, 0x00, 0x80, 0x44, 0x56, 0xed, 0x00, 0x80, + 0x46, 0x18, 0x46, 0x00, 0x80, 0x4a, 0x18, 0x45, + 0x00, 0x80, 0x52, 0x18, 0x47, 0x00, 0x80, 0x56, + 0x0a, 0x5f, 0x00, 0x80, 0x58, 0x18, 0x48, 0x00, + 0x80, 0x5a, 0x18, 0x49, 0x00, 0x80, 0x5e, 0x0e, + 0x09, 0x00, 0x80, 0x5f, 0x18, 0x4a, 0x00, 0x80, + 0x60, 0x3a, 0xaa, 0x00, 0x80, 0x61, 0x0a, 0xf1, + 0x00, 0x80, 0x62, 0x18, 0x4b, 0x00, 0x80, 0x64, + 0x56, 0xee, 0x00, 0x80, 0x66, 0x47, 0xe9, 0x00, + 0x80, 0x68, 0x18, 0x4c, 0x00, 0x80, 0x6d, 0x56, + 0xef, 0x00, 0x80, 0x6f, 0x0f, 0xc6, 0x00, 0x80, + 0x70, 0x18, 0x4f, 0x00, 0x80, 0x71, 0x3a, 0xab, + 0x00, 0x80, 0x72, 0x18, 0x4e, 0x00, 0x80, 0x73, + 0x18, 0x4d, 0x00, 0x80, 0x74, 0x0b, 0xcc, 0x00, + 0x80, 0x75, 0x3a, 0xac, 0x00, 0x80, 0x76, 0x18, + 0x50, 0x00, 0x80, 0x77, 0x09, 0xec, 0x00, 0x80, + 0x79, 0x18, 0x51, 0x00, 0x80, 0x7b, 0x47, 0xea, + 0x00, 0x80, 0x7d, 0x18, 0x52, 0x00, 0x80, 0x7e, + 0x0f, 0xde, 0x00, 0x80, 0x7f, 0x18, 0x53, 0x00, + 0x80, 0x81, 0x56, 0xf0, 0x00, 0x80, 0x84, 0x18, + 0x54, 0x00, 0x80, 0x85, 0x18, 0x56, 0x00, 0x80, + 0x86, 0x18, 0x55, 0x00, 0x80, 0x87, 0x0d, 0x39, + 0x00, 0x80, 0x88, 0x4c, 0xf0, 0x00, 0x80, 0x89, + 0x0c, 0xd1, 0x00, 0x80, 0x8b, 0x0f, 0xe4, 0x00, + 0x80, 0x8c, 0x0d, 0x3d, 0x00, 0x80, 0x8e, 0x4c, + 0xf1, 0x00, 0x80, 0x93, 0x18, 0x58, 0x00, 0x80, + 0x96, 0x09, 0xbb, 0x00, 0x80, 0x98, 0x0d, 0x9c, + 0x00, 0x80, 0x99, 0x47, 0xeb, 0x00, 0x80, 0x9a, + 0x18, 0x59, 0x00, 0x80, 0x9b, 0x18, 0x57, 0x00, + 0x80, 0x9c, 0x47, 0xec, 0x00, 0x80, 0x9d, 0x06, + 0x0a, 0x00, 0x80, 0x9e, 0x3a, 0xad, 0x00, 0x80, + 0xa1, 0x07, 0x88, 0x00, 0x80, 0xa2, 0x08, 0xb6, + 0x00, 0x80, 0xa4, 0x47, 0xed, 0x00, 0x80, 0xa5, + 0x0d, 0x82, 0x00, 0x80, 0xa6, 0x3a, 0xae, 0x00, + 0x80, 0xa7, 0x47, 0xee, 0x00, 0x80, 0xa9, 0x07, + 0x5e, 0x00, 0x80, 0xaa, 0x0e, 0x71, 0x00, 0x80, + 0xab, 0x3a, 0xaf, 0x00, 0x80, 0xac, 0x18, 0x5c, + 0x00, 0x80, 0xad, 0x18, 0x5a, 0x00, 0x80, 0xaf, + 0x07, 0xe0, 0x00, 0x80, 0xb1, 0x07, 0xe1, 0x00, + 0x80, 0xb2, 0x04, 0xad, 0x00, 0x80, 0xb4, 0x08, + 0x58, 0x00, 0x80, 0xb8, 0x47, 0xef, 0x00, 0x80, + 0xb9, 0x56, 0xf1, 0x00, 0x80, 0xba, 0x0d, 0x0f, + 0x00, 0x80, 0xc3, 0x04, 0xa3, 0x00, 0x80, 0xc4, + 0x18, 0x61, 0x00, 0x80, 0xc5, 0x47, 0xf1, 0x00, + 0x80, 0xc6, 0x0b, 0x7e, 0x00, 0x80, 0xc8, 0x56, + 0xf2, 0x00, 0x80, 0xca, 0x42, 0x9a, 0x00, 0x80, + 0xcc, 0x0d, 0x0e, 0x00, 0x80, 0xcd, 0x56, 0xf3, + 0x00, 0x80, 0xce, 0x0b, 0x3b, 0x00, 0x80, 0xcf, + 0x4c, 0xf2, 0x00, 0x80, 0xd2, 0x56, 0xf4, 0x00, + 0x80, 0xd4, 0x4c, 0xf3, 0x00, 0x80, 0xd5, 0x47, + 0xf2, 0x00, 0x80, 0xd6, 0x18, 0x63, 0x00, 0x80, + 0xd7, 0x3a, 0xb0, 0x00, 0x80, 0xd8, 0x3a, 0xb1, + 0x00, 0x80, 0xd9, 0x18, 0x5f, 0x00, 0x80, 0xda, + 0x18, 0x62, 0x00, 0x80, 0xdb, 0x18, 0x5d, 0x00, + 0x80, 0xdd, 0x18, 0x60, 0x00, 0x80, 0xde, 0x0e, + 0x54, 0x00, 0x80, 0xe0, 0x42, 0x9b, 0x00, 0x80, + 0xe1, 0x07, 0x89, 0x00, 0x80, 0xe4, 0x04, 0xc1, + 0x00, 0x80, 0xe5, 0x18, 0x5e, 0x00, 0x80, 0xe6, + 0x47, 0xf3, 0x00, 0x80, 0xed, 0x4c, 0xf4, 0x00, + 0x80, 0xee, 0x56, 0xf5, 0x00, 0x80, 0xef, 0x18, + 0x65, 0x00, 0x80, 0xf0, 0x4c, 0xf5, 0x00, 0x80, + 0xf1, 0x18, 0x66, 0x00, 0x80, 0xf2, 0x56, 0xf6, + 0x00, 0x80, 0xf3, 0x42, 0x9c, 0x00, 0x80, 0xf4, + 0x0c, 0x91, 0x00, 0x80, 0xf5, 0x47, 0xf5, 0x00, + 0x80, 0xf6, 0x56, 0xf7, 0x00, 0x80, 0xf7, 0x4c, + 0xf6, 0x00, 0x80, 0xf8, 0x06, 0xb3, 0x00, 0x80, + 0xf9, 0x56, 0xf8, 0x00, 0x80, 0xfa, 0x4c, 0xf7, + 0x00, 0x80, 0xfb, 0x47, 0xf6, 0x00, 0x80, 0xfc, + 0x18, 0x71, 0x00, 0x80, 0xfd, 0x0c, 0xf3, 0x00, + 0x80, 0xfe, 0x4c, 0xf8, 0x00, 0x81, 0x02, 0x08, + 0xb7, 0x00, 0x81, 0x03, 0x4c, 0xf9, 0x00, 0x81, + 0x05, 0x06, 0xb4, 0x00, 0x81, 0x06, 0x0a, 0x6c, + 0x00, 0x81, 0x07, 0x0f, 0xec, 0x00, 0x81, 0x08, + 0x0e, 0xba, 0x00, 0x81, 0x09, 0x18, 0x64, 0x00, + 0x81, 0x0a, 0x0a, 0x78, 0x00, 0x81, 0x0b, 0x56, + 0xf9, 0x00, 0x81, 0x0d, 0x47, 0xf4, 0x00, 0x81, + 0x16, 0x3a, 0xb2, 0x00, 0x81, 0x17, 0x4c, 0xfa, + 0x00, 0x81, 0x18, 0x3a, 0xb3, 0x00, 0x81, 0x1a, + 0x06, 0x6d, 0x00, 0x81, 0x1b, 0x18, 0x67, 0x00, + 0x81, 0x1c, 0x56, 0xfa, 0x00, 0x81, 0x1e, 0x47, + 0xf9, 0x00, 0x81, 0x20, 0x56, 0xfb, 0x00, 0x81, + 0x23, 0x18, 0x69, 0x00, 0x81, 0x24, 0x47, 0xfb, + 0x00, 0x81, 0x27, 0x47, 0xfc, 0x00, 0x81, 0x29, + 0x18, 0x68, 0x00, 0x81, 0x2b, 0x36, 0x59, 0x00, + 0x81, 0x2c, 0x47, 0xfd, 0x00, 0x81, 0x2f, 0x18, + 0x6a, 0x00, 0x81, 0x30, 0x4c, 0xfb, 0x00, 0x81, + 0x31, 0x0b, 0x64, 0x00, 0x81, 0x33, 0x0c, 0xf4, + 0x00, 0x81, 0x35, 0x47, 0xf8, 0x00, 0x81, 0x39, + 0x0b, 0xcd, 0x00, 0x81, 0x3a, 0x3a, 0xb4, 0x00, + 0x81, 0x3c, 0x56, 0xfc, 0x00, 0x81, 0x3d, 0x47, + 0xff, 0x00, 0x81, 0x3e, 0x18, 0x6e, 0x00, 0x81, + 0x41, 0x37, 0x72, 0x00, 0x81, 0x45, 0x56, 0xfd, + 0x00, 0x81, 0x46, 0x18, 0x6d, 0x00, 0x81, 0x47, + 0x56, 0xfe, 0x00, 0x81, 0x4a, 0x3a, 0xb5, 0x00, + 0x81, 0x4b, 0x18, 0x6b, 0x00, 0x81, 0x4c, 0x3a, + 0xb6, 0x00, 0x81, 0x4e, 0x0a, 0x1b, 0x00, 0x81, + 0x50, 0x0d, 0xd7, 0x00, 0x81, 0x51, 0x18, 0x70, + 0x00, 0x81, 0x52, 0x56, 0xff, 0x00, 0x81, 0x53, + 0x18, 0x6f, 0x00, 0x81, 0x54, 0x07, 0xe2, 0x00, + 0x81, 0x55, 0x0f, 0xf9, 0x00, 0x81, 0x57, 0x4c, + 0xfc, 0x00, 0x81, 0x5f, 0x18, 0x80, 0x00, 0x81, + 0x60, 0x42, 0x9d, 0x00, 0x81, 0x61, 0x57, 0x00, + 0x00, 0x81, 0x65, 0x18, 0x74, 0x00, 0x81, 0x66, + 0x18, 0x75, 0x00, 0x81, 0x67, 0x42, 0x9e, 0x00, + 0x81, 0x68, 0x42, 0x9f, 0x00, 0x81, 0x69, 0x48, + 0x01, 0x00, 0x81, 0x6b, 0x09, 0x1c, 0x00, 0x81, + 0x6d, 0x42, 0xa0, 0x00, 0x81, 0x6e, 0x18, 0x73, + 0x00, 0x81, 0x6f, 0x4c, 0xfd, 0x00, 0x81, 0x70, + 0x08, 0x0a, 0x00, 0x81, 0x71, 0x18, 0x72, 0x00, + 0x81, 0x73, 0x4c, 0xfe, 0x00, 0x81, 0x74, 0x18, + 0x76, 0x00, 0x81, 0x77, 0x57, 0x01, 0x00, 0x81, + 0x78, 0x0b, 0xce, 0x00, 0x81, 0x79, 0x0d, 0xf2, + 0x00, 0x81, 0x7a, 0x0a, 0xa5, 0x00, 0x81, 0x7f, + 0x0b, 0x3c, 0x00, 0x81, 0x80, 0x18, 0x7a, 0x00, + 0x81, 0x81, 0x3a, 0xb7, 0x00, 0x81, 0x82, 0x18, + 0x7b, 0x00, 0x81, 0x83, 0x18, 0x77, 0x00, 0x81, + 0x84, 0x3a, 0xb8, 0x00, 0x81, 0x85, 0x48, 0x04, + 0x00, 0x81, 0x86, 0x57, 0x02, 0x00, 0x81, 0x88, + 0x18, 0x78, 0x00, 0x81, 0x8a, 0x18, 0x79, 0x00, + 0x81, 0x8b, 0x4c, 0xff, 0x00, 0x81, 0x8e, 0x57, + 0x03, 0x00, 0x81, 0x8f, 0x07, 0xe3, 0x00, 0x81, + 0x90, 0x4d, 0x00, 0x00, 0x81, 0x93, 0x18, 0x81, + 0x00, 0x81, 0x95, 0x18, 0x7d, 0x00, 0x81, 0x96, + 0x57, 0x04, 0x00, 0x81, 0x98, 0x48, 0x06, 0x00, + 0x81, 0x9a, 0x0d, 0xd8, 0x00, 0x81, 0x9b, 0x4d, + 0x01, 0x00, 0x81, 0x9c, 0x0e, 0x9a, 0x00, 0x81, + 0x9d, 0x0d, 0x9a, 0x00, 0x81, 0x9e, 0x4d, 0x02, + 0x00, 0x81, 0xa0, 0x18, 0x7c, 0x00, 0x81, 0xa2, + 0x57, 0x05, 0x00, 0x81, 0xa3, 0x18, 0x7f, 0x00, + 0x81, 0xa4, 0x18, 0x7e, 0x00, 0x81, 0xa8, 0x0e, + 0x72, 0x00, 0x81, 0xa9, 0x18, 0x82, 0x00, 0x81, + 0xae, 0x57, 0x06, 0x00, 0x81, 0xb0, 0x18, 0x83, + 0x00, 0x81, 0xb2, 0x48, 0x07, 0x00, 0x81, 0xb3, + 0x0a, 0xb9, 0x00, 0x81, 0xb4, 0x3a, 0xb9, 0x00, + 0x81, 0xb5, 0x18, 0x84, 0x00, 0x81, 0xb8, 0x18, + 0x86, 0x00, 0x81, 0xba, 0x18, 0x8a, 0x00, 0x81, + 0xbb, 0x42, 0xa1, 0x00, 0x81, 0xbd, 0x18, 0x87, + 0x00, 0x81, 0xbe, 0x18, 0x85, 0x00, 0x81, 0xbf, + 0x0c, 0xf5, 0x00, 0x81, 0xc0, 0x18, 0x88, 0x00, + 0x81, 0xc1, 0x48, 0x08, 0x00, 0x81, 0xc2, 0x18, + 0x89, 0x00, 0x81, 0xc3, 0x48, 0x09, 0x00, 0x81, + 0xc5, 0x57, 0x07, 0x00, 0x81, 0xc6, 0x05, 0x32, + 0x00, 0x81, 0xc8, 0x18, 0x90, 0x00, 0x81, 0xc9, + 0x18, 0x8b, 0x00, 0x81, 0xca, 0x42, 0xa2, 0x00, + 0x81, 0xcb, 0x4d, 0x03, 0x00, 0x81, 0xcd, 0x18, + 0x8c, 0x00, 0x81, 0xce, 0x57, 0x08, 0x00, 0x81, + 0xcf, 0x3a, 0xba, 0x00, 0x81, 0xd1, 0x18, 0x8d, + 0x00, 0x81, 0xd3, 0x0b, 0x01, 0x00, 0x81, 0xd5, + 0x4d, 0x04, 0x00, 0x81, 0xd6, 0x48, 0x0a, 0x00, + 0x81, 0xd7, 0x42, 0xa3, 0x00, 0x81, 0xd8, 0x18, + 0x8f, 0x00, 0x81, 0xd9, 0x18, 0x8e, 0x00, 0x81, + 0xda, 0x18, 0x91, 0x00, 0x81, 0xdb, 0x48, 0x0b, + 0x00, 0x81, 0xdd, 0x4d, 0x05, 0x00, 0x81, 0xde, + 0x4d, 0x06, 0x00, 0x81, 0xdf, 0x18, 0x92, 0x00, + 0x81, 0xe0, 0x18, 0x93, 0x00, 0x81, 0xe1, 0x4d, + 0x07, 0x00, 0x81, 0xe3, 0x0a, 0x09, 0x00, 0x81, + 0xe4, 0x48, 0x0d, 0x00, 0x81, 0xe5, 0x05, 0x69, + 0x00, 0x81, 0xe7, 0x18, 0x94, 0x00, 0x81, 0xe8, + 0x0f, 0x9f, 0x00, 0x81, 0xea, 0x08, 0xd7, 0x00, + 0x81, 0xeb, 0x57, 0x09, 0x00, 0x81, 0xec, 0x48, + 0x0f, 0x00, 0x81, 0xed, 0x09, 0x37, 0x00, 0x81, + 0xef, 0x4d, 0x08, 0x00, 0x81, 0xf0, 0x57, 0x0a, + 0x00, 0x81, 0xf1, 0x57, 0x0b, 0x00, 0x81, 0xf2, + 0x57, 0x0c, 0x00, 0x81, 0xf3, 0x08, 0xb8, 0x00, + 0x81, 0xf4, 0x0b, 0x95, 0x00, 0x81, 0xf5, 0x57, + 0x0d, 0x00, 0x81, 0xf6, 0x4d, 0x09, 0x00, 0x81, + 0xf8, 0x57, 0x0e, 0x00, 0x81, 0xf9, 0x3a, 0xbb, + 0x00, 0x81, 0xfa, 0x18, 0x95, 0x00, 0x81, 0xfb, + 0x18, 0x96, 0x00, 0x81, 0xfc, 0x04, 0xd3, 0x00, + 0x81, 0xfd, 0x48, 0x10, 0x00, 0x81, 0xfe, 0x18, + 0x97, 0x00, 0x81, 0xff, 0x48, 0x11, 0x00, 0x82, + 0x00, 0x4d, 0x0a, 0x00, 0x82, 0x01, 0x18, 0x98, + 0x00, 0x82, 0x02, 0x18, 0x99, 0x00, 0x82, 0x03, + 0x3a, 0xbc, 0x00, 0x82, 0x04, 0x48, 0x13, 0x00, + 0x82, 0x05, 0x18, 0x9a, 0x00, 0x82, 0x07, 0x18, + 0x9b, 0x00, 0x82, 0x08, 0x06, 0xb5, 0x00, 0x82, + 0x09, 0x13, 0xaf, 0x00, 0x82, 0x0a, 0x18, 0x9c, + 0x00, 0x82, 0x0b, 0x4d, 0x0b, 0x00, 0x82, 0x0c, + 0x0a, 0x89, 0x00, 0x82, 0x0d, 0x18, 0x9d, 0x00, + 0x82, 0x0e, 0x08, 0xf7, 0x00, 0x82, 0x0f, 0x57, + 0x10, 0x00, 0x82, 0x10, 0x18, 0x9e, 0x00, 0x82, + 0x12, 0x10, 0x09, 0x00, 0x82, 0x13, 0x4d, 0x0c, + 0x00, 0x82, 0x14, 0x4d, 0x0d, 0x00, 0x82, 0x16, + 0x18, 0x9f, 0x00, 0x82, 0x17, 0x0e, 0x2e, 0x00, + 0x82, 0x18, 0x06, 0x18, 0x00, 0x82, 0x19, 0x48, + 0x15, 0x00, 0x82, 0x1a, 0x4d, 0x0e, 0x00, 0x82, + 0x1b, 0x0a, 0xa6, 0x00, 0x82, 0x1c, 0x09, 0x62, + 0x00, 0x82, 0x1d, 0x57, 0x11, 0x00, 0x82, 0x1e, + 0x0d, 0xe3, 0x00, 0x82, 0x1f, 0x09, 0x38, 0x00, + 0x82, 0x21, 0x3a, 0xbd, 0x00, 0x82, 0x22, 0x48, + 0x16, 0x00, 0x82, 0x28, 0x57, 0x12, 0x00, 0x82, + 0x29, 0x18, 0xa0, 0x00, 0x82, 0x2a, 0x07, 0xe4, + 0x00, 0x82, 0x2b, 0x18, 0xa1, 0x00, 0x82, 0x2c, + 0x0d, 0x60, 0x00, 0x82, 0x2e, 0x18, 0xaf, 0x00, + 0x82, 0x32, 0x3a, 0xbe, 0x00, 0x82, 0x33, 0x18, + 0xa3, 0x00, 0x82, 0x34, 0x3a, 0xbf, 0x00, 0x82, + 0x35, 0x0b, 0x29, 0x00, 0x82, 0x36, 0x0d, 0x2b, + 0x00, 0x82, 0x37, 0x07, 0x73, 0x00, 0x82, 0x38, + 0x18, 0xa2, 0x00, 0x82, 0x39, 0x0a, 0xa7, 0x00, + 0x82, 0x3a, 0x4d, 0x0f, 0x00, 0x82, 0x3c, 0x48, + 0x18, 0x00, 0x82, 0x40, 0x18, 0xa4, 0x00, 0x82, + 0x43, 0x57, 0x13, 0x00, 0x82, 0x44, 0x4d, 0x10, + 0x00, 0x82, 0x45, 0x48, 0x1a, 0x00, 0x82, 0x46, + 0x3a, 0xc0, 0x00, 0x82, 0x47, 0x0c, 0x16, 0x00, + 0x82, 0x49, 0x48, 0x19, 0x00, 0x82, 0x4b, 0x3a, + 0xc1, 0x00, 0x82, 0x4e, 0x57, 0x14, 0x00, 0x82, + 0x4f, 0x3a, 0xc2, 0x00, 0x82, 0x51, 0x57, 0x15, + 0x00, 0x82, 0x56, 0x57, 0x16, 0x00, 0x82, 0x57, + 0x48, 0x1e, 0x00, 0x82, 0x58, 0x18, 0xa6, 0x00, + 0x82, 0x59, 0x18, 0xa5, 0x00, 0x82, 0x5a, 0x18, + 0xa8, 0x00, 0x82, 0x5c, 0x48, 0x20, 0x00, 0x82, + 0x5d, 0x18, 0xa7, 0x00, 0x82, 0x5f, 0x18, 0xa9, + 0x00, 0x82, 0x60, 0x42, 0xa5, 0x00, 0x82, 0x62, + 0x18, 0xab, 0x00, 0x82, 0x63, 0x48, 0x21, 0x00, + 0x82, 0x64, 0x18, 0xaa, 0x00, 0x82, 0x66, 0x06, + 0x0b, 0x00, 0x82, 0x67, 0x57, 0x17, 0x00, 0x82, + 0x68, 0x18, 0xac, 0x00, 0x82, 0x6a, 0x18, 0xad, + 0x00, 0x82, 0x6b, 0x18, 0xae, 0x00, 0x82, 0x6d, + 0x4d, 0x11, 0x00, 0x82, 0x6e, 0x08, 0x21, 0x00, + 0x82, 0x6f, 0x0f, 0x91, 0x00, 0x82, 0x71, 0x18, + 0xb0, 0x00, 0x82, 0x72, 0x09, 0xed, 0x00, 0x82, + 0x74, 0x42, 0xa6, 0x00, 0x82, 0x76, 0x05, 0x12, + 0x00, 0x82, 0x77, 0x18, 0xb1, 0x00, 0x82, 0x78, + 0x18, 0xb2, 0x00, 0x82, 0x79, 0x37, 0x75, 0x00, + 0x82, 0x7b, 0x57, 0x18, 0x00, 0x82, 0x7d, 0x48, + 0x24, 0x00, 0x82, 0x7e, 0x18, 0xb3, 0x00, 0x82, + 0x7f, 0x48, 0x25, 0x00, 0x82, 0x80, 0x57, 0x19, + 0x00, 0x82, 0x81, 0x57, 0x1a, 0x00, 0x82, 0x83, + 0x48, 0x26, 0x00, 0x82, 0x84, 0x4d, 0x12, 0x00, + 0x82, 0x87, 0x57, 0x1b, 0x00, 0x82, 0x89, 0x4d, + 0x13, 0x00, 0x82, 0x8a, 0x48, 0x27, 0x00, 0x82, + 0x8b, 0x04, 0xb6, 0x00, 0x82, 0x8d, 0x18, 0xb4, + 0x00, 0x82, 0x8e, 0x3a, 0xc3, 0x00, 0x82, 0x91, + 0x4d, 0x14, 0x00, 0x82, 0x92, 0x18, 0xb5, 0x00, + 0x82, 0x93, 0x48, 0x28, 0x00, 0x82, 0x94, 0x57, + 0x1c, 0x00, 0x82, 0x96, 0x57, 0x1d, 0x00, 0x82, + 0x98, 0x57, 0x1e, 0x00, 0x82, 0x99, 0x0d, 0xd9, + 0x00, 0x82, 0x9a, 0x57, 0x1f, 0x00, 0x82, 0x9b, + 0x57, 0x20, 0x00, 0x82, 0x9d, 0x08, 0xf3, 0x00, + 0x82, 0x9f, 0x18, 0xb7, 0x00, 0x82, 0xa0, 0x57, + 0x21, 0x00, 0x82, 0xa1, 0x42, 0xa8, 0x00, 0x82, + 0xa3, 0x42, 0xa9, 0x00, 0x82, 0xa4, 0x42, 0xaa, + 0x00, 0x82, 0xa5, 0x05, 0x87, 0x00, 0x82, 0xa6, + 0x04, 0x76, 0x00, 0x82, 0xa7, 0x48, 0x29, 0x00, + 0x82, 0xa8, 0x48, 0x2a, 0x00, 0x82, 0xa9, 0x42, + 0xab, 0x00, 0x82, 0xaa, 0x4d, 0x15, 0x00, 0x82, + 0xab, 0x18, 0xb6, 0x00, 0x82, 0xac, 0x18, 0xb9, + 0x00, 0x82, 0xad, 0x0d, 0x04, 0x00, 0x82, 0xae, + 0x3a, 0xc4, 0x00, 0x82, 0xaf, 0x0a, 0x0a, 0x00, + 0x82, 0xb0, 0x4d, 0x16, 0x00, 0x82, 0xb1, 0x05, + 0x56, 0x00, 0x82, 0xb2, 0x48, 0x2b, 0x00, 0x82, + 0xb3, 0x0e, 0x55, 0x00, 0x82, 0xb4, 0x48, 0x2c, + 0x00, 0x82, 0xb7, 0x3a, 0xc5, 0x00, 0x82, 0xb8, + 0x07, 0x33, 0x00, 0x82, 0xb9, 0x06, 0xd4, 0x00, + 0x82, 0xba, 0x48, 0x2d, 0x00, 0x82, 0xbb, 0x18, + 0xb8, 0x00, 0x82, 0xbc, 0x48, 0x2e, 0x00, 0x82, + 0xbd, 0x35, 0x66, 0x00, 0x82, 0xbe, 0x3a, 0xc6, + 0x00, 0x82, 0xbf, 0x42, 0xac, 0x00, 0x82, 0xc5, + 0x05, 0xdf, 0x00, 0x82, 0xc6, 0x3a, 0xc7, 0x00, + 0x82, 0xd0, 0x4d, 0x17, 0x00, 0x82, 0xd1, 0x05, + 0x13, 0x00, 0x82, 0xd2, 0x18, 0xbd, 0x00, 0x82, + 0xd3, 0x0f, 0xb2, 0x00, 0x82, 0xd4, 0x0b, 0x3d, + 0x00, 0x82, 0xd5, 0x42, 0xad, 0x00, 0x82, 0xd7, + 0x0d, 0xb6, 0x00, 0x82, 0xd9, 0x18, 0xc9, 0x00, + 0x82, 0xda, 0x57, 0x22, 0x00, 0x82, 0xdb, 0x05, + 0x57, 0x00, 0x82, 0xdc, 0x18, 0xc7, 0x00, 0x82, + 0xde, 0x18, 0xc5, 0x00, 0x82, 0xdf, 0x18, 0xbc, + 0x00, 0x82, 0xe0, 0x57, 0x23, 0x00, 0x82, 0xe1, + 0x18, 0xba, 0x00, 0x82, 0xe2, 0x48, 0x2f, 0x00, + 0x82, 0xe3, 0x18, 0xbb, 0x00, 0x82, 0xe4, 0x57, + 0x24, 0x00, 0x82, 0xe5, 0x09, 0x0f, 0x00, 0x82, + 0xe6, 0x06, 0xe4, 0x00, 0x82, 0xe7, 0x0b, 0xb5, + 0x00, 0x82, 0xe8, 0x48, 0x30, 0x00, 0x82, 0xea, + 0x4d, 0x18, 0x00, 0x82, 0xeb, 0x0c, 0xa9, 0x00, + 0x82, 0xed, 0x57, 0x25, 0x00, 0x82, 0xef, 0x4d, + 0x19, 0x00, 0x82, 0xf1, 0x04, 0xf3, 0x00, 0x82, + 0xf3, 0x18, 0xbf, 0x00, 0x82, 0xf4, 0x18, 0xbe, + 0x00, 0x82, 0xf6, 0x4d, 0x1a, 0x00, 0x82, 0xf7, + 0x48, 0x31, 0x00, 0x82, 0xf9, 0x18, 0xc4, 0x00, + 0x82, 0xfa, 0x18, 0xc0, 0x00, 0x82, 0xfb, 0x18, + 0xc3, 0x00, 0x82, 0xfd, 0x42, 0xae, 0x00, 0x82, + 0xfe, 0x3a, 0xc8, 0x00, 0x83, 0x00, 0x42, 0xaf, + 0x00, 0x83, 0x01, 0x21, 0x98, 0x00, 0x83, 0x02, + 0x0e, 0xdc, 0x00, 0x83, 0x03, 0x18, 0xc2, 0x00, + 0x83, 0x04, 0x05, 0x58, 0x00, 0x83, 0x05, 0x05, + 0xdb, 0x00, 0x83, 0x06, 0x18, 0xc6, 0x00, 0x83, + 0x07, 0x48, 0x32, 0x00, 0x83, 0x08, 0x48, 0x33, + 0x00, 0x83, 0x09, 0x18, 0xc8, 0x00, 0x83, 0x0a, + 0x57, 0x26, 0x00, 0x83, 0x0b, 0x57, 0x27, 0x00, + 0x83, 0x0c, 0x48, 0x34, 0x00, 0x83, 0x0e, 0x07, + 0x2a, 0x00, 0x83, 0x16, 0x18, 0xcc, 0x00, 0x83, + 0x17, 0x18, 0xd5, 0x00, 0x83, 0x18, 0x18, 0xd6, + 0x00, 0x83, 0x1b, 0x48, 0x36, 0x00, 0x83, 0x1c, + 0x04, 0x6f, 0x00, 0x83, 0x1d, 0x48, 0x37, 0x00, + 0x83, 0x1e, 0x57, 0x28, 0x00, 0x83, 0x1f, 0x57, + 0x29, 0x00, 0x83, 0x21, 0x57, 0x2a, 0x00, 0x83, + 0x22, 0x42, 0xb0, 0x00, 0x83, 0x23, 0x18, 0xdd, + 0x00, 0x83, 0x28, 0x04, 0xb5, 0x00, 0x83, 0x2b, + 0x18, 0xd4, 0x00, 0x83, 0x2c, 0x57, 0x2b, 0x00, + 0x83, 0x2d, 0x42, 0xb1, 0x00, 0x83, 0x2e, 0x57, + 0x2c, 0x00, 0x83, 0x2f, 0x18, 0xd3, 0x00, 0x83, + 0x30, 0x48, 0x38, 0x00, 0x83, 0x31, 0x18, 0xce, + 0x00, 0x83, 0x32, 0x18, 0xcd, 0x00, 0x83, 0x33, + 0x57, 0x2d, 0x00, 0x83, 0x34, 0x18, 0xcb, 0x00, + 0x83, 0x35, 0x18, 0xca, 0x00, 0x83, 0x36, 0x0b, + 0xa1, 0x00, 0x83, 0x37, 0x57, 0x2e, 0x00, 0x83, + 0x38, 0x0b, 0x5b, 0x00, 0x83, 0x39, 0x18, 0xd0, + 0x00, 0x83, 0x3a, 0x42, 0xb2, 0x00, 0x83, 0x3c, + 0x48, 0x39, 0x00, 0x83, 0x3d, 0x57, 0x2f, 0x00, + 0x83, 0x40, 0x18, 0xcf, 0x00, 0x83, 0x42, 0x57, + 0x30, 0x00, 0x83, 0x43, 0x3a, 0xc9, 0x00, 0x83, + 0x44, 0x48, 0x3a, 0x00, 0x83, 0x45, 0x18, 0xd2, + 0x00, 0x83, 0x46, 0x1d, 0xf8, 0x00, 0x83, 0x47, + 0x42, 0xb3, 0x00, 0x83, 0x49, 0x0a, 0xf2, 0x00, + 0x83, 0x4a, 0x07, 0x2b, 0x00, 0x83, 0x4d, 0x57, + 0x31, 0x00, 0x83, 0x4e, 0x57, 0x32, 0x00, 0x83, + 0x4f, 0x04, 0xe3, 0x00, 0x83, 0x50, 0x18, 0xd1, + 0x00, 0x83, 0x51, 0x3a, 0xca, 0x00, 0x83, 0x52, + 0x07, 0xe5, 0x00, 0x83, 0x53, 0x57, 0x3c, 0x00, + 0x83, 0x54, 0x48, 0x35, 0x00, 0x83, 0x55, 0x3a, + 0xcb, 0x00, 0x83, 0x56, 0x4d, 0x1b, 0x00, 0x83, + 0x57, 0x48, 0x3b, 0x00, 0x83, 0x58, 0x0a, 0xf3, + 0x00, 0x83, 0x5a, 0x37, 0x7a, 0x00, 0x83, 0x62, + 0x21, 0x99, 0x00, 0x83, 0x63, 0x45, 0x6f, 0x00, + 0x83, 0x70, 0x57, 0x33, 0x00, 0x83, 0x73, 0x18, + 0xe3, 0x00, 0x83, 0x75, 0x18, 0xe4, 0x00, 0x83, + 0x77, 0x05, 0x59, 0x00, 0x83, 0x78, 0x4d, 0x1c, + 0x00, 0x83, 0x7b, 0x05, 0x2e, 0x00, 0x83, 0x7c, + 0x18, 0xe1, 0x00, 0x83, 0x7d, 0x42, 0xb4, 0x00, + 0x83, 0x7f, 0x21, 0x9a, 0x00, 0x83, 0x80, 0x57, + 0x34, 0x00, 0x83, 0x82, 0x57, 0x35, 0x00, 0x83, + 0x84, 0x57, 0x36, 0x00, 0x83, 0x85, 0x18, 0xd7, + 0x00, 0x83, 0x86, 0x3a, 0xcc, 0x00, 0x83, 0x87, + 0x18, 0xdf, 0x00, 0x83, 0x89, 0x18, 0xe6, 0x00, + 0x83, 0x8a, 0x18, 0xe0, 0x00, 0x83, 0x8d, 0x3a, + 0xcd, 0x00, 0x83, 0x8e, 0x18, 0xde, 0x00, 0x83, + 0x92, 0x3a, 0xce, 0x00, 0x83, 0x93, 0x18, 0xc1, + 0x00, 0x83, 0x94, 0x48, 0x3f, 0x00, 0x83, 0x95, + 0x48, 0x40, 0x00, 0x83, 0x96, 0x18, 0xdc, 0x00, + 0x83, 0x98, 0x3a, 0xcf, 0x00, 0x83, 0x99, 0x57, + 0x37, 0x00, 0x83, 0x9a, 0x18, 0xd8, 0x00, 0x83, + 0x9b, 0x48, 0x41, 0x00, 0x83, 0x9c, 0x57, 0x38, + 0x00, 0x83, 0x9d, 0x48, 0x42, 0x00, 0x83, 0x9e, + 0x06, 0x0c, 0x00, 0x83, 0x9f, 0x18, 0xda, 0x00, + 0x83, 0xa0, 0x18, 0xe5, 0x00, 0x83, 0xa2, 0x18, + 0xdb, 0x00, 0x83, 0xa6, 0x57, 0x39, 0x00, 0x83, + 0xa7, 0x42, 0xb5, 0x00, 0x83, 0xa8, 0x18, 0xe7, + 0x00, 0x83, 0xa9, 0x3a, 0xd0, 0x00, 0x83, 0xaa, + 0x18, 0xd9, 0x00, 0x83, 0xab, 0x0d, 0x32, 0x00, + 0x83, 0xac, 0x57, 0x3a, 0x00, 0x83, 0xad, 0x57, + 0x3f, 0x00, 0x83, 0xb1, 0x0f, 0x53, 0x00, 0x83, + 0xb5, 0x18, 0xe2, 0x00, 0x83, 0xbd, 0x18, 0xf8, + 0x00, 0x83, 0xbe, 0x57, 0x3b, 0x00, 0x83, 0xbf, + 0x3a, 0xd1, 0x00, 0x83, 0xc0, 0x3a, 0xd2, 0x00, + 0x83, 0xc1, 0x18, 0xf0, 0x00, 0x83, 0xc5, 0x0a, + 0x41, 0x00, 0x83, 0xc7, 0x21, 0x9b, 0x00, 0x83, + 0xc9, 0x48, 0x43, 0x00, 0x83, 0xca, 0x06, 0x60, + 0x00, 0x83, 0xcc, 0x06, 0xd5, 0x00, 0x83, 0xce, + 0x18, 0xeb, 0x00, 0x83, 0xcf, 0x42, 0xb6, 0x00, + 0x83, 0xd0, 0x48, 0x44, 0x00, 0x83, 0xd1, 0x42, + 0xb7, 0x00, 0x83, 0xd3, 0x05, 0x5b, 0x00, 0x83, + 0xd4, 0x48, 0x45, 0x00, 0x83, 0xd6, 0x09, 0xbc, + 0x00, 0x83, 0xd8, 0x18, 0xee, 0x00, 0x83, 0xdc, + 0x08, 0x4a, 0x00, 0x83, 0xdd, 0x48, 0x46, 0x00, + 0x83, 0xdf, 0x0c, 0x4b, 0x00, 0x83, 0xe0, 0x18, + 0xf3, 0x00, 0x83, 0xe1, 0x42, 0xb8, 0x00, 0x83, + 0xe5, 0x48, 0x47, 0x00, 0x83, 0xe8, 0x57, 0x3d, + 0x00, 0x83, 0xe9, 0x0e, 0x3e, 0x00, 0x83, 0xea, + 0x3a, 0xd3, 0x00, 0x83, 0xeb, 0x18, 0xea, 0x00, + 0x83, 0xef, 0x05, 0x5a, 0x00, 0x83, 0xf0, 0x07, + 0x8a, 0x00, 0x83, 0xf1, 0x0d, 0x9b, 0x00, 0x83, + 0xf2, 0x18, 0xf4, 0x00, 0x83, 0xf4, 0x18, 0xe8, + 0x00, 0x83, 0xf6, 0x21, 0x9c, 0x00, 0x83, 0xf7, + 0x18, 0xf1, 0x00, 0x83, 0xf8, 0x4d, 0x1d, 0x00, + 0x83, 0xf9, 0x48, 0x48, 0x00, 0x83, 0xfb, 0x18, + 0xfb, 0x00, 0x83, 0xfc, 0x4d, 0x1e, 0x00, 0x83, + 0xfd, 0x18, 0xec, 0x00, 0x84, 0x01, 0x42, 0xb9, + 0x00, 0x84, 0x03, 0x18, 0xed, 0x00, 0x84, 0x04, + 0x0c, 0x92, 0x00, 0x84, 0x06, 0x42, 0xba, 0x00, + 0x84, 0x07, 0x18, 0xf2, 0x00, 0x84, 0x0a, 0x1e, + 0x7f, 0x00, 0x84, 0x0b, 0x18, 0xef, 0x00, 0x84, + 0x0c, 0x0e, 0x56, 0x00, 0x84, 0x0d, 0x18, 0xf5, + 0x00, 0x84, 0x0e, 0x04, 0xa4, 0x00, 0x84, 0x0f, + 0x3a, 0xd4, 0x00, 0x84, 0x11, 0x3a, 0xd5, 0x00, + 0x84, 0x13, 0x18, 0xe9, 0x00, 0x84, 0x15, 0x48, + 0x49, 0x00, 0x84, 0x17, 0x48, 0x4b, 0x00, 0x84, + 0x19, 0x57, 0x3e, 0x00, 0x84, 0x20, 0x18, 0xf7, + 0x00, 0x84, 0x22, 0x18, 0xf6, 0x00, 0x84, 0x29, + 0x0d, 0x21, 0x00, 0x84, 0x2a, 0x18, 0xfd, 0x00, + 0x84, 0x2c, 0x19, 0x08, 0x00, 0x84, 0x2f, 0x57, + 0x40, 0x00, 0x84, 0x31, 0x05, 0xdc, 0x00, 0x84, + 0x35, 0x19, 0x0b, 0x00, 0x84, 0x38, 0x18, 0xf9, + 0x00, 0x84, 0x39, 0x48, 0x4c, 0x00, 0x84, 0x3c, + 0x18, 0xfe, 0x00, 0x84, 0x3d, 0x0f, 0x58, 0x00, + 0x84, 0x45, 0x57, 0x41, 0x00, 0x84, 0x46, 0x19, + 0x07, 0x00, 0x84, 0x47, 0x57, 0x42, 0x00, 0x84, + 0x48, 0x21, 0x9d, 0x00, 0x84, 0x49, 0x0f, 0x3f, + 0x00, 0x84, 0x4a, 0x3a, 0xd6, 0x00, 0x84, 0x4d, + 0x57, 0x43, 0x00, 0x84, 0x4e, 0x0f, 0x72, 0x00, + 0x84, 0x4f, 0x48, 0x4d, 0x00, 0x84, 0x51, 0x48, + 0x4e, 0x00, 0x84, 0x52, 0x48, 0x4f, 0x00, 0x84, + 0x56, 0x57, 0x44, 0x00, 0x84, 0x57, 0x0b, 0xb6, + 0x00, 0x84, 0x58, 0x4d, 0x1f, 0x00, 0x84, 0x59, + 0x48, 0x50, 0x00, 0x84, 0x5a, 0x48, 0x51, 0x00, + 0x84, 0x5b, 0x05, 0xc9, 0x00, 0x84, 0x5c, 0x48, + 0x52, 0x00, 0x84, 0x5f, 0x42, 0xbb, 0x00, 0x84, + 0x60, 0x57, 0x46, 0x00, 0x84, 0x61, 0x0d, 0xe4, + 0x00, 0x84, 0x62, 0x19, 0x0d, 0x00, 0x84, 0x63, + 0x0c, 0x79, 0x00, 0x84, 0x64, 0x57, 0x47, 0x00, + 0x84, 0x65, 0x48, 0x54, 0x00, 0x84, 0x66, 0x04, + 0x75, 0x00, 0x84, 0x67, 0x57, 0x48, 0x00, 0x84, + 0x69, 0x19, 0x06, 0x00, 0x84, 0x6a, 0x57, 0x49, + 0x00, 0x84, 0x6b, 0x19, 0x02, 0x00, 0x84, 0x6c, + 0x0a, 0xf4, 0x00, 0x84, 0x6d, 0x18, 0xfc, 0x00, + 0x84, 0x6e, 0x19, 0x04, 0x00, 0x84, 0x6f, 0x19, + 0x09, 0x00, 0x84, 0x70, 0x42, 0xbc, 0x00, 0x84, + 0x71, 0x0c, 0xe2, 0x00, 0x84, 0x73, 0x42, 0xbd, + 0x00, 0x84, 0x74, 0x57, 0x4a, 0x00, 0x84, 0x75, + 0x04, 0x6e, 0x00, 0x84, 0x76, 0x3a, 0xd7, 0x00, + 0x84, 0x77, 0x19, 0x01, 0x00, 0x84, 0x78, 0x48, + 0x55, 0x00, 0x84, 0x79, 0x19, 0x0a, 0x00, 0x84, + 0x7a, 0x0d, 0xea, 0x00, 0x84, 0x7c, 0x48, 0x56, + 0x00, 0x84, 0x7d, 0x57, 0x4b, 0x00, 0x84, 0x81, + 0x48, 0x57, 0x00, 0x84, 0x82, 0x19, 0x05, 0x00, + 0x84, 0x84, 0x19, 0x00, 0x00, 0x84, 0x85, 0x42, + 0xbe, 0x00, 0x84, 0x8b, 0x09, 0xbd, 0x00, 0x84, + 0x90, 0x09, 0x39, 0x00, 0x84, 0x92, 0x57, 0x4c, + 0x00, 0x84, 0x93, 0x4d, 0x20, 0x00, 0x84, 0x94, + 0x08, 0xd8, 0x00, 0x84, 0x95, 0x57, 0x4d, 0x00, + 0x84, 0x97, 0x48, 0x59, 0x00, 0x84, 0x99, 0x0e, + 0xe4, 0x00, 0x84, 0x9c, 0x0d, 0xb9, 0x00, 0x84, + 0x9e, 0x42, 0xbf, 0x00, 0x84, 0x9f, 0x19, 0x10, + 0x00, 0x84, 0xa1, 0x19, 0x19, 0x00, 0x84, 0xa6, + 0x48, 0x5a, 0x00, 0x84, 0xa8, 0x3a, 0xd8, 0x00, + 0x84, 0xa9, 0x57, 0x4e, 0x00, 0x84, 0xaa, 0x57, + 0x4f, 0x00, 0x84, 0xad, 0x19, 0x03, 0x00, 0x84, + 0xaf, 0x3a, 0xd9, 0x00, 0x84, 0xb1, 0x4d, 0x21, + 0x00, 0x84, 0xb2, 0x05, 0xd5, 0x00, 0x84, 0xb4, + 0x21, 0x9e, 0x00, 0x84, 0xb8, 0x09, 0xe0, 0x00, + 0x84, 0xb9, 0x19, 0x0e, 0x00, 0x84, 0xba, 0x42, + 0xc0, 0x00, 0x84, 0xbb, 0x19, 0x13, 0x00, 0x84, + 0xbc, 0x0a, 0xf5, 0x00, 0x84, 0xbd, 0x4d, 0x22, + 0x00, 0x84, 0xbe, 0x48, 0x5b, 0x00, 0x84, 0xbf, + 0x19, 0x0f, 0x00, 0x84, 0xc0, 0x3a, 0xda, 0x00, + 0x84, 0xc1, 0x19, 0x16, 0x00, 0x84, 0xc2, 0x3a, + 0xdb, 0x00, 0x84, 0xc4, 0x0b, 0x9d, 0x00, 0x84, + 0xc6, 0x19, 0x17, 0x00, 0x84, 0xc7, 0x57, 0x50, + 0x00, 0x84, 0xc8, 0x57, 0x51, 0x00, 0x84, 0xc9, + 0x0f, 0x40, 0x00, 0x84, 0xca, 0x19, 0x0c, 0x00, + 0x84, 0xcb, 0x05, 0x96, 0x00, 0x84, 0xcc, 0x57, + 0x52, 0x00, 0x84, 0xcd, 0x19, 0x12, 0x00, 0x84, + 0xce, 0x48, 0x5d, 0x00, 0x84, 0xcf, 0x48, 0x5e, + 0x00, 0x84, 0xd0, 0x19, 0x15, 0x00, 0x84, 0xd1, + 0x0e, 0xb8, 0x00, 0x84, 0xd3, 0x48, 0x5f, 0x00, + 0x84, 0xd6, 0x19, 0x18, 0x00, 0x84, 0xd9, 0x19, + 0x11, 0x00, 0x84, 0xda, 0x19, 0x14, 0x00, 0x84, + 0xdc, 0x20, 0xab, 0x00, 0x84, 0xe7, 0x48, 0x61, + 0x00, 0x84, 0xea, 0x48, 0x62, 0x00, 0x84, 0xec, + 0x0e, 0x57, 0x00, 0x84, 0xee, 0x1e, 0x83, 0x00, + 0x84, 0xef, 0x48, 0x63, 0x00, 0x84, 0xf0, 0x3a, + 0xdc, 0x00, 0x84, 0xf1, 0x48, 0x64, 0x00, 0x84, + 0xf2, 0x57, 0x53, 0x00, 0x84, 0xf4, 0x19, 0x1c, + 0x00, 0x84, 0xf7, 0x57, 0x54, 0x00, 0x84, 0xfa, + 0x48, 0x65, 0x00, 0x84, 0xfb, 0x4d, 0x23, 0x00, + 0x84, 0xfc, 0x19, 0x23, 0x00, 0x84, 0xfd, 0x3a, + 0xdd, 0x00, 0x84, 0xff, 0x19, 0x1b, 0x00, 0x85, + 0x00, 0x08, 0xef, 0x00, 0x85, 0x02, 0x57, 0x55, + 0x00, 0x85, 0x03, 0x57, 0x56, 0x00, 0x85, 0x06, + 0x18, 0xfa, 0x00, 0x85, 0x07, 0x57, 0x57, 0x00, + 0x85, 0x0c, 0x3a, 0xde, 0x00, 0x85, 0x0e, 0x57, + 0x58, 0x00, 0x85, 0x10, 0x57, 0x59, 0x00, 0x85, + 0x11, 0x0e, 0x1e, 0x00, 0x85, 0x13, 0x0e, 0xae, + 0x00, 0x85, 0x14, 0x19, 0x22, 0x00, 0x85, 0x15, + 0x19, 0x21, 0x00, 0x85, 0x17, 0x19, 0x1d, 0x00, + 0x85, 0x18, 0x19, 0x1e, 0x00, 0x85, 0x1a, 0x04, + 0xd8, 0x00, 0x85, 0x1b, 0x48, 0x66, 0x00, 0x85, + 0x1c, 0x57, 0x5a, 0x00, 0x85, 0x1e, 0x42, 0xc3, + 0x00, 0x85, 0x1f, 0x19, 0x20, 0x00, 0x85, 0x21, + 0x19, 0x1a, 0x00, 0x85, 0x22, 0x57, 0x5b, 0x00, + 0x85, 0x23, 0x1e, 0x1a, 0x00, 0x85, 0x24, 0x48, + 0x67, 0x00, 0x85, 0x25, 0x48, 0x68, 0x00, 0x85, + 0x26, 0x0b, 0xf1, 0x00, 0x85, 0x27, 0x57, 0x5c, + 0x00, 0x85, 0x2a, 0x57, 0x5d, 0x00, 0x85, 0x2b, + 0x48, 0x69, 0x00, 0x85, 0x2c, 0x19, 0x1f, 0x00, + 0x85, 0x2d, 0x04, 0xc2, 0x00, 0x85, 0x2f, 0x42, + 0xc4, 0x00, 0x85, 0x32, 0x42, 0xc2, 0x00, 0x85, + 0x33, 0x57, 0x5e, 0x00, 0x85, 0x34, 0x3a, 0xdf, + 0x00, 0x85, 0x35, 0x0b, 0x02, 0x00, 0x85, 0x36, + 0x57, 0x5f, 0x00, 0x85, 0x3d, 0x0e, 0x13, 0x00, + 0x85, 0x3e, 0x1e, 0xb5, 0x00, 0x85, 0x3f, 0x57, + 0x60, 0x00, 0x85, 0x40, 0x19, 0x24, 0x00, 0x85, + 0x41, 0x19, 0x28, 0x00, 0x85, 0x43, 0x0d, 0x6d, + 0x00, 0x85, 0x46, 0x4d, 0x24, 0x00, 0x85, 0x48, + 0x19, 0x27, 0x00, 0x85, 0x49, 0x09, 0xbe, 0x00, + 0x85, 0x4a, 0x08, 0xf5, 0x00, 0x85, 0x4b, 0x19, + 0x2a, 0x00, 0x85, 0x4e, 0x06, 0xb6, 0x00, 0x85, + 0x4f, 0x48, 0x6a, 0x00, 0x85, 0x50, 0x57, 0x61, + 0x00, 0x85, 0x51, 0x48, 0x6d, 0x00, 0x85, 0x52, + 0x57, 0x62, 0x00, 0x85, 0x53, 0x21, 0x9f, 0x00, + 0x85, 0x55, 0x19, 0x2b, 0x00, 0x85, 0x56, 0x4d, + 0x25, 0x00, 0x85, 0x57, 0x0d, 0xeb, 0x00, 0x85, + 0x58, 0x19, 0x26, 0x00, 0x85, 0x59, 0x21, 0xa0, + 0x00, 0x85, 0x5a, 0x18, 0xff, 0x00, 0x85, 0x5c, + 0x57, 0x63, 0x00, 0x85, 0x5d, 0x4d, 0x26, 0x00, + 0x85, 0x5e, 0x3a, 0xe0, 0x00, 0x85, 0x5f, 0x57, + 0x65, 0x00, 0x85, 0x60, 0x57, 0x66, 0x00, 0x85, + 0x61, 0x48, 0x6e, 0x00, 0x85, 0x62, 0x48, 0x6f, + 0x00, 0x85, 0x63, 0x19, 0x25, 0x00, 0x85, 0x64, + 0x42, 0xc5, 0x00, 0x85, 0x68, 0x0f, 0xf5, 0x00, + 0x85, 0x69, 0x0c, 0x7a, 0x00, 0x85, 0x6a, 0x0d, + 0xe5, 0x00, 0x85, 0x6b, 0x21, 0xa1, 0x00, 0x85, + 0x6d, 0x19, 0x32, 0x00, 0x85, 0x6f, 0x48, 0x6b, + 0x00, 0x85, 0x77, 0x19, 0x38, 0x00, 0x85, 0x79, + 0x57, 0x67, 0x00, 0x85, 0x7a, 0x42, 0xc6, 0x00, + 0x85, 0x7b, 0x48, 0x71, 0x00, 0x85, 0x7d, 0x48, + 0x72, 0x00, 0x85, 0x7e, 0x19, 0x39, 0x00, 0x85, + 0x7f, 0x48, 0x73, 0x00, 0x85, 0x80, 0x19, 0x2c, + 0x00, 0x85, 0x81, 0x48, 0x74, 0x00, 0x85, 0x84, + 0x0d, 0x2c, 0x00, 0x85, 0x85, 0x4d, 0x27, 0x00, + 0x85, 0x86, 0x48, 0x75, 0x00, 0x85, 0x87, 0x19, + 0x36, 0x00, 0x85, 0x88, 0x19, 0x2e, 0x00, 0x85, + 0x89, 0x57, 0x68, 0x00, 0x85, 0x8a, 0x19, 0x30, + 0x00, 0x85, 0x8b, 0x57, 0x69, 0x00, 0x85, 0x8c, + 0x42, 0xc7, 0x00, 0x85, 0x8f, 0x3a, 0xe1, 0x00, + 0x85, 0x90, 0x19, 0x3a, 0x00, 0x85, 0x91, 0x19, + 0x2f, 0x00, 0x85, 0x93, 0x48, 0x76, 0x00, 0x85, + 0x94, 0x19, 0x33, 0x00, 0x85, 0x97, 0x05, 0x14, + 0x00, 0x85, 0x98, 0x4d, 0x28, 0x00, 0x85, 0x99, + 0x0c, 0xbd, 0x00, 0x85, 0x9b, 0x19, 0x34, 0x00, + 0x85, 0x9c, 0x19, 0x37, 0x00, 0x85, 0x9d, 0x48, + 0x77, 0x00, 0x85, 0x9f, 0x48, 0x78, 0x00, 0x85, + 0xa0, 0x57, 0x6a, 0x00, 0x85, 0xa2, 0x42, 0xc8, + 0x00, 0x85, 0xa4, 0x19, 0x2d, 0x00, 0x85, 0xa5, + 0x57, 0x6b, 0x00, 0x85, 0xa6, 0x0a, 0xa8, 0x00, + 0x85, 0xa7, 0x57, 0x6c, 0x00, 0x85, 0xa8, 0x19, + 0x31, 0x00, 0x85, 0xa9, 0x08, 0x75, 0x00, 0x85, + 0xaa, 0x0a, 0x0b, 0x00, 0x85, 0xab, 0x07, 0x06, + 0x00, 0x85, 0xac, 0x0f, 0x00, 0x00, 0x85, 0xad, + 0x3a, 0xe4, 0x00, 0x85, 0xae, 0x0f, 0x05, 0x00, + 0x85, 0xaf, 0x09, 0x7c, 0x00, 0x85, 0xb0, 0x21, + 0xa3, 0x00, 0x85, 0xb4, 0x57, 0x6d, 0x00, 0x85, + 0xb6, 0x57, 0x6e, 0x00, 0x85, 0xb7, 0x3a, 0xe2, + 0x00, 0x85, 0xb8, 0x57, 0x6f, 0x00, 0x85, 0xb9, + 0x19, 0x3e, 0x00, 0x85, 0xba, 0x19, 0x3c, 0x00, + 0x85, 0xbc, 0x48, 0x7c, 0x00, 0x85, 0xbd, 0x57, + 0x70, 0x00, 0x85, 0xbe, 0x57, 0x71, 0x00, 0x85, + 0xbf, 0x57, 0x72, 0x00, 0x85, 0xc1, 0x0f, 0xf4, + 0x00, 0x85, 0xc2, 0x57, 0x73, 0x00, 0x85, 0xc7, + 0x48, 0x7d, 0x00, 0x85, 0xc9, 0x19, 0x3b, 0x00, + 0x85, 0xca, 0x48, 0x7e, 0x00, 0x85, 0xcb, 0x42, + 0xc9, 0x00, 0x85, 0xcd, 0x0f, 0x5f, 0x00, 0x85, + 0xce, 0x3a, 0xe3, 0x00, 0x85, 0xcf, 0x19, 0x3d, + 0x00, 0x85, 0xd0, 0x19, 0x3f, 0x00, 0x85, 0xd5, + 0x19, 0x40, 0x00, 0x85, 0xd8, 0x48, 0x7f, 0x00, + 0x85, 0xd9, 0x48, 0x80, 0x00, 0x85, 0xda, 0x57, + 0x74, 0x00, 0x85, 0xdc, 0x19, 0x43, 0x00, 0x85, + 0xdd, 0x19, 0x41, 0x00, 0x85, 0xdf, 0x48, 0x81, + 0x00, 0x85, 0xe0, 0x57, 0x75, 0x00, 0x85, 0xe1, + 0x48, 0x82, 0x00, 0x85, 0xe4, 0x0c, 0x7b, 0x00, + 0x85, 0xe5, 0x19, 0x42, 0x00, 0x85, 0xe6, 0x48, + 0x83, 0x00, 0x85, 0xe8, 0x57, 0x76, 0x00, 0x85, + 0xe9, 0x0d, 0x61, 0x00, 0x85, 0xea, 0x19, 0x35, + 0x00, 0x85, 0xed, 0x42, 0xca, 0x00, 0x85, 0xf3, + 0x57, 0x77, 0x00, 0x85, 0xf4, 0x37, 0x80, 0x00, + 0x85, 0xf6, 0x48, 0x84, 0x00, 0x85, 0xf7, 0x09, + 0x7d, 0x00, 0x85, 0xf9, 0x19, 0x44, 0x00, 0x85, + 0xfa, 0x19, 0x49, 0x00, 0x85, 0xfb, 0x0a, 0xf6, + 0x00, 0x85, 0xfc, 0x57, 0x78, 0x00, 0x85, 0xfe, + 0x19, 0x48, 0x00, 0x85, 0xff, 0x42, 0xcb, 0x00, + 0x86, 0x00, 0x48, 0x85, 0x00, 0x86, 0x02, 0x19, + 0x29, 0x00, 0x86, 0x04, 0x42, 0xcc, 0x00, 0x86, + 0x05, 0x42, 0xcd, 0x00, 0x86, 0x06, 0x19, 0x4a, + 0x00, 0x86, 0x07, 0x0a, 0xcb, 0x00, 0x86, 0x0a, + 0x19, 0x45, 0x00, 0x86, 0x0b, 0x19, 0x47, 0x00, + 0x86, 0x0d, 0x57, 0x79, 0x00, 0x86, 0x0e, 0x57, + 0x7a, 0x00, 0x86, 0x10, 0x42, 0xce, 0x00, 0x86, + 0x11, 0x48, 0x86, 0x00, 0x86, 0x12, 0x3a, 0xe5, + 0x00, 0x86, 0x13, 0x19, 0x46, 0x00, 0x86, 0x16, + 0x14, 0xd0, 0x00, 0x86, 0x17, 0x14, 0xc1, 0x00, + 0x86, 0x18, 0x42, 0xd0, 0x00, 0x86, 0x19, 0x57, + 0x7b, 0x00, 0x86, 0x1a, 0x19, 0x4c, 0x00, 0x86, + 0x1b, 0x57, 0x7c, 0x00, 0x86, 0x1e, 0x48, 0x87, + 0x00, 0x86, 0x21, 0x48, 0x88, 0x00, 0x86, 0x22, + 0x19, 0x4b, 0x00, 0x86, 0x24, 0x48, 0x89, 0x00, + 0x86, 0x27, 0x48, 0x8a, 0x00, 0x86, 0x29, 0x3a, + 0xe6, 0x00, 0x86, 0x2d, 0x0f, 0x60, 0x00, 0x86, + 0x2f, 0x16, 0xb1, 0x00, 0x86, 0x30, 0x19, 0x4d, + 0x00, 0x86, 0x36, 0x57, 0x7d, 0x00, 0x86, 0x38, + 0x42, 0xd1, 0x00, 0x86, 0x39, 0x48, 0x8c, 0x00, + 0x86, 0x3a, 0x57, 0x7e, 0x00, 0x86, 0x3c, 0x48, + 0x8d, 0x00, 0x86, 0x3d, 0x57, 0x7f, 0x00, 0x86, + 0x3f, 0x19, 0x4e, 0x00, 0x86, 0x40, 0x48, 0x8f, + 0x00, 0x86, 0x41, 0x41, 0xb8, 0x00, 0x86, 0x42, + 0x4d, 0x29, 0x00, 0x86, 0x46, 0x4d, 0x2a, 0x00, + 0x86, 0x4d, 0x19, 0x4f, 0x00, 0x86, 0x4e, 0x07, + 0x8b, 0x00, 0x86, 0x50, 0x06, 0x6e, 0x00, 0x86, + 0x52, 0x3a, 0xe7, 0x00, 0x86, 0x53, 0x48, 0x90, + 0x00, 0x86, 0x54, 0x19, 0x51, 0x00, 0x86, 0x55, + 0x10, 0x94, 0x00, 0x86, 0x56, 0x48, 0x91, 0x00, + 0x86, 0x57, 0x42, 0xd2, 0x00, 0x86, 0x58, 0x57, + 0x80, 0x00, 0x86, 0x59, 0x57, 0x81, 0x00, 0x86, + 0x5a, 0x06, 0x8f, 0x00, 0x86, 0x5b, 0x34, 0x18, + 0x00, 0x86, 0x5c, 0x34, 0x52, 0x00, 0x86, 0x5d, + 0x57, 0x82, 0x00, 0x86, 0x5e, 0x06, 0xeb, 0x00, + 0x86, 0x5f, 0x19, 0x52, 0x00, 0x86, 0x60, 0x57, + 0x83, 0x00, 0x86, 0x61, 0x57, 0x84, 0x00, 0x86, + 0x62, 0x42, 0xd3, 0x00, 0x86, 0x63, 0x3a, 0xe8, + 0x00, 0x86, 0x64, 0x57, 0x85, 0x00, 0x86, 0x67, + 0x19, 0x53, 0x00, 0x86, 0x69, 0x57, 0x86, 0x00, + 0x86, 0x6b, 0x0b, 0xac, 0x00, 0x86, 0x6c, 0x3a, + 0xe9, 0x00, 0x86, 0x6f, 0x3a, 0xea, 0x00, 0x86, + 0x71, 0x19, 0x54, 0x00, 0x86, 0x75, 0x42, 0xd5, + 0x00, 0x86, 0x76, 0x57, 0x87, 0x00, 0x86, 0x77, + 0x48, 0x92, 0x00, 0x86, 0x79, 0x0c, 0xd2, 0x00, + 0x86, 0x7a, 0x3a, 0xeb, 0x00, 0x86, 0x7b, 0x04, + 0x7e, 0x00, 0x86, 0x7d, 0x37, 0x86, 0x00, 0x86, + 0x87, 0x48, 0x93, 0x00, 0x86, 0x88, 0x57, 0x99, + 0x00, 0x86, 0x89, 0x48, 0x94, 0x00, 0x86, 0x8a, + 0x05, 0x63, 0x00, 0x86, 0x8b, 0x19, 0x59, 0x00, + 0x86, 0x8c, 0x19, 0x5a, 0x00, 0x86, 0x8d, 0x3a, + 0xec, 0x00, 0x86, 0x91, 0x3a, 0xed, 0x00, 0x86, + 0x93, 0x19, 0x55, 0x00, 0x86, 0x95, 0x08, 0x8b, + 0x00, 0x86, 0x96, 0x57, 0x88, 0x00, 0x86, 0x98, + 0x3a, 0xee, 0x00, 0x86, 0x9a, 0x57, 0x89, 0x00, + 0x86, 0x9c, 0x48, 0x95, 0x00, 0x86, 0x9d, 0x48, + 0x96, 0x00, 0x86, 0xa1, 0x57, 0x8a, 0x00, 0x86, + 0xa3, 0x19, 0x56, 0x00, 0x86, 0xa4, 0x0c, 0xf8, + 0x00, 0x86, 0xa6, 0x57, 0x8b, 0x00, 0x86, 0xa7, + 0x3a, 0xef, 0x00, 0x86, 0xa8, 0x3a, 0xf0, 0x00, + 0x86, 0xa9, 0x19, 0x57, 0x00, 0x86, 0xaa, 0x19, + 0x58, 0x00, 0x86, 0xab, 0x19, 0x62, 0x00, 0x86, + 0xad, 0x57, 0x8c, 0x00, 0x86, 0xaf, 0x19, 0x5c, + 0x00, 0x86, 0xb0, 0x19, 0x5f, 0x00, 0x86, 0xb1, + 0x48, 0x97, 0x00, 0x86, 0xb3, 0x48, 0x98, 0x00, + 0x86, 0xb4, 0x57, 0x8d, 0x00, 0x86, 0xb5, 0x57, + 0x8e, 0x00, 0x86, 0xb6, 0x19, 0x5b, 0x00, 0x86, + 0xb7, 0x57, 0x8f, 0x00, 0x86, 0xb8, 0x42, 0xd6, + 0x00, 0x86, 0xb9, 0x57, 0x90, 0x00, 0x86, 0xbf, + 0x57, 0x91, 0x00, 0x86, 0xc0, 0x4d, 0x2b, 0x00, + 0x86, 0xc1, 0x48, 0x99, 0x00, 0x86, 0xc3, 0x48, + 0x9a, 0x00, 0x86, 0xc4, 0x19, 0x5d, 0x00, 0x86, + 0xc5, 0x57, 0x92, 0x00, 0x86, 0xc6, 0x19, 0x5e, + 0x00, 0x86, 0xc7, 0x09, 0x04, 0x00, 0x86, 0xc9, + 0x19, 0x60, 0x00, 0x86, 0xcb, 0x0b, 0x7f, 0x00, + 0x86, 0xcd, 0x07, 0x2c, 0x00, 0x86, 0xce, 0x05, + 0xa0, 0x00, 0x86, 0xd1, 0x48, 0x9b, 0x00, 0x86, + 0xd2, 0x57, 0x93, 0x00, 0x86, 0xd4, 0x19, 0x63, + 0x00, 0x86, 0xd5, 0x48, 0x9c, 0x00, 0x86, 0xd7, + 0x48, 0x9d, 0x00, 0x86, 0xd9, 0x05, 0x9d, 0x00, + 0x86, 0xda, 0x57, 0x94, 0x00, 0x86, 0xdb, 0x19, + 0x68, 0x00, 0x86, 0xdc, 0x57, 0x95, 0x00, 0x86, + 0xde, 0x19, 0x64, 0x00, 0x86, 0xdf, 0x19, 0x67, + 0x00, 0x86, 0xe0, 0x57, 0x96, 0x00, 0x86, 0xe3, + 0x48, 0x9e, 0x00, 0x86, 0xe4, 0x0d, 0x4e, 0x00, + 0x86, 0xe5, 0x57, 0x97, 0x00, 0x86, 0xe6, 0x48, + 0x9f, 0x00, 0x86, 0xe7, 0x57, 0x98, 0x00, 0x86, + 0xe9, 0x19, 0x65, 0x00, 0x86, 0xec, 0x19, 0x66, + 0x00, 0x86, 0xed, 0x0d, 0xba, 0x00, 0x86, 0xee, + 0x0d, 0x6e, 0x00, 0x86, 0xef, 0x19, 0x69, 0x00, + 0x86, 0xf8, 0x0b, 0x5d, 0x00, 0x86, 0xf9, 0x19, + 0x73, 0x00, 0x86, 0xfa, 0x3a, 0xf1, 0x00, 0x86, + 0xfb, 0x19, 0x6f, 0x00, 0x86, 0xfc, 0x42, 0xd7, + 0x00, 0x86, 0xfd, 0x3a, 0xf2, 0x00, 0x86, 0xfe, + 0x05, 0x6b, 0x00, 0x87, 0x00, 0x19, 0x6d, 0x00, + 0x87, 0x02, 0x0e, 0x58, 0x00, 0x87, 0x03, 0x19, + 0x6e, 0x00, 0x87, 0x04, 0x57, 0x9a, 0x00, 0x87, + 0x05, 0x48, 0xa1, 0x00, 0x87, 0x06, 0x19, 0x6b, + 0x00, 0x87, 0x07, 0x48, 0xa2, 0x00, 0x87, 0x08, + 0x19, 0x6c, 0x00, 0x87, 0x09, 0x19, 0x71, 0x00, + 0x87, 0x0a, 0x19, 0x74, 0x00, 0x87, 0x0b, 0x3a, + 0xf3, 0x00, 0x87, 0x0d, 0x19, 0x72, 0x00, 0x87, + 0x0e, 0x48, 0xa3, 0x00, 0x87, 0x0f, 0x57, 0x9b, + 0x00, 0x87, 0x10, 0x48, 0xa4, 0x00, 0x87, 0x11, + 0x19, 0x70, 0x00, 0x87, 0x12, 0x19, 0x6a, 0x00, + 0x87, 0x13, 0x3a, 0xf4, 0x00, 0x87, 0x14, 0x4d, + 0x2c, 0x00, 0x87, 0x18, 0x0b, 0x96, 0x00, 0x87, + 0x19, 0x3a, 0xf5, 0x00, 0x87, 0x1a, 0x19, 0x7b, + 0x00, 0x87, 0x1c, 0x0e, 0xb6, 0x00, 0x87, 0x1e, + 0x3a, 0xf6, 0x00, 0x87, 0x1f, 0x48, 0xa5, 0x00, + 0x87, 0x21, 0x48, 0xa6, 0x00, 0x87, 0x22, 0x4d, + 0x2d, 0x00, 0x87, 0x23, 0x48, 0xa7, 0x00, 0x87, + 0x25, 0x19, 0x79, 0x00, 0x87, 0x28, 0x3a, 0xf7, + 0x00, 0x87, 0x29, 0x19, 0x7a, 0x00, 0x87, 0x2e, + 0x4d, 0x2e, 0x00, 0x87, 0x2f, 0x57, 0x9c, 0x00, + 0x87, 0x31, 0x48, 0xa8, 0x00, 0x87, 0x32, 0x57, + 0x9d, 0x00, 0x87, 0x34, 0x19, 0x75, 0x00, 0x87, + 0x37, 0x19, 0x77, 0x00, 0x87, 0x39, 0x4d, 0x2f, + 0x00, 0x87, 0x3a, 0x48, 0xa9, 0x00, 0x87, 0x3b, + 0x19, 0x78, 0x00, 0x87, 0x3c, 0x57, 0x9e, 0x00, + 0x87, 0x3d, 0x57, 0x9f, 0x00, 0x87, 0x3e, 0x3a, + 0xf8, 0x00, 0x87, 0x3f, 0x19, 0x76, 0x00, 0x87, + 0x40, 0x48, 0xaa, 0x00, 0x87, 0x43, 0x48, 0xab, + 0x00, 0x87, 0x45, 0x57, 0xa0, 0x00, 0x87, 0x49, + 0x0a, 0x8a, 0x00, 0x87, 0x4b, 0x0f, 0xdf, 0x00, + 0x87, 0x4c, 0x19, 0x7f, 0x00, 0x87, 0x4d, 0x57, + 0xa1, 0x00, 0x87, 0x4e, 0x19, 0x80, 0x00, 0x87, + 0x51, 0x48, 0xac, 0x00, 0x87, 0x53, 0x19, 0x86, + 0x00, 0x87, 0x55, 0x09, 0xf0, 0x00, 0x87, 0x57, + 0x19, 0x82, 0x00, 0x87, 0x58, 0x48, 0xad, 0x00, + 0x87, 0x59, 0x19, 0x85, 0x00, 0x87, 0x5d, 0x4d, + 0x30, 0x00, 0x87, 0x5f, 0x19, 0x7d, 0x00, 0x87, + 0x60, 0x19, 0x7c, 0x00, 0x87, 0x61, 0x57, 0xa2, + 0x00, 0x87, 0x63, 0x19, 0x87, 0x00, 0x87, 0x64, + 0x48, 0xae, 0x00, 0x87, 0x65, 0x48, 0xaf, 0x00, + 0x87, 0x66, 0x05, 0x5c, 0x00, 0x87, 0x68, 0x19, + 0x83, 0x00, 0x87, 0x6a, 0x19, 0x88, 0x00, 0x87, + 0x6e, 0x19, 0x84, 0x00, 0x87, 0x6f, 0x57, 0xa3, + 0x00, 0x87, 0x71, 0x3a, 0xf9, 0x00, 0x87, 0x72, + 0x48, 0xb0, 0x00, 0x87, 0x74, 0x19, 0x81, 0x00, + 0x87, 0x76, 0x0b, 0xcf, 0x00, 0x87, 0x78, 0x19, + 0x7e, 0x00, 0x87, 0x7b, 0x4d, 0x31, 0x00, 0x87, + 0x7c, 0x48, 0xb1, 0x00, 0x87, 0x7f, 0x0d, 0x1e, + 0x00, 0x87, 0x82, 0x19, 0x8c, 0x00, 0x87, 0x83, + 0x57, 0xa4, 0x00, 0x87, 0x84, 0x57, 0xa5, 0x00, + 0x87, 0x85, 0x57, 0xa6, 0x00, 0x87, 0x86, 0x57, + 0xa7, 0x00, 0x87, 0x87, 0x42, 0xd8, 0x00, 0x87, + 0x88, 0x3a, 0xfa, 0x00, 0x87, 0x89, 0x48, 0xb5, + 0x00, 0x87, 0x8b, 0x48, 0xb6, 0x00, 0x87, 0x8c, + 0x4d, 0x32, 0x00, 0x87, 0x8d, 0x0f, 0x25, 0x00, + 0x87, 0x8e, 0x4d, 0x33, 0x00, 0x87, 0x90, 0x57, + 0xa8, 0x00, 0x87, 0x93, 0x48, 0xb7, 0x00, 0x87, + 0x95, 0x57, 0xa9, 0x00, 0x87, 0x97, 0x4d, 0x34, + 0x00, 0x87, 0x98, 0x4d, 0x35, 0x00, 0x87, 0x99, + 0x3a, 0xfb, 0x00, 0x87, 0x9e, 0x4d, 0x36, 0x00, + 0x87, 0x9f, 0x19, 0x8b, 0x00, 0x87, 0xa0, 0x48, + 0xb8, 0x00, 0x87, 0xa2, 0x19, 0x8a, 0x00, 0x87, + 0xa3, 0x4d, 0x37, 0x00, 0x87, 0xa7, 0x48, 0xb4, + 0x00, 0x87, 0xab, 0x19, 0x93, 0x00, 0x87, 0xac, + 0x3a, 0xfc, 0x00, 0x87, 0xad, 0x3a, 0xfd, 0x00, + 0x87, 0xae, 0x4d, 0x38, 0x00, 0x87, 0xaf, 0x19, + 0x8d, 0x00, 0x87, 0xb1, 0x57, 0xab, 0x00, 0x87, + 0xb3, 0x19, 0x95, 0x00, 0x87, 0xb5, 0x3a, 0xfe, + 0x00, 0x87, 0xba, 0x0f, 0x50, 0x00, 0x87, 0xbb, + 0x19, 0x98, 0x00, 0x87, 0xbd, 0x19, 0x8f, 0x00, + 0x87, 0xbe, 0x48, 0xbb, 0x00, 0x87, 0xbf, 0x4d, + 0x39, 0x00, 0x87, 0xc0, 0x19, 0x90, 0x00, 0x87, + 0xc1, 0x48, 0xbd, 0x00, 0x87, 0xc4, 0x19, 0x94, + 0x00, 0x87, 0xc6, 0x19, 0x97, 0x00, 0x87, 0xc7, + 0x19, 0x96, 0x00, 0x87, 0xc8, 0x57, 0xac, 0x00, + 0x87, 0xc9, 0x4d, 0x3a, 0x00, 0x87, 0xca, 0x57, + 0xad, 0x00, 0x87, 0xcb, 0x19, 0x8e, 0x00, 0x87, + 0xce, 0x48, 0xbe, 0x00, 0x87, 0xd0, 0x19, 0x91, + 0x00, 0x87, 0xd2, 0x19, 0xa2, 0x00, 0x87, 0xd5, + 0x57, 0xae, 0x00, 0x87, 0xd6, 0x3a, 0xff, 0x00, + 0x87, 0xd9, 0x57, 0xaf, 0x00, 0x87, 0xda, 0x4d, + 0x3b, 0x00, 0x87, 0xdc, 0x57, 0xb0, 0x00, 0x87, + 0xdf, 0x48, 0xbf, 0x00, 0x87, 0xe0, 0x19, 0x9b, + 0x00, 0x87, 0xe2, 0x57, 0xb1, 0x00, 0x87, 0xe3, + 0x48, 0xc1, 0x00, 0x87, 0xe4, 0x57, 0xb2, 0x00, + 0x87, 0xe5, 0x48, 0xc2, 0x00, 0x87, 0xe6, 0x48, + 0xc3, 0x00, 0x87, 0xea, 0x48, 0xc4, 0x00, 0x87, + 0xeb, 0x3b, 0x00, 0x00, 0x87, 0xec, 0x1e, 0x23, + 0x00, 0x87, 0xed, 0x3b, 0x01, 0x00, 0x87, 0xef, + 0x19, 0x99, 0x00, 0x87, 0xf1, 0x57, 0xb3, 0x00, + 0x87, 0xf2, 0x19, 0x9a, 0x00, 0x87, 0xf3, 0x57, + 0xb4, 0x00, 0x87, 0xf5, 0x3c, 0x3d, 0x00, 0x87, + 0xf6, 0x19, 0x9f, 0x00, 0x87, 0xf7, 0x19, 0xa0, + 0x00, 0x87, 0xf8, 0x57, 0xb5, 0x00, 0x87, 0xf9, + 0x05, 0x88, 0x00, 0x87, 0xfa, 0x57, 0xb6, 0x00, + 0x87, 0xfb, 0x06, 0x5c, 0x00, 0x87, 0xfe, 0x19, + 0x9e, 0x00, 0x87, 0xff, 0x57, 0xb7, 0x00, 0x88, + 0x01, 0x3b, 0x02, 0x00, 0x88, 0x03, 0x4f, 0x58, + 0x00, 0x88, 0x05, 0x19, 0x89, 0x00, 0x88, 0x06, + 0x3b, 0x04, 0x00, 0x88, 0x07, 0x21, 0xa6, 0x00, + 0x88, 0x09, 0x57, 0xb8, 0x00, 0x88, 0x0a, 0x42, + 0xda, 0x00, 0x88, 0x0b, 0x3b, 0x05, 0x00, 0x88, + 0x0d, 0x19, 0x9d, 0x00, 0x88, 0x0e, 0x19, 0xa1, + 0x00, 0x88, 0x0f, 0x19, 0x9c, 0x00, 0x88, 0x10, + 0x42, 0xdb, 0x00, 0x88, 0x11, 0x19, 0xa3, 0x00, + 0x88, 0x12, 0x57, 0xba, 0x00, 0x88, 0x13, 0x48, + 0xc5, 0x00, 0x88, 0x14, 0x3b, 0x06, 0x00, 0x88, + 0x15, 0x19, 0xa5, 0x00, 0x88, 0x16, 0x19, 0xa4, + 0x00, 0x88, 0x18, 0x4d, 0x3c, 0x00, 0x88, 0x19, + 0x57, 0xb9, 0x00, 0x88, 0x1a, 0x57, 0xbb, 0x00, + 0x88, 0x1b, 0x4d, 0x3d, 0x00, 0x88, 0x1c, 0x3b, + 0x07, 0x00, 0x88, 0x1e, 0x57, 0xbc, 0x00, 0x88, + 0x1f, 0x1e, 0x85, 0x00, 0x88, 0x21, 0x19, 0xa7, + 0x00, 0x88, 0x22, 0x19, 0xa6, 0x00, 0x88, 0x23, + 0x19, 0x61, 0x00, 0x88, 0x27, 0x19, 0xab, 0x00, + 0x88, 0x28, 0x48, 0xc6, 0x00, 0x88, 0x2d, 0x4d, + 0x3e, 0x00, 0x88, 0x2e, 0x48, 0xc7, 0x00, 0x88, + 0x30, 0x57, 0xbd, 0x00, 0x88, 0x31, 0x19, 0xa8, + 0x00, 0x88, 0x32, 0x48, 0xc8, 0x00, 0x88, 0x35, + 0x57, 0xbe, 0x00, 0x88, 0x36, 0x19, 0xa9, 0x00, + 0x88, 0x39, 0x19, 0xaa, 0x00, 0x88, 0x3a, 0x4d, + 0x3f, 0x00, 0x88, 0x3b, 0x19, 0xac, 0x00, 0x88, + 0x3c, 0x48, 0xc9, 0x00, 0x88, 0x40, 0x07, 0x42, + 0x00, 0x88, 0x41, 0x57, 0xbf, 0x00, 0x88, 0x42, + 0x19, 0xae, 0x00, 0x88, 0x43, 0x57, 0xc0, 0x00, + 0x88, 0x44, 0x19, 0xad, 0x00, 0x88, 0x45, 0x4d, + 0x40, 0x00, 0x88, 0x46, 0x09, 0x3a, 0x00, 0x88, + 0x48, 0x57, 0xc1, 0x00, 0x88, 0x49, 0x57, 0xc2, + 0x00, 0x88, 0x4a, 0x48, 0xcb, 0x00, 0x88, 0x4b, + 0x4d, 0x41, 0x00, 0x88, 0x4c, 0x07, 0xe6, 0x00, + 0x88, 0x4d, 0x15, 0x24, 0x00, 0x88, 0x4e, 0x4d, + 0x42, 0x00, 0x88, 0x51, 0x57, 0xc4, 0x00, 0x88, + 0x52, 0x19, 0xaf, 0x00, 0x88, 0x53, 0x09, 0x5b, + 0x00, 0x88, 0x55, 0x4d, 0x43, 0x00, 0x88, 0x56, + 0x3b, 0x08, 0x00, 0x88, 0x57, 0x05, 0x97, 0x00, + 0x88, 0x58, 0x48, 0xcc, 0x00, 0x88, 0x59, 0x19, + 0xb0, 0x00, 0x88, 0x5a, 0x4d, 0x44, 0x00, 0x88, + 0x5b, 0x04, 0xf4, 0x00, 0x88, 0x5c, 0x57, 0xc5, + 0x00, 0x88, 0x5d, 0x09, 0xbf, 0x00, 0x88, 0x5e, + 0x19, 0xb1, 0x00, 0x88, 0x5f, 0x3b, 0x09, 0x00, + 0x88, 0x60, 0x57, 0xc6, 0x00, 0x88, 0x61, 0x07, + 0xe7, 0x00, 0x88, 0x62, 0x19, 0xb2, 0x00, 0x88, + 0x63, 0x04, 0xa5, 0x00, 0x88, 0x64, 0x3b, 0x0a, + 0x00, 0x88, 0x68, 0x0d, 0xaf, 0x00, 0x88, 0x69, + 0x48, 0xcf, 0x00, 0x88, 0x6b, 0x19, 0xb3, 0x00, + 0x88, 0x6e, 0x4d, 0x45, 0x00, 0x88, 0x6f, 0x48, + 0xd1, 0x00, 0x88, 0x70, 0x0a, 0x30, 0x00, 0x88, + 0x71, 0x57, 0xc7, 0x00, 0x88, 0x72, 0x19, 0xba, + 0x00, 0x88, 0x75, 0x19, 0xb7, 0x00, 0x88, 0x77, + 0x0b, 0xad, 0x00, 0x88, 0x79, 0x57, 0xc8, 0x00, + 0x88, 0x7b, 0x57, 0xc9, 0x00, 0x88, 0x7d, 0x19, + 0xb8, 0x00, 0x88, 0x7e, 0x19, 0xb5, 0x00, 0x88, + 0x7f, 0x06, 0xd6, 0x00, 0x88, 0x80, 0x57, 0xca, + 0x00, 0x88, 0x81, 0x19, 0xb4, 0x00, 0x88, 0x82, + 0x19, 0xbb, 0x00, 0x88, 0x88, 0x07, 0x0c, 0x00, + 0x88, 0x8b, 0x0b, 0x3e, 0x00, 0x88, 0x8d, 0x19, + 0xc1, 0x00, 0x88, 0x92, 0x19, 0xbd, 0x00, 0x88, + 0x96, 0x0b, 0x15, 0x00, 0x88, 0x97, 0x19, 0xbc, + 0x00, 0x88, 0x98, 0x3b, 0x0b, 0x00, 0x88, 0x99, + 0x19, 0xbf, 0x00, 0x88, 0x9a, 0x4d, 0x46, 0x00, + 0x88, 0x9b, 0x4d, 0x47, 0x00, 0x88, 0x9c, 0x4d, + 0x48, 0x00, 0x88, 0x9e, 0x19, 0xb6, 0x00, 0x88, + 0x9f, 0x57, 0xcb, 0x00, 0x88, 0xa0, 0x48, 0xd2, + 0x00, 0x88, 0xa2, 0x19, 0xc0, 0x00, 0x88, 0xa4, + 0x19, 0xc2, 0x00, 0x88, 0xa8, 0x57, 0xcc, 0x00, + 0x88, 0xaa, 0x3b, 0x0c, 0x00, 0x88, 0xab, 0x0d, + 0x83, 0x00, 0x88, 0xae, 0x19, 0xbe, 0x00, 0x88, + 0xb0, 0x19, 0xc3, 0x00, 0x88, 0xb1, 0x19, 0xc5, + 0x00, 0x88, 0xb4, 0x07, 0x87, 0x00, 0x88, 0xb5, + 0x19, 0xb9, 0x00, 0x88, 0xb7, 0x04, 0x85, 0x00, + 0x88, 0xba, 0x57, 0xcd, 0x00, 0x88, 0xbc, 0x48, + 0xd3, 0x00, 0x88, 0xbd, 0x3b, 0x0d, 0x00, 0x88, + 0xbe, 0x3b, 0x0e, 0x00, 0x88, 0xbf, 0x19, 0xc4, + 0x00, 0x88, 0xc0, 0x48, 0xd4, 0x00, 0x88, 0xc1, + 0x08, 0x4b, 0x00, 0x88, 0xc2, 0x0f, 0xbe, 0x00, + 0x88, 0xc3, 0x19, 0xc6, 0x00, 0x88, 0xc4, 0x19, + 0xc7, 0x00, 0x88, 0xc5, 0x0a, 0xf7, 0x00, 0x88, + 0xc6, 0x37, 0x89, 0x00, 0x88, 0xca, 0x3b, 0x0f, + 0x00, 0x88, 0xcb, 0x57, 0xce, 0x00, 0x88, 0xcc, + 0x57, 0xcf, 0x00, 0x88, 0xcd, 0x4d, 0x49, 0x00, + 0x88, 0xce, 0x42, 0xdc, 0x00, 0x88, 0xcf, 0x0f, + 0x6a, 0x00, 0x88, 0xd1, 0x48, 0xd6, 0x00, 0x88, + 0xd2, 0x3b, 0x10, 0x00, 0x88, 0xd3, 0x48, 0xd7, + 0x00, 0x88, 0xd4, 0x19, 0xc8, 0x00, 0x88, 0xd5, + 0x0f, 0x1f, 0x00, 0x88, 0xd8, 0x19, 0xc9, 0x00, + 0x88, 0xd9, 0x19, 0xca, 0x00, 0x88, 0xdb, 0x3b, + 0x11, 0x00, 0x88, 0xdc, 0x0e, 0x34, 0x00, 0x88, + 0xdd, 0x19, 0xcb, 0x00, 0x88, 0xde, 0x57, 0xd0, + 0x00, 0x88, 0xdf, 0x08, 0x30, 0x00, 0x88, 0xe0, + 0x4d, 0x4a, 0x00, 0x88, 0xe1, 0x0f, 0x6b, 0x00, + 0x88, 0xe7, 0x57, 0xd1, 0x00, 0x88, 0xe8, 0x19, + 0xd0, 0x00, 0x88, 0xef, 0x4d, 0x4b, 0x00, 0x88, + 0xf0, 0x3b, 0x12, 0x00, 0x88, 0xf1, 0x3b, 0x13, + 0x00, 0x88, 0xf2, 0x19, 0xd1, 0x00, 0x88, 0xf3, + 0x09, 0xc0, 0x00, 0x88, 0xf4, 0x19, 0xcf, 0x00, + 0x88, 0xf5, 0x21, 0xa7, 0x00, 0x88, 0xf7, 0x57, + 0xd2, 0x00, 0x88, 0xf8, 0x0f, 0x51, 0x00, 0x88, + 0xf9, 0x19, 0xcc, 0x00, 0x88, 0xfc, 0x19, 0xce, + 0x00, 0x88, 0xfd, 0x0a, 0x61, 0x00, 0x88, 0xfe, + 0x0a, 0x44, 0x00, 0x89, 0x01, 0x48, 0xd9, 0x00, + 0x89, 0x02, 0x19, 0xcd, 0x00, 0x89, 0x04, 0x19, + 0xd2, 0x00, 0x89, 0x06, 0x3b, 0x14, 0x00, 0x89, + 0x07, 0x0d, 0xf3, 0x00, 0x89, 0x0a, 0x19, 0xd4, + 0x00, 0x89, 0x0c, 0x19, 0xd3, 0x00, 0x89, 0x0d, + 0x57, 0xd3, 0x00, 0x89, 0x0e, 0x4d, 0x4c, 0x00, + 0x89, 0x0f, 0x4d, 0x4d, 0x00, 0x89, 0x10, 0x05, + 0xca, 0x00, 0x89, 0x12, 0x0e, 0x59, 0x00, 0x89, + 0x13, 0x19, 0xd5, 0x00, 0x89, 0x15, 0x57, 0xd4, + 0x00, 0x89, 0x16, 0x57, 0xd5, 0x00, 0x89, 0x18, + 0x3b, 0x15, 0x00, 0x89, 0x19, 0x3b, 0x16, 0x00, + 0x89, 0x1a, 0x3b, 0x17, 0x00, 0x89, 0x1c, 0x20, + 0xa8, 0x00, 0x89, 0x1d, 0x19, 0xe1, 0x00, 0x89, + 0x1e, 0x19, 0xd7, 0x00, 0x89, 0x20, 0x57, 0xd6, + 0x00, 0x89, 0x25, 0x19, 0xd8, 0x00, 0x89, 0x26, + 0x4d, 0x4e, 0x00, 0x89, 0x27, 0x3b, 0x18, 0x00, + 0x89, 0x28, 0x57, 0xd7, 0x00, 0x89, 0x2a, 0x19, + 0xd9, 0x00, 0x89, 0x2b, 0x19, 0xda, 0x00, 0x89, + 0x30, 0x3b, 0x19, 0x00, 0x89, 0x31, 0x57, 0xd8, + 0x00, 0x89, 0x32, 0x42, 0xde, 0x00, 0x89, 0x35, + 0x4d, 0x4f, 0x00, 0x89, 0x36, 0x19, 0xde, 0x00, + 0x89, 0x37, 0x48, 0xdb, 0x00, 0x89, 0x38, 0x19, + 0xdf, 0x00, 0x89, 0x39, 0x42, 0xdf, 0x00, 0x89, + 0x3a, 0x57, 0xd9, 0x00, 0x89, 0x3b, 0x19, 0xdd, + 0x00, 0x89, 0x3e, 0x3b, 0x1a, 0x00, 0x89, 0x40, + 0x42, 0xe0, 0x00, 0x89, 0x41, 0x19, 0xdb, 0x00, + 0x89, 0x42, 0x48, 0xdd, 0x00, 0x89, 0x43, 0x19, + 0xd6, 0x00, 0x89, 0x44, 0x19, 0xdc, 0x00, 0x89, + 0x45, 0x48, 0xde, 0x00, 0x89, 0x46, 0x57, 0xda, + 0x00, 0x89, 0x49, 0x48, 0xdf, 0x00, 0x89, 0x4c, + 0x19, 0xe0, 0x00, 0x89, 0x4d, 0x1b, 0xd0, 0x00, + 0x89, 0x4f, 0x57, 0xdb, 0x00, 0x89, 0x52, 0x57, + 0xdc, 0x00, 0x89, 0x56, 0x05, 0x28, 0x00, 0x89, + 0x57, 0x57, 0xdd, 0x00, 0x89, 0x5a, 0x4d, 0x50, + 0x00, 0x89, 0x5b, 0x57, 0xde, 0x00, 0x89, 0x5c, + 0x4d, 0x51, 0x00, 0x89, 0x5e, 0x19, 0xe3, 0x00, + 0x89, 0x5f, 0x06, 0xd7, 0x00, 0x89, 0x60, 0x19, + 0xe2, 0x00, 0x89, 0x61, 0x57, 0xdf, 0x00, 0x89, + 0x62, 0x48, 0xe1, 0x00, 0x89, 0x63, 0x57, 0xe0, + 0x00, 0x89, 0x64, 0x19, 0xe5, 0x00, 0x89, 0x66, + 0x19, 0xe4, 0x00, 0x89, 0x6a, 0x19, 0xe7, 0x00, + 0x89, 0x6b, 0x4d, 0x52, 0x00, 0x89, 0x6d, 0x19, + 0xe6, 0x00, 0x89, 0x6e, 0x57, 0xe1, 0x00, 0x89, + 0x6f, 0x19, 0xe8, 0x00, 0x89, 0x70, 0x4d, 0x53, + 0x00, 0x89, 0x72, 0x09, 0x3b, 0x00, 0x89, 0x73, + 0x57, 0xe2, 0x00, 0x89, 0x74, 0x19, 0xe9, 0x00, + 0x89, 0x75, 0x57, 0xe3, 0x00, 0x89, 0x77, 0x19, + 0xea, 0x00, 0x89, 0x7a, 0x57, 0xe4, 0x00, 0x89, + 0x7b, 0x3b, 0x1b, 0x00, 0x89, 0x7c, 0x4d, 0x54, + 0x00, 0x89, 0x7d, 0x57, 0xe5, 0x00, 0x89, 0x7e, + 0x19, 0xeb, 0x00, 0x89, 0x7f, 0x0a, 0x62, 0x00, + 0x89, 0x80, 0x36, 0x2e, 0x00, 0x89, 0x81, 0x0f, + 0x41, 0x00, 0x89, 0x83, 0x19, 0xec, 0x00, 0x89, + 0x86, 0x0d, 0xf4, 0x00, 0x89, 0x87, 0x0c, 0xfc, + 0x00, 0x89, 0x88, 0x19, 0xed, 0x00, 0x89, 0x89, + 0x48, 0xe2, 0x00, 0x89, 0x8a, 0x19, 0xee, 0x00, + 0x89, 0x8b, 0x07, 0x5f, 0x00, 0x89, 0x8d, 0x57, + 0xe6, 0x00, 0x89, 0x8f, 0x06, 0x46, 0x00, 0x89, + 0x90, 0x48, 0xe3, 0x00, 0x89, 0x93, 0x19, 0xef, + 0x00, 0x89, 0x94, 0x42, 0xe1, 0x00, 0x89, 0x95, + 0x57, 0xe7, 0x00, 0x89, 0x96, 0x08, 0xb9, 0x00, + 0x89, 0x97, 0x0c, 0xf7, 0x00, 0x89, 0x98, 0x19, + 0xf0, 0x00, 0x89, 0x9a, 0x05, 0xae, 0x00, 0x89, + 0x9b, 0x57, 0xe8, 0x00, 0x89, 0x9c, 0x57, 0xe9, + 0x00, 0x89, 0x9f, 0x48, 0xe4, 0x00, 0x89, 0xa0, + 0x57, 0xea, 0x00, 0x89, 0xa1, 0x19, 0xf1, 0x00, + 0x89, 0xa5, 0x4d, 0x55, 0x00, 0x89, 0xa6, 0x19, + 0xf3, 0x00, 0x89, 0xa7, 0x0f, 0x61, 0x00, 0x89, + 0xa9, 0x19, 0xf2, 0x00, 0x89, 0xaa, 0x0a, 0x0c, + 0x00, 0x89, 0xac, 0x19, 0xf4, 0x00, 0x89, 0xaf, + 0x19, 0xf5, 0x00, 0x89, 0xb0, 0x48, 0xe5, 0x00, + 0x89, 0xb2, 0x19, 0xf6, 0x00, 0x89, 0xb3, 0x06, + 0x0d, 0x00, 0x89, 0xb4, 0x57, 0xeb, 0x00, 0x89, + 0xb5, 0x4d, 0x56, 0x00, 0x89, 0xb6, 0x57, 0xec, + 0x00, 0x89, 0xb7, 0x48, 0xe6, 0x00, 0x89, 0xba, + 0x19, 0xf7, 0x00, 0x89, 0xbc, 0x4d, 0x57, 0x00, + 0x89, 0xbd, 0x19, 0xf8, 0x00, 0x89, 0xbf, 0x19, + 0xf9, 0x00, 0x89, 0xc0, 0x19, 0xfa, 0x00, 0x89, + 0xd2, 0x35, 0x72, 0x00, 0x89, 0xd4, 0x3b, 0x1c, + 0x00, 0x89, 0xd5, 0x4d, 0x58, 0x00, 0x89, 0xd6, + 0x3b, 0x1d, 0x00, 0x89, 0xd7, 0x57, 0xed, 0x00, + 0x89, 0xd8, 0x48, 0xe7, 0x00, 0x89, 0xda, 0x19, + 0xfb, 0x00, 0x89, 0xdc, 0x19, 0xfc, 0x00, 0x89, + 0xdd, 0x19, 0xfd, 0x00, 0x89, 0xe3, 0x05, 0x72, + 0x00, 0x89, 0xe5, 0x3b, 0x1e, 0x00, 0x89, 0xe6, + 0x09, 0xee, 0x00, 0x89, 0xe7, 0x19, 0xfe, 0x00, + 0x89, 0xe9, 0x57, 0xee, 0x00, 0x89, 0xeb, 0x48, + 0xe8, 0x00, 0x89, 0xed, 0x57, 0xef, 0x00, 0x89, + 0xf1, 0x3b, 0x1f, 0x00, 0x89, 0xf3, 0x48, 0xea, + 0x00, 0x89, 0xf4, 0x19, 0xff, 0x00, 0x89, 0xf6, + 0x42, 0xe2, 0x00, 0x89, 0xf8, 0x1a, 0x00, 0x00, + 0x89, 0xf9, 0x57, 0xf0, 0x00, 0x89, 0xfd, 0x48, + 0xeb, 0x00, 0x89, 0xff, 0x48, 0xec, 0x00, 0x8a, + 0x00, 0x07, 0x74, 0x00, 0x8a, 0x01, 0x35, 0xbc, + 0x00, 0x8a, 0x02, 0x0c, 0x17, 0x00, 0x8a, 0x03, + 0x1a, 0x01, 0x00, 0x8a, 0x04, 0x57, 0xf1, 0x00, + 0x8a, 0x05, 0x57, 0xf2, 0x00, 0x8a, 0x07, 0x3b, + 0x20, 0x00, 0x8a, 0x08, 0x07, 0x2d, 0x00, 0x8a, + 0x0a, 0x0a, 0x1c, 0x00, 0x8a, 0x0c, 0x1a, 0x04, + 0x00, 0x8a, 0x0e, 0x0c, 0x7c, 0x00, 0x8a, 0x0f, + 0x3b, 0x21, 0x00, 0x8a, 0x10, 0x1a, 0x03, 0x00, + 0x8a, 0x11, 0x48, 0xee, 0x00, 0x8a, 0x12, 0x21, + 0xa8, 0x00, 0x8a, 0x13, 0x07, 0x07, 0x00, 0x8a, + 0x14, 0x48, 0xef, 0x00, 0x8a, 0x15, 0x3b, 0x22, + 0x00, 0x8a, 0x16, 0x1a, 0x02, 0x00, 0x8a, 0x17, + 0x0b, 0x57, 0x00, 0x8a, 0x18, 0x06, 0x47, 0x00, + 0x8a, 0x1b, 0x1a, 0x05, 0x00, 0x8a, 0x1d, 0x1a, + 0x06, 0x00, 0x8a, 0x1e, 0x57, 0xf3, 0x00, 0x8a, + 0x1f, 0x09, 0xc1, 0x00, 0x8a, 0x20, 0x57, 0xf4, + 0x00, 0x8a, 0x21, 0x48, 0xf1, 0x00, 0x8a, 0x22, + 0x3b, 0x23, 0x00, 0x8a, 0x23, 0x07, 0x43, 0x00, + 0x8a, 0x24, 0x57, 0xf5, 0x00, 0x8a, 0x25, 0x1a, + 0x07, 0x00, 0x8a, 0x26, 0x57, 0xf6, 0x00, 0x8a, + 0x2a, 0x0e, 0x5a, 0x00, 0x8a, 0x2b, 0x57, 0xf7, + 0x00, 0x8a, 0x2c, 0x57, 0xf8, 0x00, 0x8a, 0x2d, + 0x0a, 0x83, 0x00, 0x8a, 0x2f, 0x57, 0xf9, 0x00, + 0x8a, 0x31, 0x06, 0x90, 0x00, 0x8a, 0x33, 0x0f, + 0x01, 0x00, 0x8a, 0x34, 0x0a, 0xcc, 0x00, 0x8a, + 0x35, 0x48, 0xf2, 0x00, 0x8a, 0x36, 0x1a, 0x08, + 0x00, 0x8a, 0x37, 0x21, 0xa9, 0x00, 0x8a, 0x3a, + 0x0a, 0x0d, 0x00, 0x8a, 0x3b, 0x0b, 0xae, 0x00, + 0x8a, 0x3c, 0x09, 0xc2, 0x00, 0x8a, 0x3d, 0x57, + 0xfa, 0x00, 0x8a, 0x3e, 0x48, 0xf3, 0x00, 0x8a, + 0x40, 0x57, 0xfb, 0x00, 0x8a, 0x41, 0x1a, 0x09, + 0x00, 0x8a, 0x43, 0x57, 0xfc, 0x00, 0x8a, 0x45, + 0x48, 0xf4, 0x00, 0x8a, 0x46, 0x1a, 0x0c, 0x00, + 0x8a, 0x47, 0x42, 0xe3, 0x00, 0x8a, 0x48, 0x1a, + 0x0d, 0x00, 0x8a, 0x49, 0x4d, 0x59, 0x00, 0x8a, + 0x4d, 0x48, 0xf5, 0x00, 0x8a, 0x4e, 0x3b, 0x24, + 0x00, 0x8a, 0x50, 0x08, 0x2e, 0x00, 0x8a, 0x51, + 0x0b, 0x22, 0x00, 0x8a, 0x52, 0x1a, 0x0b, 0x00, + 0x8a, 0x53, 0x57, 0xfd, 0x00, 0x8a, 0x54, 0x09, + 0xc3, 0x00, 0x8a, 0x55, 0x0d, 0xb0, 0x00, 0x8a, + 0x56, 0x57, 0xfe, 0x00, 0x8a, 0x57, 0x4d, 0x5a, + 0x00, 0x8a, 0x58, 0x48, 0xf6, 0x00, 0x8a, 0x5b, + 0x1a, 0x0a, 0x00, 0x8a, 0x5c, 0x57, 0xff, 0x00, + 0x8a, 0x5d, 0x42, 0xe4, 0x00, 0x8a, 0x5e, 0x08, + 0xba, 0x00, 0x8a, 0x60, 0x04, 0xf5, 0x00, 0x8a, + 0x61, 0x42, 0xe5, 0x00, 0x8a, 0x62, 0x1a, 0x11, + 0x00, 0x8a, 0x63, 0x07, 0x2e, 0x00, 0x8a, 0x65, + 0x58, 0x00, 0x00, 0x8a, 0x66, 0x08, 0xbc, 0x00, + 0x8a, 0x67, 0x4d, 0x5b, 0x00, 0x8a, 0x69, 0x08, + 0xbb, 0x00, 0x8a, 0x6b, 0x0f, 0xf3, 0x00, 0x8a, + 0x6c, 0x1a, 0x10, 0x00, 0x8a, 0x6d, 0x1a, 0x0f, + 0x00, 0x8a, 0x6e, 0x0a, 0xa9, 0x00, 0x8a, 0x70, + 0x06, 0x67, 0x00, 0x8a, 0x71, 0x0f, 0xe9, 0x00, + 0x8a, 0x72, 0x05, 0x98, 0x00, 0x8a, 0x73, 0x09, + 0xc4, 0x00, 0x8a, 0x75, 0x42, 0xe6, 0x00, 0x8a, + 0x76, 0x58, 0x01, 0x00, 0x8a, 0x77, 0x58, 0x02, + 0x00, 0x8a, 0x79, 0x21, 0xaa, 0x00, 0x8a, 0x7a, + 0x58, 0x03, 0x00, 0x8a, 0x7b, 0x58, 0x04, 0x00, + 0x8a, 0x7c, 0x1a, 0x0e, 0x00, 0x8a, 0x7e, 0x4d, + 0x5c, 0x00, 0x8a, 0x7f, 0x3b, 0x25, 0x00, 0x8a, + 0x80, 0x58, 0x05, 0x00, 0x8a, 0x82, 0x1a, 0x13, + 0x00, 0x8a, 0x83, 0x58, 0x06, 0x00, 0x8a, 0x84, + 0x1a, 0x14, 0x00, 0x8a, 0x85, 0x1a, 0x12, 0x00, + 0x8a, 0x86, 0x4d, 0x5d, 0x00, 0x8a, 0x87, 0x07, + 0x8c, 0x00, 0x8a, 0x89, 0x0f, 0x2a, 0x00, 0x8a, + 0x8b, 0x58, 0x07, 0x00, 0x8a, 0x8c, 0x08, 0xbd, + 0x00, 0x8a, 0x8d, 0x0c, 0xdd, 0x00, 0x8a, 0x8f, + 0x58, 0x08, 0x00, 0x8a, 0x90, 0x48, 0xf8, 0x00, + 0x8a, 0x91, 0x1a, 0x17, 0x00, 0x8a, 0x92, 0x58, + 0x09, 0x00, 0x8a, 0x93, 0x0a, 0x64, 0x00, 0x8a, + 0x95, 0x0b, 0x80, 0x00, 0x8a, 0x96, 0x4d, 0x5e, + 0x00, 0x8a, 0x97, 0x58, 0x0a, 0x00, 0x8a, 0x98, + 0x0f, 0x20, 0x00, 0x8a, 0x99, 0x58, 0x0b, 0x00, + 0x8a, 0x9a, 0x1a, 0x1a, 0x00, 0x8a, 0x9e, 0x07, + 0xa0, 0x00, 0x8a, 0x9f, 0x58, 0x0c, 0x00, 0x8a, + 0xa0, 0x0a, 0x63, 0x00, 0x8a, 0xa1, 0x1a, 0x16, + 0x00, 0x8a, 0xa3, 0x1a, 0x1b, 0x00, 0x8a, 0xa4, + 0x07, 0xa1, 0x00, 0x8a, 0xa5, 0x1a, 0x18, 0x00, + 0x8a, 0xa6, 0x1a, 0x19, 0x00, 0x8a, 0xa7, 0x21, + 0xab, 0x00, 0x8a, 0xa8, 0x1a, 0x15, 0x00, 0x8a, + 0xa9, 0x58, 0x0d, 0x00, 0x8a, 0xaa, 0x36, 0x38, + 0x00, 0x8a, 0xac, 0x0a, 0x86, 0x00, 0x8a, 0xad, + 0x0c, 0xa1, 0x00, 0x8a, 0xae, 0x48, 0xf7, 0x00, + 0x8a, 0xaf, 0x58, 0x0e, 0x00, 0x8a, 0xb0, 0x0b, + 0x6d, 0x00, 0x8a, 0xb2, 0x05, 0x5d, 0x00, 0x8a, + 0xb3, 0x58, 0x0f, 0x00, 0x8a, 0xb6, 0x4d, 0x5f, + 0x00, 0x8a, 0xb7, 0x48, 0xf9, 0x00, 0x8a, 0xb9, + 0x0d, 0x84, 0x00, 0x8a, 0xbb, 0x58, 0x10, 0x00, + 0x8a, 0xbc, 0x06, 0x5d, 0x00, 0x8a, 0xbe, 0x21, + 0xac, 0x00, 0x8a, 0xbf, 0x0b, 0xd0, 0x00, 0x8a, + 0xc2, 0x1a, 0x1e, 0x00, 0x8a, 0xc3, 0x58, 0x11, + 0x00, 0x8a, 0xc4, 0x1a, 0x1c, 0x00, 0x8a, 0xc6, + 0x58, 0x12, 0x00, 0x8a, 0xc7, 0x0b, 0x8a, 0x00, + 0x8a, 0xc8, 0x58, 0x13, 0x00, 0x8a, 0xc9, 0x4d, + 0x60, 0x00, 0x8a, 0xca, 0x58, 0x14, 0x00, 0x8a, + 0xcb, 0x0a, 0x65, 0x00, 0x8a, 0xcc, 0x06, 0x0e, + 0x00, 0x8a, 0xcd, 0x1a, 0x1d, 0x00, 0x8a, 0xcf, + 0x0a, 0x21, 0x00, 0x8a, 0xd0, 0x42, 0xe7, 0x00, + 0x8a, 0xd1, 0x4d, 0x61, 0x00, 0x8a, 0xd2, 0x0f, + 0x92, 0x00, 0x8a, 0xd3, 0x58, 0x15, 0x00, 0x8a, + 0xd4, 0x58, 0x16, 0x00, 0x8a, 0xd5, 0x58, 0x17, + 0x00, 0x8a, 0xd6, 0x0f, 0xe6, 0x00, 0x8a, 0xd7, + 0x48, 0xfa, 0x00, 0x8a, 0xda, 0x1a, 0x1f, 0x00, + 0x8a, 0xdb, 0x1a, 0x2a, 0x00, 0x8a, 0xdc, 0x0b, + 0xd1, 0x00, 0x8a, 0xdd, 0x4d, 0x62, 0x00, 0x8a, + 0xde, 0x1a, 0x29, 0x00, 0x8a, 0xdf, 0x21, 0xad, + 0x00, 0x8a, 0xe0, 0x1a, 0x26, 0x00, 0x8a, 0xe1, + 0x1a, 0x2e, 0x00, 0x8a, 0xe2, 0x1a, 0x27, 0x00, + 0x8a, 0xe4, 0x1a, 0x23, 0x00, 0x8a, 0xe6, 0x0c, + 0x18, 0x00, 0x8a, 0xe7, 0x1a, 0x22, 0x00, 0x8a, + 0xeb, 0x1a, 0x20, 0x00, 0x8a, 0xec, 0x4d, 0x63, + 0x00, 0x8a, 0xed, 0x36, 0xf4, 0x00, 0x8a, 0xee, + 0x08, 0xbe, 0x00, 0x8a, 0xf0, 0x58, 0x18, 0x00, + 0x8a, 0xf1, 0x1a, 0x24, 0x00, 0x8a, 0xf3, 0x1a, + 0x21, 0x00, 0x8a, 0xf4, 0x3b, 0x26, 0x00, 0x8a, + 0xf5, 0x4d, 0x64, 0x00, 0x8a, 0xf6, 0x21, 0xaf, + 0x00, 0x8a, 0xf7, 0x1a, 0x28, 0x00, 0x8a, 0xf8, + 0x21, 0xae, 0x00, 0x8a, 0xfa, 0x07, 0x75, 0x00, + 0x8a, 0xfc, 0x48, 0xfb, 0x00, 0x8a, 0xfe, 0x0b, + 0x5a, 0x00, 0x8a, 0xff, 0x58, 0x19, 0x00, 0x8b, + 0x00, 0x0e, 0x73, 0x00, 0x8b, 0x01, 0x34, 0x09, + 0x00, 0x8b, 0x02, 0x04, 0xa6, 0x00, 0x8b, 0x04, + 0x0c, 0x7d, 0x00, 0x8b, 0x05, 0x48, 0xfe, 0x00, + 0x8b, 0x06, 0x4d, 0x65, 0x00, 0x8b, 0x07, 0x1a, + 0x2c, 0x00, 0x8b, 0x0a, 0x48, 0xfd, 0x00, 0x8b, + 0x0b, 0x58, 0x1a, 0x00, 0x8b, 0x0c, 0x1a, 0x2b, + 0x00, 0x8b, 0x0d, 0x48, 0xff, 0x00, 0x8b, 0x0e, + 0x0c, 0xbe, 0x00, 0x8b, 0x0f, 0x4d, 0x66, 0x00, + 0x8b, 0x10, 0x1a, 0x30, 0x00, 0x8b, 0x11, 0x4d, + 0x67, 0x00, 0x8b, 0x14, 0x1a, 0x25, 0x00, 0x8b, + 0x16, 0x1a, 0x2f, 0x00, 0x8b, 0x17, 0x1a, 0x31, + 0x00, 0x8b, 0x19, 0x07, 0x60, 0x00, 0x8b, 0x1a, + 0x1a, 0x2d, 0x00, 0x8b, 0x1b, 0x07, 0xe8, 0x00, + 0x8b, 0x1c, 0x49, 0x00, 0x00, 0x8b, 0x1d, 0x09, + 0x01, 0x00, 0x8b, 0x1e, 0x58, 0x1b, 0x00, 0x8b, + 0x1f, 0x3b, 0x27, 0x00, 0x8b, 0x20, 0x1a, 0x32, + 0x00, 0x8b, 0x21, 0x0f, 0x42, 0x00, 0x8b, 0x26, + 0x1a, 0x35, 0x00, 0x8b, 0x28, 0x1a, 0x38, 0x00, + 0x8b, 0x2b, 0x1a, 0x36, 0x00, 0x8b, 0x2c, 0x0d, + 0xa7, 0x00, 0x8b, 0x2d, 0x49, 0x01, 0x00, 0x8b, + 0x30, 0x58, 0x1c, 0x00, 0x8b, 0x33, 0x1a, 0x33, + 0x00, 0x8b, 0x37, 0x3b, 0x28, 0x00, 0x8b, 0x39, + 0x34, 0x1b, 0x00, 0x8b, 0x3c, 0x58, 0x1d, 0x00, + 0x8b, 0x3e, 0x1a, 0x37, 0x00, 0x8b, 0x41, 0x1a, + 0x39, 0x00, 0x8b, 0x42, 0x58, 0x1e, 0x00, 0x8b, + 0x43, 0x3b, 0x29, 0x00, 0x8b, 0x44, 0x3b, 0x2a, + 0x00, 0x8b, 0x45, 0x4d, 0x68, 0x00, 0x8b, 0x46, + 0x42, 0xe8, 0x00, 0x8b, 0x48, 0x58, 0x1f, 0x00, + 0x8b, 0x49, 0x1a, 0x3d, 0x00, 0x8b, 0x4c, 0x1a, + 0x3a, 0x00, 0x8b, 0x4d, 0x58, 0x20, 0x00, 0x8b, + 0x4e, 0x1a, 0x3c, 0x00, 0x8b, 0x4f, 0x1a, 0x3b, + 0x00, 0x8b, 0x51, 0x49, 0x03, 0x00, 0x8b, 0x52, + 0x4d, 0x69, 0x00, 0x8b, 0x53, 0x21, 0xb0, 0x00, + 0x8b, 0x54, 0x3b, 0x2b, 0x00, 0x8b, 0x56, 0x1a, + 0x3e, 0x00, 0x8b, 0x58, 0x08, 0xdd, 0x00, 0x8b, + 0x59, 0x42, 0xe9, 0x00, 0x8b, 0x5a, 0x1a, 0x40, + 0x00, 0x8b, 0x5b, 0x1a, 0x3f, 0x00, 0x8b, 0x5c, + 0x0d, 0xda, 0x00, 0x8b, 0x5e, 0x49, 0x04, 0x00, + 0x8b, 0x5f, 0x1a, 0x42, 0x00, 0x8b, 0x63, 0x58, + 0x21, 0x00, 0x8b, 0x66, 0x07, 0x2f, 0x00, 0x8b, + 0x69, 0x42, 0xea, 0x00, 0x8b, 0x6b, 0x1a, 0x41, + 0x00, 0x8b, 0x6c, 0x1a, 0x43, 0x00, 0x8b, 0x6d, + 0x4d, 0x6a, 0x00, 0x8b, 0x6f, 0x1a, 0x44, 0x00, + 0x8b, 0x70, 0x06, 0x5e, 0x00, 0x8b, 0x71, 0x18, + 0x2e, 0x00, 0x8b, 0x72, 0x09, 0xe1, 0x00, 0x8b, + 0x74, 0x1a, 0x45, 0x00, 0x8b, 0x76, 0x49, 0x05, + 0x00, 0x8b, 0x77, 0x07, 0xa2, 0x00, 0x8b, 0x78, + 0x4d, 0x6b, 0x00, 0x8b, 0x79, 0x58, 0x22, 0x00, + 0x8b, 0x7c, 0x4d, 0x6c, 0x00, 0x8b, 0x7d, 0x1a, + 0x46, 0x00, 0x8b, 0x7e, 0x4d, 0x6d, 0x00, 0x8b, + 0x7f, 0x21, 0xb1, 0x00, 0x8b, 0x80, 0x1a, 0x47, + 0x00, 0x8b, 0x81, 0x49, 0x06, 0x00, 0x8b, 0x83, + 0x08, 0x8c, 0x00, 0x8b, 0x84, 0x58, 0x23, 0x00, + 0x8b, 0x85, 0x4d, 0x6e, 0x00, 0x8b, 0x8a, 0x13, + 0xd3, 0x00, 0x8b, 0x8b, 0x49, 0x07, 0x00, 0x8b, + 0x8c, 0x1a, 0x48, 0x00, 0x8b, 0x8d, 0x58, 0x24, + 0x00, 0x8b, 0x8e, 0x1a, 0x49, 0x00, 0x8b, 0x8f, + 0x58, 0x25, 0x00, 0x8b, 0x90, 0x09, 0x3c, 0x00, + 0x8b, 0x92, 0x1a, 0x4a, 0x00, 0x8b, 0x93, 0x1a, + 0x4b, 0x00, 0x8b, 0x94, 0x49, 0x08, 0x00, 0x8b, + 0x95, 0x49, 0x09, 0x00, 0x8b, 0x96, 0x1a, 0x4c, + 0x00, 0x8b, 0x99, 0x1a, 0x4d, 0x00, 0x8b, 0x9a, + 0x1a, 0x4e, 0x00, 0x8b, 0x9c, 0x3b, 0x2c, 0x00, + 0x8b, 0x9d, 0x42, 0xeb, 0x00, 0x8b, 0x9e, 0x3b, + 0x2d, 0x00, 0x8b, 0x9f, 0x4d, 0x6f, 0x00, 0x8c, + 0x37, 0x0b, 0x69, 0x00, 0x8c, 0x38, 0x58, 0x26, + 0x00, 0x8c, 0x39, 0x49, 0x0a, 0x00, 0x8c, 0x3a, + 0x1a, 0x4f, 0x00, 0x8c, 0x3d, 0x49, 0x0c, 0x00, + 0x8c, 0x3e, 0x58, 0x27, 0x00, 0x8c, 0x3f, 0x1a, + 0x51, 0x00, 0x8c, 0x41, 0x1a, 0x50, 0x00, 0x8c, + 0x45, 0x49, 0x0f, 0x00, 0x8c, 0x46, 0x0c, 0x7e, + 0x00, 0x8c, 0x47, 0x3b, 0x2e, 0x00, 0x8c, 0x48, + 0x1a, 0x52, 0x00, 0x8c, 0x49, 0x42, 0xec, 0x00, + 0x8c, 0x4a, 0x0e, 0x5b, 0x00, 0x8c, 0x4b, 0x4d, + 0x70, 0x00, 0x8c, 0x4c, 0x1a, 0x53, 0x00, 0x8c, + 0x4e, 0x1a, 0x54, 0x00, 0x8c, 0x4f, 0x49, 0x10, + 0x00, 0x8c, 0x50, 0x1a, 0x55, 0x00, 0x8c, 0x51, + 0x58, 0x28, 0x00, 0x8c, 0x53, 0x4d, 0x71, 0x00, + 0x8c, 0x54, 0x3b, 0x2f, 0x00, 0x8c, 0x55, 0x1a, + 0x56, 0x00, 0x8c, 0x57, 0x49, 0x11, 0x00, 0x8c, + 0x58, 0x58, 0x29, 0x00, 0x8c, 0x59, 0x58, 0x2c, + 0x00, 0x8c, 0x5a, 0x0c, 0xb2, 0x00, 0x8c, 0x5b, + 0x58, 0x2a, 0x00, 0x8c, 0x5d, 0x58, 0x2b, 0x00, + 0x8c, 0x61, 0x09, 0xc5, 0x00, 0x8c, 0x62, 0x1a, + 0x57, 0x00, 0x8c, 0x63, 0x58, 0x2d, 0x00, 0x8c, + 0x64, 0x58, 0x2e, 0x00, 0x8c, 0x66, 0x58, 0x2f, + 0x00, 0x8c, 0x68, 0x42, 0xed, 0x00, 0x8c, 0x69, + 0x49, 0x12, 0x00, 0x8c, 0x6a, 0x07, 0xfd, 0x00, + 0x8c, 0x6b, 0x10, 0x07, 0x00, 0x8c, 0x6c, 0x1a, + 0x58, 0x00, 0x8c, 0x6d, 0x49, 0x13, 0x00, 0x8c, + 0x73, 0x3b, 0x30, 0x00, 0x8c, 0x75, 0x58, 0x30, + 0x00, 0x8c, 0x76, 0x58, 0x31, 0x00, 0x8c, 0x78, + 0x1a, 0x59, 0x00, 0x8c, 0x79, 0x0d, 0xb1, 0x00, + 0x8c, 0x7a, 0x1a, 0x5a, 0x00, 0x8c, 0x7b, 0x4d, + 0x72, 0x00, 0x8c, 0x7c, 0x1a, 0x62, 0x00, 0x8c, + 0x7e, 0x58, 0x32, 0x00, 0x8c, 0x82, 0x1a, 0x5b, + 0x00, 0x8c, 0x85, 0x1a, 0x5d, 0x00, 0x8c, 0x86, + 0x58, 0x33, 0x00, 0x8c, 0x87, 0x58, 0x34, 0x00, + 0x8c, 0x89, 0x1a, 0x5c, 0x00, 0x8c, 0x8a, 0x1a, + 0x5e, 0x00, 0x8c, 0x8b, 0x58, 0x35, 0x00, 0x8c, + 0x8c, 0x0e, 0x74, 0x00, 0x8c, 0x8d, 0x1a, 0x5f, + 0x00, 0x8c, 0x8e, 0x1a, 0x60, 0x00, 0x8c, 0x90, + 0x58, 0x36, 0x00, 0x8c, 0x92, 0x49, 0x16, 0x00, + 0x8c, 0x93, 0x49, 0x15, 0x00, 0x8c, 0x94, 0x1a, + 0x61, 0x00, 0x8c, 0x98, 0x1a, 0x63, 0x00, 0x8c, + 0x99, 0x49, 0x17, 0x00, 0x8c, 0x9b, 0x49, 0x19, + 0x00, 0x8c, 0x9c, 0x58, 0x38, 0x00, 0x8c, 0x9d, + 0x05, 0x8b, 0x00, 0x8c, 0x9e, 0x0c, 0x03, 0x00, + 0x8c, 0x9f, 0x35, 0x4c, 0x00, 0x8c, 0xa0, 0x0d, + 0xdb, 0x00, 0x8c, 0xa1, 0x08, 0x52, 0x00, 0x8c, + 0xa2, 0x07, 0xe9, 0x00, 0x8c, 0xa4, 0x3b, 0x31, + 0x00, 0x8c, 0xa7, 0x0d, 0xc1, 0x00, 0x8c, 0xa8, + 0x05, 0x5f, 0x00, 0x8c, 0xa9, 0x0d, 0x62, 0x00, + 0x8c, 0xaa, 0x1a, 0x66, 0x00, 0x8c, 0xab, 0x06, + 0x0f, 0x00, 0x8c, 0xac, 0x0a, 0x79, 0x00, 0x8c, + 0xad, 0x1a, 0x65, 0x00, 0x8c, 0xae, 0x1a, 0x6a, + 0x00, 0x8c, 0xaf, 0x0b, 0xb7, 0x00, 0x8c, 0xb0, + 0x0e, 0xef, 0x00, 0x8c, 0xb2, 0x1a, 0x68, 0x00, + 0x8c, 0xb3, 0x1a, 0x69, 0x00, 0x8c, 0xb4, 0x06, + 0x48, 0x00, 0x8c, 0xb6, 0x1a, 0x6b, 0x00, 0x8c, + 0xb7, 0x0d, 0x19, 0x00, 0x8c, 0xb8, 0x0b, 0x3f, + 0x00, 0x8c, 0xb9, 0x58, 0x39, 0x00, 0x8c, 0xba, + 0x4d, 0x73, 0x00, 0x8c, 0xbb, 0x0d, 0x85, 0x00, + 0x8c, 0xbc, 0x0c, 0x37, 0x00, 0x8c, 0xbd, 0x1a, + 0x67, 0x00, 0x8c, 0xbf, 0x0e, 0x75, 0x00, 0x8c, + 0xc0, 0x05, 0x6c, 0x00, 0x8c, 0xc1, 0x1a, 0x6d, + 0x00, 0x8c, 0xc2, 0x0f, 0xce, 0x00, 0x8c, 0xc3, + 0x0b, 0xde, 0x00, 0x8c, 0xc4, 0x0f, 0xeb, 0x00, + 0x8c, 0xc5, 0x4d, 0x74, 0x00, 0x8c, 0xc6, 0x58, + 0x3a, 0x00, 0x8c, 0xc7, 0x08, 0xbf, 0x00, 0x8c, + 0xc8, 0x1a, 0x6c, 0x00, 0x8c, 0xc9, 0x4d, 0x75, + 0x00, 0x8c, 0xca, 0x0b, 0x11, 0x00, 0x8c, 0xcb, + 0x58, 0x3b, 0x00, 0x8c, 0xcd, 0x1a, 0x7d, 0x00, + 0x8c, 0xce, 0x0a, 0xaa, 0x00, 0x8c, 0xcf, 0x58, + 0x3c, 0x00, 0x8c, 0xd1, 0x0c, 0xd0, 0x00, 0x8c, + 0xd2, 0x4d, 0x76, 0x00, 0x8c, 0xd3, 0x34, 0x44, + 0x00, 0x8c, 0xd5, 0x49, 0x1b, 0x00, 0x8c, 0xd6, + 0x49, 0x1a, 0x00, 0x8c, 0xd9, 0x3b, 0x32, 0x00, + 0x8c, 0xda, 0x1a, 0x70, 0x00, 0x8c, 0xdb, 0x08, + 0x8d, 0x00, 0x8c, 0xdc, 0x08, 0xc0, 0x00, 0x8c, + 0xdd, 0x58, 0x3d, 0x00, 0x8c, 0xde, 0x09, 0xc6, + 0x00, 0x8c, 0xe0, 0x0d, 0x1b, 0x00, 0x8c, 0xe1, + 0x3b, 0x33, 0x00, 0x8c, 0xe2, 0x07, 0x61, 0x00, + 0x8c, 0xe3, 0x1a, 0x6f, 0x00, 0x8c, 0xe4, 0x1a, + 0x6e, 0x00, 0x8c, 0xe6, 0x0d, 0xdc, 0x00, 0x8c, + 0xe8, 0x58, 0x3e, 0x00, 0x8c, 0xea, 0x08, 0xed, + 0x00, 0x8c, 0xec, 0x4d, 0x77, 0x00, 0x8c, 0xed, + 0x0c, 0x4c, 0x00, 0x8c, 0xef, 0x58, 0x3f, 0x00, + 0x8c, 0xf0, 0x21, 0xb2, 0x00, 0x8c, 0xf1, 0x49, + 0x1d, 0x00, 0x8c, 0xf2, 0x58, 0x40, 0x00, 0x8c, + 0xf4, 0x21, 0xb3, 0x00, 0x8c, 0xf5, 0x4d, 0x78, + 0x00, 0x8c, 0xf7, 0x4d, 0x79, 0x00, 0x8c, 0xf8, + 0x3b, 0x34, 0x00, 0x8c, 0xfa, 0x1a, 0x72, 0x00, + 0x8c, 0xfb, 0x1a, 0x73, 0x00, 0x8c, 0xfc, 0x07, + 0xea, 0x00, 0x8c, 0xfd, 0x1a, 0x71, 0x00, 0x8c, + 0xfe, 0x3b, 0x35, 0x00, 0x8c, 0xff, 0x58, 0x41, + 0x00, 0x8d, 0x01, 0x4d, 0x7a, 0x00, 0x8d, 0x03, + 0x4d, 0x7b, 0x00, 0x8d, 0x04, 0x1a, 0x74, 0x00, + 0x8d, 0x05, 0x1a, 0x75, 0x00, 0x8d, 0x07, 0x1a, + 0x77, 0x00, 0x8d, 0x08, 0x0b, 0x03, 0x00, 0x8d, + 0x09, 0x49, 0x1f, 0x00, 0x8d, 0x0a, 0x1a, 0x76, + 0x00, 0x8d, 0x0b, 0x06, 0x22, 0x00, 0x8d, 0x0d, + 0x1a, 0x79, 0x00, 0x8d, 0x0e, 0x49, 0x20, 0x00, + 0x8d, 0x0f, 0x1a, 0x78, 0x00, 0x8d, 0x10, 0x1a, + 0x7a, 0x00, 0x8d, 0x12, 0x21, 0xb4, 0x00, 0x8d, + 0x13, 0x1a, 0x7c, 0x00, 0x8d, 0x14, 0x1a, 0x7e, + 0x00, 0x8d, 0x16, 0x1a, 0x7f, 0x00, 0x8d, 0x17, + 0x4d, 0x7c, 0x00, 0x8d, 0x1b, 0x3b, 0x36, 0x00, + 0x8d, 0x1c, 0x4d, 0x7d, 0x00, 0x8d, 0x64, 0x0a, + 0x7a, 0x00, 0x8d, 0x65, 0x58, 0x42, 0x00, 0x8d, + 0x66, 0x08, 0xfb, 0x00, 0x8d, 0x67, 0x1a, 0x80, + 0x00, 0x8d, 0x69, 0x3b, 0x37, 0x00, 0x8d, 0x6b, + 0x05, 0xb0, 0x00, 0x8d, 0x6c, 0x3b, 0x38, 0x00, + 0x8d, 0x6d, 0x1a, 0x81, 0x00, 0x8d, 0x6e, 0x4d, + 0x7e, 0x00, 0x8d, 0x70, 0x0a, 0xf8, 0x00, 0x8d, + 0x71, 0x1a, 0x82, 0x00, 0x8d, 0x73, 0x1a, 0x83, + 0x00, 0x8d, 0x74, 0x0d, 0xdd, 0x00, 0x8d, 0x76, + 0x21, 0xb5, 0x00, 0x8d, 0x77, 0x06, 0x49, 0x00, + 0x8d, 0x7f, 0x58, 0x43, 0x00, 0x8d, 0x81, 0x1a, + 0x84, 0x00, 0x8d, 0x82, 0x58, 0x44, 0x00, 0x8d, + 0x84, 0x3b, 0x39, 0x00, 0x8d, 0x85, 0x0b, 0xd2, + 0x00, 0x8d, 0x88, 0x58, 0x45, 0x00, 0x8d, 0x8a, + 0x04, 0xfd, 0x00, 0x8d, 0x8d, 0x3b, 0x3a, 0x00, + 0x8d, 0x90, 0x58, 0x46, 0x00, 0x8d, 0x91, 0x4d, + 0x7f, 0x00, 0x8d, 0x95, 0x3b, 0x3b, 0x00, 0x8d, + 0x99, 0x1a, 0x85, 0x00, 0x8d, 0x9e, 0x58, 0x47, + 0x00, 0x8d, 0x9f, 0x4d, 0x80, 0x00, 0x8d, 0xa0, + 0x58, 0x48, 0x00, 0x8d, 0xa3, 0x09, 0x1d, 0x00, + 0x8d, 0xa6, 0x3b, 0x3c, 0x00, 0x8d, 0xa8, 0x0a, + 0x3c, 0x00, 0x8d, 0xab, 0x4d, 0x81, 0x00, 0x8d, + 0xac, 0x58, 0x49, 0x00, 0x8d, 0xaf, 0x42, 0xee, + 0x00, 0x8d, 0xb2, 0x4d, 0x82, 0x00, 0x8d, 0xb3, + 0x0b, 0x0d, 0x00, 0x8d, 0xb5, 0x58, 0x4a, 0x00, + 0x8d, 0xb7, 0x58, 0x4b, 0x00, 0x8d, 0xb9, 0x58, + 0x4c, 0x00, 0x8d, 0xba, 0x1a, 0x88, 0x00, 0x8d, + 0xbb, 0x58, 0x4d, 0x00, 0x8d, 0xbc, 0x58, 0x55, + 0x00, 0x8d, 0xbe, 0x1a, 0x87, 0x00, 0x8d, 0xc0, + 0x58, 0x4e, 0x00, 0x8d, 0xc2, 0x1a, 0x86, 0x00, + 0x8d, 0xc5, 0x58, 0x4f, 0x00, 0x8d, 0xc6, 0x3b, + 0x3d, 0x00, 0x8d, 0xc7, 0x58, 0x50, 0x00, 0x8d, + 0xc8, 0x49, 0x21, 0x00, 0x8d, 0xca, 0x58, 0x51, + 0x00, 0x8d, 0xcb, 0x1a, 0x8e, 0x00, 0x8d, 0xcc, + 0x1a, 0x8c, 0x00, 0x8d, 0xce, 0x3b, 0x3e, 0x00, + 0x8d, 0xcf, 0x1a, 0x89, 0x00, 0x8d, 0xd1, 0x42, + 0xef, 0x00, 0x8d, 0xd4, 0x58, 0x52, 0x00, 0x8d, + 0xd5, 0x4d, 0x83, 0x00, 0x8d, 0xd6, 0x1a, 0x8b, + 0x00, 0x8d, 0xd7, 0x42, 0xf0, 0x00, 0x8d, 0xd9, + 0x49, 0x22, 0x00, 0x8d, 0xda, 0x1a, 0x8a, 0x00, + 0x8d, 0xdb, 0x1a, 0x8d, 0x00, 0x8d, 0xdd, 0x06, + 0x91, 0x00, 0x8d, 0xdf, 0x1a, 0x91, 0x00, 0x8d, + 0xe1, 0x0a, 0x7b, 0x00, 0x8d, 0xe3, 0x1a, 0x92, + 0x00, 0x8d, 0xe4, 0x3b, 0x3f, 0x00, 0x8d, 0xe5, + 0x58, 0x53, 0x00, 0x8d, 0xe7, 0x4d, 0x84, 0x00, + 0x8d, 0xe8, 0x07, 0x8d, 0x00, 0x8d, 0xea, 0x1a, + 0x8f, 0x00, 0x8d, 0xeb, 0x1a, 0x90, 0x00, 0x8d, + 0xec, 0x3b, 0x40, 0x00, 0x8d, 0xef, 0x0f, 0xcf, + 0x00, 0x8d, 0xf0, 0x58, 0x54, 0x00, 0x8d, 0xf1, + 0x4d, 0x85, 0x00, 0x8d, 0xf2, 0x4d, 0x86, 0x00, + 0x8d, 0xf3, 0x0b, 0xd3, 0x00, 0x8d, 0xf4, 0x4d, + 0x87, 0x00, 0x8d, 0xf5, 0x0a, 0xab, 0x00, 0x8d, + 0xfc, 0x1a, 0x93, 0x00, 0x8d, 0xfd, 0x49, 0x25, + 0x00, 0x8d, 0xff, 0x1a, 0x96, 0x00, 0x8e, 0x01, + 0x4d, 0x88, 0x00, 0x8e, 0x04, 0x58, 0x56, 0x00, + 0x8e, 0x05, 0x58, 0x57, 0x00, 0x8e, 0x06, 0x49, + 0x26, 0x00, 0x8e, 0x08, 0x1a, 0x94, 0x00, 0x8e, + 0x09, 0x1a, 0x95, 0x00, 0x8e, 0x0a, 0x0f, 0x43, + 0x00, 0x8e, 0x0b, 0x4d, 0x89, 0x00, 0x8e, 0x0c, + 0x49, 0x23, 0x00, 0x8e, 0x0f, 0x0c, 0x7f, 0x00, + 0x8e, 0x10, 0x1a, 0x99, 0x00, 0x8e, 0x11, 0x58, + 0x58, 0x00, 0x8e, 0x14, 0x49, 0x28, 0x00, 0x8e, + 0x16, 0x49, 0x29, 0x00, 0x8e, 0x1d, 0x1a, 0x97, + 0x00, 0x8e, 0x1e, 0x1a, 0x98, 0x00, 0x8e, 0x1f, + 0x1a, 0x9a, 0x00, 0x8e, 0x20, 0x3b, 0x41, 0x00, + 0x8e, 0x21, 0x49, 0x2a, 0x00, 0x8e, 0x22, 0x49, + 0x2b, 0x00, 0x8e, 0x23, 0x42, 0xf1, 0x00, 0x8e, + 0x26, 0x4d, 0x8a, 0x00, 0x8e, 0x27, 0x49, 0x2c, + 0x00, 0x8e, 0x2a, 0x1a, 0xa8, 0x00, 0x8e, 0x30, + 0x1a, 0x9d, 0x00, 0x8e, 0x31, 0x4d, 0x8b, 0x00, + 0x8e, 0x33, 0x58, 0x59, 0x00, 0x8e, 0x34, 0x1a, + 0x9e, 0x00, 0x8e, 0x35, 0x1a, 0x9c, 0x00, 0x8e, + 0x36, 0x49, 0x2f, 0x00, 0x8e, 0x37, 0x58, 0x5a, + 0x00, 0x8e, 0x38, 0x58, 0x5b, 0x00, 0x8e, 0x39, + 0x49, 0x30, 0x00, 0x8e, 0x3d, 0x42, 0xf2, 0x00, + 0x8e, 0x40, 0x4d, 0x8c, 0x00, 0x8e, 0x41, 0x4d, + 0x8d, 0x00, 0x8e, 0x42, 0x1a, 0x9b, 0x00, 0x8e, + 0x44, 0x0c, 0x19, 0x00, 0x8e, 0x47, 0x1a, 0xa0, + 0x00, 0x8e, 0x48, 0x1a, 0xa4, 0x00, 0x8e, 0x49, + 0x1a, 0xa1, 0x00, 0x8e, 0x4a, 0x1a, 0x9f, 0x00, + 0x8e, 0x4b, 0x3b, 0x42, 0x00, 0x8e, 0x4c, 0x1a, + 0xa2, 0x00, 0x8e, 0x4d, 0x4d, 0x8e, 0x00, 0x8e, + 0x4e, 0x58, 0x5c, 0x00, 0x8e, 0x4f, 0x4d, 0x8f, + 0x00, 0x8e, 0x50, 0x1a, 0xa3, 0x00, 0x8e, 0x54, + 0x49, 0x31, 0x00, 0x8e, 0x55, 0x1a, 0xaa, 0x00, + 0x8e, 0x59, 0x1a, 0xa5, 0x00, 0x8e, 0x5b, 0x58, + 0x5d, 0x00, 0x8e, 0x5c, 0x4d, 0x90, 0x00, 0x8e, + 0x5d, 0x58, 0x5e, 0x00, 0x8e, 0x5e, 0x58, 0x5f, + 0x00, 0x8e, 0x5f, 0x0a, 0x7c, 0x00, 0x8e, 0x60, + 0x1a, 0xa7, 0x00, 0x8e, 0x61, 0x4d, 0x91, 0x00, + 0x8e, 0x62, 0x49, 0x32, 0x00, 0x8e, 0x63, 0x1a, + 0xa9, 0x00, 0x8e, 0x64, 0x1a, 0xa6, 0x00, 0x8e, + 0x69, 0x4d, 0x92, 0x00, 0x8e, 0x6c, 0x3b, 0x43, + 0x00, 0x8e, 0x6d, 0x49, 0x33, 0x00, 0x8e, 0x6f, + 0x49, 0x34, 0x00, 0x8e, 0x70, 0x3b, 0x44, 0x00, + 0x8e, 0x71, 0x4d, 0x93, 0x00, 0x8e, 0x72, 0x1a, + 0xac, 0x00, 0x8e, 0x74, 0x09, 0x3d, 0x00, 0x8e, + 0x75, 0x4d, 0x94, 0x00, 0x8e, 0x76, 0x1a, 0xab, + 0x00, 0x8e, 0x77, 0x4d, 0x95, 0x00, 0x8e, 0x79, + 0x58, 0x60, 0x00, 0x8e, 0x7a, 0x3b, 0x45, 0x00, + 0x8e, 0x7b, 0x42, 0xf3, 0x00, 0x8e, 0x7c, 0x1a, + 0xad, 0x00, 0x8e, 0x81, 0x1a, 0xae, 0x00, 0x8e, + 0x82, 0x58, 0x61, 0x00, 0x8e, 0x83, 0x58, 0x62, + 0x00, 0x8e, 0x84, 0x1a, 0xb1, 0x00, 0x8e, 0x85, + 0x1a, 0xb0, 0x00, 0x8e, 0x87, 0x1a, 0xaf, 0x00, + 0x8e, 0x89, 0x4d, 0x96, 0x00, 0x8e, 0x8a, 0x1a, + 0xb3, 0x00, 0x8e, 0x8b, 0x1a, 0xb2, 0x00, 0x8e, + 0x8d, 0x0f, 0x02, 0x00, 0x8e, 0x90, 0x4d, 0x97, + 0x00, 0x8e, 0x91, 0x1a, 0xb5, 0x00, 0x8e, 0x92, + 0x3b, 0x46, 0x00, 0x8e, 0x93, 0x1a, 0xb4, 0x00, + 0x8e, 0x94, 0x1a, 0xb6, 0x00, 0x8e, 0x95, 0x4d, + 0x98, 0x00, 0x8e, 0x98, 0x49, 0x35, 0x00, 0x8e, + 0x99, 0x1a, 0xb7, 0x00, 0x8e, 0x9a, 0x4d, 0x99, + 0x00, 0x8e, 0x9b, 0x58, 0x63, 0x00, 0x8e, 0x9d, + 0x58, 0x64, 0x00, 0x8e, 0x9e, 0x49, 0x36, 0x00, + 0x8e, 0xa1, 0x1a, 0xb9, 0x00, 0x8e, 0xa2, 0x58, + 0x65, 0x00, 0x8e, 0xa7, 0x4d, 0x9a, 0x00, 0x8e, + 0xa9, 0x4d, 0x9b, 0x00, 0x8e, 0xaa, 0x1a, 0xb8, + 0x00, 0x8e, 0xab, 0x0a, 0x0e, 0x00, 0x8e, 0xac, + 0x1a, 0xba, 0x00, 0x8e, 0xad, 0x4d, 0x9c, 0x00, + 0x8e, 0xae, 0x3b, 0x47, 0x00, 0x8e, 0xaf, 0x06, + 0xe5, 0x00, 0x8e, 0xb0, 0x1a, 0xbb, 0x00, 0x8e, + 0xb1, 0x1a, 0xbd, 0x00, 0x8e, 0xb3, 0x3b, 0x48, + 0x00, 0x8e, 0xb5, 0x49, 0x37, 0x00, 0x8e, 0xb6, + 0x37, 0x03, 0x00, 0x8e, 0xba, 0x58, 0x66, 0x00, + 0x8e, 0xbb, 0x49, 0x38, 0x00, 0x8e, 0xbe, 0x1a, + 0xbe, 0x00, 0x8e, 0xc0, 0x1d, 0xef, 0x00, 0x8e, + 0xc1, 0x58, 0x67, 0x00, 0x8e, 0xc3, 0x58, 0x68, + 0x00, 0x8e, 0xc4, 0x58, 0x69, 0x00, 0x8e, 0xc5, + 0x1a, 0xbf, 0x00, 0x8e, 0xc6, 0x1a, 0xbc, 0x00, + 0x8e, 0xc7, 0x58, 0x6a, 0x00, 0x8e, 0xc8, 0x1a, + 0xc0, 0x00, 0x8e, 0xca, 0x09, 0x02, 0x00, 0x8e, + 0xcb, 0x1a, 0xc1, 0x00, 0x8e, 0xcc, 0x06, 0x4a, + 0x00, 0x8e, 0xcd, 0x07, 0x09, 0x00, 0x8e, 0xcf, + 0x21, 0xb7, 0x00, 0x8e, 0xd1, 0x3b, 0x49, 0x00, + 0x8e, 0xd2, 0x07, 0x62, 0x00, 0x8e, 0xd4, 0x4e, + 0x62, 0x00, 0x8e, 0xdb, 0x1a, 0xc2, 0x00, 0x8e, + 0xdc, 0x58, 0x6b, 0x00, 0x8e, 0xdf, 0x0c, 0xc8, + 0x00, 0x8e, 0xe2, 0x0c, 0x38, 0x00, 0x8e, 0xe3, + 0x1a, 0xc3, 0x00, 0x8e, 0xe8, 0x4d, 0x9d, 0x00, + 0x8e, 0xeb, 0x1a, 0xc6, 0x00, 0x8e, 0xed, 0x58, + 0x6f, 0x00, 0x8e, 0xee, 0x58, 0x6c, 0x00, 0x8e, + 0xf0, 0x4d, 0x9e, 0x00, 0x8e, 0xf1, 0x58, 0x6d, + 0x00, 0x8e, 0xf7, 0x58, 0x6e, 0x00, 0x8e, 0xf8, + 0x08, 0xe0, 0x00, 0x8e, 0xf9, 0x3b, 0x4b, 0x00, + 0x8e, 0xfa, 0x42, 0xf6, 0x00, 0x8e, 0xfb, 0x1a, + 0xc5, 0x00, 0x8e, 0xfc, 0x1a, 0xc4, 0x00, 0x8e, + 0xfd, 0x07, 0x30, 0x00, 0x8e, 0xfe, 0x1a, 0xc7, + 0x00, 0x8f, 0x00, 0x49, 0x3c, 0x00, 0x8f, 0x02, + 0x58, 0x70, 0x00, 0x8f, 0x03, 0x05, 0xb1, 0x00, + 0x8f, 0x05, 0x1a, 0xc9, 0x00, 0x8f, 0x07, 0x4d, + 0x9f, 0x00, 0x8f, 0x08, 0x49, 0x3d, 0x00, 0x8f, + 0x09, 0x08, 0x4c, 0x00, 0x8f, 0x0a, 0x1a, 0xc8, + 0x00, 0x8f, 0x0c, 0x1a, 0xd1, 0x00, 0x8f, 0x0f, + 0x58, 0x71, 0x00, 0x8f, 0x10, 0x58, 0x72, 0x00, + 0x8f, 0x12, 0x1a, 0xcb, 0x00, 0x8f, 0x13, 0x1a, + 0xcd, 0x00, 0x8f, 0x14, 0x0e, 0x35, 0x00, 0x8f, + 0x15, 0x1a, 0xca, 0x00, 0x8f, 0x16, 0x58, 0x73, + 0x00, 0x8f, 0x17, 0x3b, 0x4c, 0x00, 0x8f, 0x18, + 0x4d, 0xa0, 0x00, 0x8f, 0x19, 0x1a, 0xcc, 0x00, + 0x8f, 0x1b, 0x1a, 0xd0, 0x00, 0x8f, 0x1c, 0x1a, + 0xce, 0x00, 0x8f, 0x1d, 0x06, 0x4b, 0x00, 0x8f, + 0x1e, 0x42, 0xf7, 0x00, 0x8f, 0x1f, 0x1a, 0xcf, + 0x00, 0x8f, 0x20, 0x58, 0x74, 0x00, 0x8f, 0x21, + 0x58, 0x75, 0x00, 0x8f, 0x23, 0x58, 0x76, 0x00, + 0x8f, 0x25, 0x4d, 0xa1, 0x00, 0x8f, 0x26, 0x1a, + 0xd2, 0x00, 0x8f, 0x27, 0x4d, 0xa2, 0x00, 0x8f, + 0x28, 0x58, 0x77, 0x00, 0x8f, 0x29, 0x0d, 0x10, + 0x00, 0x8f, 0x2a, 0x0f, 0xa0, 0x00, 0x8f, 0x2b, + 0x49, 0x3e, 0x00, 0x8f, 0x2c, 0x4d, 0xa3, 0x00, + 0x8f, 0x2d, 0x42, 0xf8, 0x00, 0x8f, 0x2e, 0x58, + 0x78, 0x00, 0x8f, 0x2f, 0x09, 0x3e, 0x00, 0x8f, + 0x33, 0x1a, 0xd3, 0x00, 0x8f, 0x34, 0x58, 0x79, + 0x00, 0x8f, 0x35, 0x4d, 0xa4, 0x00, 0x8f, 0x36, + 0x3b, 0x4d, 0x00, 0x8f, 0x37, 0x58, 0x7a, 0x00, + 0x8f, 0x38, 0x0f, 0x0c, 0x00, 0x8f, 0x39, 0x1a, + 0xd5, 0x00, 0x8f, 0x3a, 0x4d, 0xa5, 0x00, 0x8f, + 0x3b, 0x1a, 0xd4, 0x00, 0x8f, 0x3e, 0x1a, 0xd8, + 0x00, 0x8f, 0x3f, 0x0f, 0x2b, 0x00, 0x8f, 0x40, + 0x49, 0x3f, 0x00, 0x8f, 0x41, 0x58, 0x7b, 0x00, + 0x8f, 0x42, 0x1a, 0xd7, 0x00, 0x8f, 0x43, 0x4d, + 0xa6, 0x00, 0x8f, 0x44, 0x05, 0xcb, 0x00, 0x8f, + 0x45, 0x1a, 0xd6, 0x00, 0x8f, 0x46, 0x1a, 0xdb, + 0x00, 0x8f, 0x47, 0x4d, 0xa7, 0x00, 0x8f, 0x49, + 0x1a, 0xda, 0x00, 0x8f, 0x4a, 0x49, 0x40, 0x00, + 0x8f, 0x4c, 0x1a, 0xd9, 0x00, 0x8f, 0x4d, 0x0c, + 0x2c, 0x00, 0x8f, 0x4e, 0x1a, 0xdc, 0x00, 0x8f, + 0x4f, 0x58, 0x7c, 0x00, 0x8f, 0x51, 0x4d, 0xa8, + 0x00, 0x8f, 0x52, 0x58, 0x7d, 0x00, 0x8f, 0x53, + 0x58, 0x7e, 0x00, 0x8f, 0x54, 0x42, 0xf9, 0x00, + 0x8f, 0x55, 0x4d, 0xa9, 0x00, 0x8f, 0x57, 0x1a, + 0xdd, 0x00, 0x8f, 0x58, 0x49, 0x41, 0x00, 0x8f, + 0x5c, 0x1a, 0xde, 0x00, 0x8f, 0x5d, 0x58, 0x7f, + 0x00, 0x8f, 0x5e, 0x58, 0x80, 0x00, 0x8f, 0x5f, + 0x07, 0xfe, 0x00, 0x8f, 0x61, 0x06, 0xfb, 0x00, + 0x8f, 0x62, 0x1a, 0xdf, 0x00, 0x8f, 0x63, 0x1a, + 0xe0, 0x00, 0x8f, 0x64, 0x1a, 0xe1, 0x00, 0x8f, + 0x65, 0x58, 0x81, 0x00, 0x8f, 0x9b, 0x0a, 0x0f, + 0x00, 0x8f, 0x9c, 0x1a, 0xe2, 0x00, 0x8f, 0x9d, + 0x58, 0x82, 0x00, 0x8f, 0x9e, 0x08, 0xd9, 0x00, + 0x8f, 0x9f, 0x1a, 0xe3, 0x00, 0x8f, 0xa0, 0x4d, + 0xaa, 0x00, 0x8f, 0xa1, 0x4d, 0xab, 0x00, 0x8f, + 0xa2, 0x4d, 0xac, 0x00, 0x8f, 0xa3, 0x1a, 0xe4, + 0x00, 0x8f, 0xa4, 0x49, 0x43, 0x00, 0x8f, 0xa5, + 0x4d, 0xad, 0x00, 0x8f, 0xa6, 0x3b, 0x4e, 0x00, + 0x8f, 0xa7, 0x10, 0xb6, 0x00, 0x8f, 0xa8, 0x10, + 0xb5, 0x00, 0x8f, 0xad, 0x1a, 0xe5, 0x00, 0x8f, + 0xae, 0x17, 0xff, 0x00, 0x8f, 0xaf, 0x1a, 0xe6, + 0x00, 0x8f, 0xb0, 0x0b, 0x62, 0x00, 0x8f, 0xb1, + 0x09, 0xf1, 0x00, 0x8f, 0xb2, 0x0c, 0xf6, 0x00, + 0x8f, 0xb4, 0x49, 0x44, 0x00, 0x8f, 0xb5, 0x3b, + 0x4f, 0x00, 0x8f, 0xb6, 0x3b, 0x50, 0x00, 0x8f, + 0xb7, 0x1a, 0xe7, 0x00, 0x8f, 0xb8, 0x58, 0x83, + 0x00, 0x8f, 0xba, 0x0e, 0x25, 0x00, 0x8f, 0xbb, + 0x0b, 0xf0, 0x00, 0x8f, 0xbc, 0x08, 0x10, 0x00, + 0x8f, 0xbe, 0x58, 0x84, 0x00, 0x8f, 0xbf, 0x0b, + 0x67, 0x00, 0x8f, 0xc0, 0x58, 0x85, 0x00, 0x8f, + 0xc1, 0x49, 0x46, 0x00, 0x8f, 0xc2, 0x04, 0xcc, + 0x00, 0x8f, 0xc4, 0x0e, 0xa6, 0x00, 0x8f, 0xc5, + 0x0a, 0x1d, 0x00, 0x8f, 0xc6, 0x49, 0x47, 0x00, + 0x8f, 0xc8, 0x37, 0x99, 0x00, 0x8f, 0xca, 0x49, + 0x49, 0x00, 0x8f, 0xcb, 0x58, 0x86, 0x00, 0x8f, + 0xcd, 0x49, 0x4a, 0x00, 0x8f, 0xce, 0x07, 0x34, + 0x00, 0x8f, 0xd0, 0x58, 0x87, 0x00, 0x8f, 0xd1, + 0x06, 0xd9, 0x00, 0x8f, 0xd2, 0x58, 0x88, 0x00, + 0x8f, 0xd3, 0x49, 0x4b, 0x00, 0x8f, 0xd4, 0x0e, + 0x26, 0x00, 0x8f, 0xd5, 0x49, 0x4c, 0x00, 0x8f, + 0xda, 0x1a, 0xe8, 0x00, 0x8f, 0xe0, 0x3b, 0x52, + 0x00, 0x8f, 0xe2, 0x1a, 0xea, 0x00, 0x8f, 0xe3, + 0x58, 0x89, 0x00, 0x8f, 0xe4, 0x3b, 0x53, 0x00, + 0x8f, 0xe5, 0x1a, 0xe9, 0x00, 0x8f, 0xe6, 0x05, + 0x60, 0x00, 0x8f, 0xe8, 0x42, 0xfb, 0x00, 0x8f, + 0xe9, 0x0c, 0xce, 0x00, 0x8f, 0xea, 0x1a, 0xeb, + 0x00, 0x8f, 0xeb, 0x0d, 0x2d, 0x00, 0x8f, 0xed, + 0x0c, 0x2d, 0x00, 0x8f, 0xee, 0x42, 0xfc, 0x00, + 0x8f, 0xef, 0x1a, 0xec, 0x00, 0x8f, 0xf0, 0x09, + 0x5c, 0x00, 0x8f, 0xf1, 0x49, 0x4d, 0x00, 0x8f, + 0xf4, 0x1a, 0xee, 0x00, 0x8f, 0xf5, 0x49, 0x4e, + 0x00, 0x8f, 0xf6, 0x3b, 0x54, 0x00, 0x8f, 0xf7, + 0x0e, 0xce, 0x00, 0x8f, 0xf8, 0x1a, 0xfd, 0x00, + 0x8f, 0xf9, 0x1a, 0xf0, 0x00, 0x8f, 0xfa, 0x1a, + 0xf1, 0x00, 0x8f, 0xfb, 0x49, 0x4f, 0x00, 0x8f, + 0xfd, 0x0b, 0xe5, 0x00, 0x8f, 0xfe, 0x58, 0x8a, + 0x00, 0x90, 0x00, 0x0b, 0x40, 0x00, 0x90, 0x01, + 0x0a, 0xf9, 0x00, 0x90, 0x02, 0x3b, 0x55, 0x00, + 0x90, 0x03, 0x0c, 0x80, 0x00, 0x90, 0x04, 0x4d, + 0xae, 0x00, 0x90, 0x05, 0x1a, 0xef, 0x00, 0x90, + 0x06, 0x06, 0x6f, 0x00, 0x90, 0x08, 0x42, 0xfd, + 0x00, 0x90, 0x0b, 0x1a, 0xf8, 0x00, 0x90, 0x0c, + 0x49, 0x50, 0x00, 0x90, 0x0d, 0x1a, 0xf5, 0x00, + 0x90, 0x0e, 0x1b, 0x02, 0x00, 0x90, 0x0f, 0x0c, + 0x81, 0x00, 0x90, 0x10, 0x0b, 0x9e, 0x00, 0x90, + 0x11, 0x1a, 0xf2, 0x00, 0x90, 0x13, 0x0c, 0x1a, + 0x00, 0x90, 0x14, 0x0c, 0x4d, 0x00, 0x90, 0x15, + 0x1a, 0xf3, 0x00, 0x90, 0x16, 0x1a, 0xf7, 0x00, + 0x90, 0x17, 0x0a, 0x26, 0x00, 0x90, 0x18, 0x58, + 0x8b, 0x00, 0x90, 0x19, 0x0d, 0x1d, 0x00, 0x90, + 0x1a, 0x0b, 0xe8, 0x00, 0x90, 0x1b, 0x4d, 0xaf, + 0x00, 0x90, 0x1d, 0x0a, 0x66, 0x00, 0x90, 0x1e, + 0x1a, 0xf6, 0x00, 0x90, 0x1f, 0x0b, 0x0e, 0x00, + 0x90, 0x20, 0x0b, 0x04, 0x00, 0x90, 0x21, 0x1a, + 0xf4, 0x00, 0x90, 0x22, 0x04, 0x6d, 0x00, 0x90, + 0x23, 0x37, 0x11, 0x00, 0x90, 0x27, 0x1a, 0xf9, + 0x00, 0x90, 0x28, 0x58, 0x8c, 0x00, 0x90, 0x29, + 0x58, 0x8d, 0x00, 0x90, 0x2a, 0x58, 0x8e, 0x00, + 0x90, 0x2c, 0x3b, 0x56, 0x00, 0x90, 0x2d, 0x42, + 0xfe, 0x00, 0x90, 0x2e, 0x0b, 0x41, 0x00, 0x90, + 0x2f, 0x4d, 0xb0, 0x00, 0x90, 0x31, 0x09, 0x3f, + 0x00, 0x90, 0x32, 0x0a, 0x10, 0x00, 0x90, 0x33, + 0x58, 0x8f, 0x00, 0x90, 0x34, 0x58, 0x90, 0x00, + 0x90, 0x35, 0x1a, 0xfb, 0x00, 0x90, 0x36, 0x1a, + 0xfa, 0x00, 0x90, 0x37, 0x49, 0x51, 0x00, 0x90, + 0x38, 0x04, 0xb3, 0x00, 0x90, 0x39, 0x1a, 0xfc, + 0x00, 0x90, 0x3c, 0x0d, 0xa1, 0x00, 0x90, 0x3e, + 0x1b, 0x04, 0x00, 0x90, 0x3f, 0x58, 0x91, 0x00, + 0x90, 0x41, 0x0c, 0xb3, 0x00, 0x90, 0x42, 0x0a, + 0x31, 0x00, 0x90, 0x43, 0x49, 0x53, 0x00, 0x90, + 0x44, 0x3b, 0x57, 0x00, 0x90, 0x45, 0x0b, 0x97, + 0x00, 0x90, 0x47, 0x06, 0xf0, 0x00, 0x90, 0x49, + 0x1b, 0x03, 0x00, 0x90, 0x4a, 0x0f, 0x21, 0x00, + 0x90, 0x4b, 0x04, 0xe1, 0x00, 0x90, 0x4c, 0x4d, + 0xb1, 0x00, 0x90, 0x4d, 0x0e, 0x27, 0x00, 0x90, + 0x4e, 0x05, 0x61, 0x00, 0x90, 0x4f, 0x1a, 0xfe, + 0x00, 0x90, 0x50, 0x1a, 0xff, 0x00, 0x90, 0x51, + 0x1b, 0x00, 0x00, 0x90, 0x52, 0x1b, 0x01, 0x00, + 0x90, 0x53, 0x0c, 0x93, 0x00, 0x90, 0x54, 0x0b, + 0x61, 0x00, 0x90, 0x55, 0x04, 0xa7, 0x00, 0x90, + 0x56, 0x1b, 0x05, 0x00, 0x90, 0x58, 0x1b, 0x06, + 0x00, 0x90, 0x59, 0x1d, 0x34, 0x00, 0x90, 0x5b, + 0x4d, 0xb2, 0x00, 0x90, 0x5c, 0x0b, 0x1d, 0x00, + 0x90, 0x5d, 0x49, 0x54, 0x00, 0x90, 0x5e, 0x1b, + 0x07, 0x00, 0x90, 0x60, 0x05, 0x15, 0x00, 0x90, + 0x61, 0x0a, 0xce, 0x00, 0x90, 0x62, 0x58, 0x92, + 0x00, 0x90, 0x63, 0x07, 0x63, 0x00, 0x90, 0x65, + 0x0f, 0x44, 0x00, 0x90, 0x66, 0x58, 0x93, 0x00, + 0x90, 0x67, 0x21, 0xba, 0x00, 0x90, 0x68, 0x1b, + 0x08, 0x00, 0x90, 0x69, 0x0c, 0x26, 0x00, 0x90, + 0x6c, 0x58, 0x94, 0x00, 0x90, 0x6d, 0x0a, 0xfa, + 0x00, 0x90, 0x6e, 0x09, 0x03, 0x00, 0x90, 0x6f, + 0x1b, 0x09, 0x00, 0x90, 0x70, 0x4d, 0xb3, 0x00, + 0x90, 0x72, 0x1b, 0x0c, 0x00, 0x90, 0x74, 0x4d, + 0xb4, 0x00, 0x90, 0x75, 0x09, 0x6f, 0x00, 0x90, + 0x76, 0x1b, 0x0a, 0x00, 0x90, 0x77, 0x0a, 0xad, + 0x00, 0x90, 0x78, 0x0a, 0xac, 0x00, 0x90, 0x79, + 0x4d, 0xb5, 0x00, 0x90, 0x7a, 0x04, 0xa8, 0x00, + 0x90, 0x7c, 0x0f, 0x93, 0x00, 0x90, 0x7d, 0x1b, + 0x0e, 0x00, 0x90, 0x7f, 0x0d, 0x86, 0x00, 0x90, + 0x80, 0x1b, 0x10, 0x00, 0x90, 0x81, 0x1b, 0x0f, + 0x00, 0x90, 0x82, 0x1b, 0x0d, 0x00, 0x90, 0x83, + 0x17, 0x37, 0x00, 0x90, 0x84, 0x06, 0x10, 0x00, + 0x90, 0x85, 0x49, 0x57, 0x00, 0x90, 0x87, 0x1a, + 0xed, 0x00, 0x90, 0x88, 0x3b, 0x58, 0x00, 0x90, + 0x89, 0x1b, 0x12, 0x00, 0x90, 0x8a, 0x1b, 0x11, + 0x00, 0x90, 0x8b, 0x4d, 0xb6, 0x00, 0x90, 0x8c, + 0x49, 0x58, 0x00, 0x90, 0x8e, 0x58, 0x95, 0x00, + 0x90, 0x8f, 0x1b, 0x13, 0x00, 0x90, 0x90, 0x49, + 0x59, 0x00, 0x90, 0x91, 0x0f, 0x22, 0x00, 0x90, + 0x95, 0x3b, 0x59, 0x00, 0x90, 0x97, 0x42, 0xff, + 0x00, 0x90, 0x98, 0x4d, 0xb7, 0x00, 0x90, 0x99, + 0x3b, 0x5a, 0x00, 0x90, 0x9b, 0x3b, 0x5b, 0x00, + 0x90, 0xa0, 0x4d, 0xb8, 0x00, 0x90, 0xa1, 0x49, + 0x5a, 0x00, 0x90, 0xa2, 0x3b, 0x5c, 0x00, 0x90, + 0xa3, 0x0c, 0xb9, 0x00, 0x90, 0xa5, 0x58, 0x96, + 0x00, 0x90, 0xa6, 0x0e, 0x5c, 0x00, 0x90, 0xa8, + 0x1b, 0x14, 0x00, 0x90, 0xaa, 0x09, 0x05, 0x00, + 0x90, 0xaf, 0x1b, 0x15, 0x00, 0x90, 0xb0, 0x49, + 0x5c, 0x00, 0x90, 0xb1, 0x1b, 0x16, 0x00, 0x90, + 0xb2, 0x4d, 0xb9, 0x00, 0x90, 0xb3, 0x43, 0x00, + 0x00, 0x90, 0xb4, 0x3b, 0x5d, 0x00, 0x90, 0xb5, + 0x1b, 0x17, 0x00, 0x90, 0xb6, 0x49, 0x5d, 0x00, + 0x90, 0xb8, 0x0c, 0x1b, 0x00, 0x90, 0xbd, 0x4d, + 0xba, 0x00, 0x90, 0xbe, 0x43, 0x01, 0x00, 0x90, + 0xc1, 0x04, 0xae, 0x00, 0x90, 0xc3, 0x49, 0x5e, + 0x00, 0x90, 0xc4, 0x43, 0x02, 0x00, 0x90, 0xc5, + 0x43, 0x03, 0x00, 0x90, 0xc7, 0x43, 0x04, 0x00, + 0x90, 0xc8, 0x49, 0x5f, 0x00, 0x90, 0xc9, 0x4d, + 0xbb, 0x00, 0x90, 0xca, 0x07, 0xeb, 0x00, 0x90, + 0xcc, 0x58, 0x97, 0x00, 0x90, 0xce, 0x0f, 0xe0, + 0x00, 0x90, 0xd2, 0x58, 0x9c, 0x00, 0x90, 0xd5, + 0x58, 0x98, 0x00, 0x90, 0xd7, 0x3b, 0x5e, 0x00, + 0x90, 0xd8, 0x58, 0x99, 0x00, 0x90, 0xd9, 0x58, + 0x9a, 0x00, 0x90, 0xdb, 0x1b, 0x1b, 0x00, 0x90, + 0xdc, 0x49, 0x61, 0x00, 0x90, 0xdd, 0x3b, 0x5f, + 0x00, 0x90, 0xde, 0x21, 0xbb, 0x00, 0x90, 0xdf, + 0x49, 0x62, 0x00, 0x90, 0xe1, 0x07, 0x0a, 0x00, + 0x90, 0xe2, 0x1b, 0x18, 0x00, 0x90, 0xe4, 0x1b, + 0x19, 0x00, 0x90, 0xe5, 0x58, 0x9b, 0x00, 0x90, + 0xe8, 0x0d, 0xe6, 0x00, 0x90, 0xeb, 0x49, 0x67, + 0x00, 0x90, 0xed, 0x05, 0xb2, 0x00, 0x90, 0xef, + 0x43, 0x05, 0x00, 0x90, 0xf0, 0x4d, 0xbc, 0x00, + 0x90, 0xf2, 0x49, 0x65, 0x00, 0x90, 0xf4, 0x3b, + 0x60, 0x00, 0x90, 0xf5, 0x0f, 0x23, 0x00, 0x90, + 0xf6, 0x49, 0x64, 0x00, 0x90, 0xf7, 0x06, 0xb7, + 0x00, 0x90, 0xfd, 0x21, 0xbc, 0x00, 0x90, 0xfe, + 0x49, 0x68, 0x00, 0x90, 0xff, 0x49, 0x69, 0x00, + 0x91, 0x00, 0x49, 0x66, 0x00, 0x91, 0x02, 0x1b, + 0x1c, 0x00, 0x91, 0x04, 0x49, 0x6a, 0x00, 0x91, + 0x05, 0x4d, 0xbd, 0x00, 0x91, 0x06, 0x49, 0x6b, + 0x00, 0x91, 0x08, 0x58, 0x9d, 0x00, 0x91, 0x0d, + 0x58, 0x9e, 0x00, 0x91, 0x10, 0x58, 0x9f, 0x00, + 0x91, 0x12, 0x1b, 0x1d, 0x00, 0x91, 0x14, 0x43, + 0x06, 0x00, 0x91, 0x15, 0x21, 0xbd, 0x00, 0x91, + 0x16, 0x43, 0x07, 0x00, 0x91, 0x17, 0x3b, 0x61, + 0x00, 0x91, 0x18, 0x49, 0x6c, 0x00, 0x91, 0x19, + 0x1b, 0x1e, 0x00, 0x91, 0x1a, 0x58, 0xa0, 0x00, + 0x91, 0x1c, 0x3b, 0x62, 0x00, 0x91, 0x1e, 0x49, + 0x6d, 0x00, 0x91, 0x20, 0x58, 0xa1, 0x00, 0x91, + 0x22, 0x43, 0x08, 0x00, 0x91, 0x23, 0x43, 0x09, + 0x00, 0x91, 0x25, 0x4d, 0xbe, 0x00, 0x91, 0x27, + 0x21, 0xbe, 0x00, 0x91, 0x29, 0x58, 0xa2, 0x00, + 0x91, 0x2d, 0x0c, 0x1c, 0x00, 0x91, 0x2e, 0x58, + 0xa3, 0x00, 0x91, 0x2f, 0x43, 0x0a, 0x00, 0x91, + 0x30, 0x1b, 0x20, 0x00, 0x91, 0x31, 0x3b, 0x63, + 0x00, 0x91, 0x32, 0x1b, 0x1f, 0x00, 0x91, 0x34, + 0x43, 0x0b, 0x00, 0x91, 0x36, 0x58, 0xa4, 0x00, + 0x91, 0x37, 0x49, 0x6e, 0x00, 0x91, 0x39, 0x49, + 0x6f, 0x00, 0x91, 0x3a, 0x3b, 0x64, 0x00, 0x91, + 0x3c, 0x58, 0xa5, 0x00, 0x91, 0x3d, 0x3b, 0x65, + 0x00, 0x91, 0x43, 0x58, 0xa6, 0x00, 0x91, 0x46, + 0x49, 0x70, 0x00, 0x91, 0x47, 0x49, 0x71, 0x00, + 0x91, 0x48, 0x3b, 0x66, 0x00, 0x91, 0x49, 0x0c, + 0xab, 0x00, 0x91, 0x4a, 0x1b, 0x21, 0x00, 0x91, + 0x4b, 0x09, 0x40, 0x00, 0x91, 0x4c, 0x09, 0x0c, + 0x00, 0x91, 0x4d, 0x0d, 0x11, 0x00, 0x91, 0x4e, + 0x0b, 0xaf, 0x00, 0x91, 0x4f, 0x58, 0xa7, 0x00, + 0x91, 0x52, 0x09, 0x1e, 0x00, 0x91, 0x53, 0x58, + 0xa8, 0x00, 0x91, 0x54, 0x0a, 0x32, 0x00, 0x91, + 0x56, 0x1b, 0x22, 0x00, 0x91, 0x57, 0x49, 0x72, + 0x00, 0x91, 0x58, 0x1b, 0x23, 0x00, 0x91, 0x59, + 0x49, 0x73, 0x00, 0x91, 0x5a, 0x4d, 0xbf, 0x00, + 0x91, 0x5b, 0x3b, 0x67, 0x00, 0x91, 0x61, 0x3b, + 0x68, 0x00, 0x91, 0x62, 0x0a, 0x23, 0x00, 0x91, + 0x63, 0x1b, 0x24, 0x00, 0x91, 0x64, 0x3b, 0x69, + 0x00, 0x91, 0x65, 0x1b, 0x25, 0x00, 0x91, 0x67, + 0x4d, 0xc0, 0x00, 0x91, 0x69, 0x1b, 0x26, 0x00, + 0x91, 0x6a, 0x0f, 0x59, 0x00, 0x91, 0x6c, 0x09, + 0x41, 0x00, 0x91, 0x6d, 0x58, 0xa9, 0x00, 0x91, + 0x72, 0x1b, 0x28, 0x00, 0x91, 0x73, 0x1b, 0x27, + 0x00, 0x91, 0x74, 0x49, 0x74, 0x00, 0x91, 0x75, + 0x07, 0xec, 0x00, 0x91, 0x77, 0x08, 0x05, 0x00, + 0x91, 0x78, 0x08, 0x8e, 0x00, 0x91, 0x79, 0x49, + 0x75, 0x00, 0x91, 0x7a, 0x4d, 0xc1, 0x00, 0x91, + 0x7b, 0x58, 0xaa, 0x00, 0x91, 0x81, 0x58, 0xab, + 0x00, 0x91, 0x82, 0x1b, 0x2b, 0x00, 0x91, 0x83, + 0x43, 0x0c, 0x00, 0x91, 0x85, 0x49, 0x76, 0x00, + 0x91, 0x86, 0x58, 0xac, 0x00, 0x91, 0x87, 0x09, + 0x70, 0x00, 0x91, 0x89, 0x1b, 0x2a, 0x00, 0x91, + 0x8a, 0x4d, 0xc2, 0x00, 0x91, 0x8b, 0x1b, 0x29, + 0x00, 0x91, 0x8d, 0x0b, 0x49, 0x00, 0x91, 0x8e, + 0x3b, 0x6a, 0x00, 0x91, 0x90, 0x07, 0xa3, 0x00, + 0x91, 0x91, 0x4d, 0xc3, 0x00, 0x91, 0x92, 0x0a, + 0x67, 0x00, 0x91, 0x93, 0x58, 0xad, 0x00, 0x91, + 0x94, 0x58, 0xae, 0x00, 0x91, 0x95, 0x4d, 0xc4, + 0x00, 0x91, 0x97, 0x0d, 0x44, 0x00, 0x91, 0x98, + 0x58, 0xaf, 0x00, 0x91, 0x9c, 0x09, 0x43, 0x00, + 0x91, 0x9e, 0x3b, 0x6b, 0x00, 0x91, 0xa1, 0x58, + 0xb0, 0x00, 0x91, 0xa2, 0x1b, 0x2c, 0x00, 0x91, + 0xa4, 0x09, 0xc7, 0x00, 0x91, 0xa6, 0x58, 0xb1, + 0x00, 0x91, 0xa8, 0x3b, 0x6c, 0x00, 0x91, 0xaa, + 0x1b, 0x2f, 0x00, 0x91, 0xab, 0x1b, 0x2d, 0x00, + 0x91, 0xac, 0x1e, 0x1b, 0x00, 0x91, 0xad, 0x3b, + 0x6d, 0x00, 0x91, 0xae, 0x3b, 0x6e, 0x00, 0x91, + 0xaf, 0x1b, 0x2e, 0x00, 0x91, 0xb0, 0x4d, 0xc5, + 0x00, 0x91, 0xb1, 0x1e, 0x61, 0x00, 0x91, 0xb2, + 0x3b, 0x6f, 0x00, 0x91, 0xb3, 0x49, 0x77, 0x00, + 0x91, 0xb4, 0x1b, 0x31, 0x00, 0x91, 0xb5, 0x1b, + 0x30, 0x00, 0x91, 0xb6, 0x49, 0x78, 0x00, 0x91, + 0xb8, 0x09, 0xe2, 0x00, 0x91, 0xba, 0x1b, 0x32, + 0x00, 0x91, 0xbb, 0x4d, 0xc6, 0x00, 0x91, 0xbc, + 0x3b, 0x70, 0x00, 0x91, 0xbd, 0x4d, 0xc7, 0x00, + 0x91, 0xbf, 0x58, 0xb2, 0x00, 0x91, 0xc0, 0x1b, + 0x33, 0x00, 0x91, 0xc1, 0x1b, 0x34, 0x00, 0x91, + 0xc2, 0x4d, 0xc8, 0x00, 0x91, 0xc3, 0x49, 0x79, + 0x00, 0x91, 0xc4, 0x49, 0x7a, 0x00, 0x91, 0xc5, + 0x4d, 0xc9, 0x00, 0x91, 0xc6, 0x0d, 0x64, 0x00, + 0x91, 0xc7, 0x08, 0x43, 0x00, 0x91, 0xc8, 0x09, + 0x0d, 0x00, 0x91, 0xc9, 0x1b, 0x35, 0x00, 0x91, + 0xcb, 0x1b, 0x36, 0x00, 0x91, 0xcc, 0x0f, 0x6c, + 0x00, 0x91, 0xcd, 0x09, 0x4f, 0x00, 0x91, 0xce, + 0x0e, 0xfa, 0x00, 0x91, 0xcf, 0x0f, 0x94, 0x00, + 0x91, 0xd0, 0x1b, 0x37, 0x00, 0x91, 0xd1, 0x06, + 0xda, 0x00, 0x91, 0xd3, 0x58, 0xb3, 0x00, 0x91, + 0xd4, 0x58, 0xb4, 0x00, 0x91, 0xd6, 0x1b, 0x38, + 0x00, 0x91, 0xd7, 0x21, 0xc0, 0x00, 0x91, 0xd8, + 0x0c, 0x1d, 0x00, 0x91, 0xd9, 0x58, 0xb5, 0x00, + 0x91, 0xda, 0x21, 0xbf, 0x00, 0x91, 0xdb, 0x1b, + 0x3b, 0x00, 0x91, 0xdc, 0x05, 0xd6, 0x00, 0x91, + 0xdd, 0x0a, 0x11, 0x00, 0x91, 0xde, 0x21, 0xc1, + 0x00, 0x91, 0xdf, 0x1b, 0x39, 0x00, 0x91, 0xe1, + 0x1b, 0x3a, 0x00, 0x91, 0xe3, 0x0b, 0xfc, 0x00, + 0x91, 0xe4, 0x21, 0xc4, 0x00, 0x91, 0xe5, 0x21, + 0xc5, 0x00, 0x91, 0xe6, 0x0e, 0x83, 0x00, 0x91, + 0xe7, 0x06, 0xf4, 0x00, 0x91, 0xe9, 0x58, 0xb6, + 0x00, 0x91, 0xea, 0x58, 0xb7, 0x00, 0x91, 0xec, + 0x49, 0x7d, 0x00, 0x91, 0xed, 0x21, 0xc2, 0x00, + 0x91, 0xee, 0x21, 0xc3, 0x00, 0x91, 0xef, 0x58, + 0xb8, 0x00, 0x91, 0xf0, 0x3b, 0x71, 0x00, 0x91, + 0xf1, 0x43, 0x0d, 0x00, 0x91, 0xf5, 0x1b, 0x3d, + 0x00, 0x91, 0xf6, 0x1b, 0x3e, 0x00, 0x91, 0xf7, + 0x3b, 0x72, 0x00, 0x91, 0xf9, 0x58, 0xb9, 0x00, + 0x91, 0xfb, 0x3b, 0x73, 0x00, 0x91, 0xfc, 0x1b, + 0x3c, 0x00, 0x91, 0xfd, 0x58, 0xba, 0x00, 0x91, + 0xff, 0x1b, 0x40, 0x00, 0x92, 0x00, 0x4d, 0xca, + 0x00, 0x92, 0x01, 0x49, 0x7e, 0x00, 0x92, 0x04, + 0x58, 0xbb, 0x00, 0x92, 0x05, 0x58, 0xbc, 0x00, + 0x92, 0x06, 0x21, 0xc6, 0x00, 0x92, 0x07, 0x3b, + 0x74, 0x00, 0x92, 0x09, 0x4d, 0xcb, 0x00, 0x92, + 0x0a, 0x21, 0xc8, 0x00, 0x92, 0x0c, 0x58, 0xbd, + 0x00, 0x92, 0x0d, 0x0c, 0xb7, 0x00, 0x92, 0x0e, + 0x05, 0xa1, 0x00, 0x92, 0x10, 0x21, 0xc7, 0x00, + 0x92, 0x11, 0x1b, 0x44, 0x00, 0x92, 0x12, 0x58, + 0xbe, 0x00, 0x92, 0x13, 0x58, 0xbf, 0x00, 0x92, + 0x14, 0x1b, 0x41, 0x00, 0x92, 0x15, 0x1b, 0x43, + 0x00, 0x92, 0x16, 0x49, 0x7f, 0x00, 0x92, 0x17, + 0x49, 0x80, 0x00, 0x92, 0x18, 0x58, 0xc0, 0x00, + 0x92, 0x1c, 0x58, 0xc1, 0x00, 0x92, 0x1d, 0x58, + 0xc2, 0x00, 0x92, 0x1e, 0x1b, 0x3f, 0x00, 0x92, + 0x23, 0x4d, 0xcc, 0x00, 0x92, 0x24, 0x58, 0xc3, + 0x00, 0x92, 0x25, 0x58, 0xc4, 0x00, 0x92, 0x26, + 0x58, 0xc5, 0x00, 0x92, 0x28, 0x3b, 0x75, 0x00, + 0x92, 0x29, 0x1b, 0x8a, 0x00, 0x92, 0x2c, 0x1b, + 0x42, 0x00, 0x92, 0x2e, 0x58, 0xc6, 0x00, 0x92, + 0x2f, 0x58, 0xc7, 0x00, 0x92, 0x30, 0x58, 0xc8, + 0x00, 0x92, 0x33, 0x3b, 0x76, 0x00, 0x92, 0x34, + 0x0f, 0xb3, 0x00, 0x92, 0x35, 0x58, 0xc9, 0x00, + 0x92, 0x36, 0x58, 0xca, 0x00, 0x92, 0x37, 0x07, + 0x8e, 0x00, 0x92, 0x38, 0x3b, 0x77, 0x00, 0x92, + 0x39, 0x21, 0xcf, 0x00, 0x92, 0x3a, 0x21, 0xc9, + 0x00, 0x92, 0x3c, 0x21, 0xcb, 0x00, 0x92, 0x3e, + 0x58, 0xcb, 0x00, 0x92, 0x3f, 0x1b, 0x4c, 0x00, + 0x92, 0x40, 0x21, 0xca, 0x00, 0x92, 0x42, 0x49, + 0x82, 0x00, 0x92, 0x43, 0x3b, 0x78, 0x00, 0x92, + 0x44, 0x0c, 0x2e, 0x00, 0x92, 0x45, 0x1b, 0x47, + 0x00, 0x92, 0x46, 0x58, 0xcc, 0x00, 0x92, 0x47, + 0x3b, 0x79, 0x00, 0x92, 0x48, 0x1b, 0x4a, 0x00, + 0x92, 0x49, 0x1b, 0x48, 0x00, 0x92, 0x4a, 0x49, + 0x83, 0x00, 0x92, 0x4b, 0x1b, 0x4d, 0x00, 0x92, + 0x4d, 0x58, 0xcd, 0x00, 0x92, 0x4e, 0x21, 0xcc, + 0x00, 0x92, 0x4f, 0x3b, 0x7a, 0x00, 0x92, 0x50, + 0x1b, 0x4e, 0x00, 0x92, 0x51, 0x21, 0xce, 0x00, + 0x92, 0x56, 0x49, 0x84, 0x00, 0x92, 0x57, 0x1b, + 0x46, 0x00, 0x92, 0x58, 0x58, 0xce, 0x00, 0x92, + 0x59, 0x21, 0xcd, 0x00, 0x92, 0x5a, 0x1b, 0x53, + 0x00, 0x92, 0x5b, 0x05, 0x16, 0x00, 0x92, 0x5c, + 0x58, 0xcf, 0x00, 0x92, 0x5d, 0x58, 0xd0, 0x00, + 0x92, 0x5e, 0x1b, 0x45, 0x00, 0x92, 0x60, 0x3b, + 0x7b, 0x00, 0x92, 0x61, 0x49, 0x85, 0x00, 0x92, + 0x62, 0x0d, 0x41, 0x00, 0x92, 0x64, 0x1b, 0x49, + 0x00, 0x92, 0x65, 0x49, 0x86, 0x00, 0x92, 0x66, + 0x09, 0xc8, 0x00, 0x92, 0x67, 0x21, 0xd0, 0x00, + 0x92, 0x68, 0x49, 0x87, 0x00, 0x92, 0x69, 0x58, + 0xd1, 0x00, 0x92, 0x6e, 0x58, 0xd2, 0x00, 0x92, + 0x6f, 0x58, 0xd3, 0x00, 0x92, 0x70, 0x58, 0xd4, + 0x00, 0x92, 0x71, 0x07, 0xed, 0x00, 0x92, 0x75, + 0x58, 0xd5, 0x00, 0x92, 0x76, 0x4d, 0xcd, 0x00, + 0x92, 0x77, 0x21, 0xd2, 0x00, 0x92, 0x78, 0x21, + 0xd3, 0x00, 0x92, 0x79, 0x58, 0xd6, 0x00, 0x92, + 0x7b, 0x58, 0xd7, 0x00, 0x92, 0x7c, 0x49, 0x89, + 0x00, 0x92, 0x7d, 0x49, 0x8a, 0x00, 0x92, 0x7e, + 0x0e, 0x76, 0x00, 0x92, 0x7f, 0x49, 0x8b, 0x00, + 0x92, 0x80, 0x06, 0xdc, 0x00, 0x92, 0x83, 0x09, + 0x50, 0x00, 0x92, 0x85, 0x0c, 0x94, 0x00, 0x92, + 0x88, 0x20, 0xaa, 0x00, 0x92, 0x89, 0x49, 0x8c, + 0x00, 0x92, 0x8a, 0x58, 0xd8, 0x00, 0x92, 0x8d, + 0x49, 0x8d, 0x00, 0x92, 0x8e, 0x4d, 0xce, 0x00, + 0x92, 0x91, 0x0a, 0xaf, 0x00, 0x92, 0x92, 0x58, + 0xd9, 0x00, 0x92, 0x93, 0x1b, 0x51, 0x00, 0x92, + 0x95, 0x1b, 0x4b, 0x00, 0x92, 0x96, 0x1b, 0x50, + 0x00, 0x92, 0x97, 0x49, 0x8e, 0x00, 0x92, 0x98, + 0x0e, 0xcf, 0x00, 0x92, 0x99, 0x49, 0x8f, 0x00, + 0x92, 0x9a, 0x0b, 0xd4, 0x00, 0x92, 0x9b, 0x1b, + 0x52, 0x00, 0x92, 0x9c, 0x1b, 0x4f, 0x00, 0x92, + 0x9f, 0x49, 0x90, 0x00, 0x92, 0xa0, 0x58, 0xda, + 0x00, 0x92, 0xa4, 0x58, 0xdb, 0x00, 0x92, 0xa5, + 0x58, 0xdc, 0x00, 0x92, 0xa7, 0x21, 0xd1, 0x00, + 0x92, 0xa8, 0x58, 0xdd, 0x00, 0x92, 0xab, 0x49, + 0x91, 0x00, 0x92, 0xad, 0x0a, 0xae, 0x00, 0x92, + 0xaf, 0x4d, 0xcf, 0x00, 0x92, 0xb2, 0x49, 0x94, + 0x00, 0x92, 0xb3, 0x35, 0x54, 0x00, 0x92, 0xb6, + 0x58, 0xde, 0x00, 0x92, 0xb7, 0x1b, 0x56, 0x00, + 0x92, 0xb8, 0x58, 0xdf, 0x00, 0x92, 0xb9, 0x1b, + 0x55, 0x00, 0x92, 0xba, 0x58, 0xe0, 0x00, 0x92, + 0xbb, 0x4d, 0xd0, 0x00, 0x92, 0xbc, 0x4d, 0xd1, + 0x00, 0x92, 0xbd, 0x58, 0xe1, 0x00, 0x92, 0xbf, + 0x49, 0x95, 0x00, 0x92, 0xc0, 0x49, 0x96, 0x00, + 0x92, 0xc1, 0x4d, 0xd2, 0x00, 0x92, 0xc2, 0x3b, + 0x7c, 0x00, 0x92, 0xc3, 0x4d, 0xd3, 0x00, 0x92, + 0xc5, 0x4d, 0xd4, 0x00, 0x92, 0xc6, 0x49, 0x97, + 0x00, 0x92, 0xc7, 0x58, 0xe2, 0x00, 0x92, 0xc8, + 0x4d, 0xd5, 0x00, 0x92, 0xcb, 0x3b, 0x7d, 0x00, + 0x92, 0xcc, 0x3b, 0x7e, 0x00, 0x92, 0xcd, 0x58, + 0xe3, 0x00, 0x92, 0xce, 0x49, 0x98, 0x00, 0x92, + 0xcf, 0x1b, 0x54, 0x00, 0x92, 0xd0, 0x21, 0xd7, + 0x00, 0x92, 0xd2, 0x0e, 0x5d, 0x00, 0x92, 0xd3, + 0x21, 0xdb, 0x00, 0x92, 0xd5, 0x21, 0xd9, 0x00, + 0x92, 0xd7, 0x21, 0xd5, 0x00, 0x92, 0xd8, 0x58, + 0xe4, 0x00, 0x92, 0xd9, 0x21, 0xd6, 0x00, 0x92, + 0xdc, 0x58, 0xe5, 0x00, 0x92, 0xdd, 0x58, 0xe6, + 0x00, 0x92, 0xdf, 0x3b, 0x7f, 0x00, 0x92, 0xe0, + 0x21, 0xda, 0x00, 0x92, 0xe1, 0x58, 0xe7, 0x00, + 0x92, 0xe3, 0x58, 0xe8, 0x00, 0x92, 0xe4, 0x09, + 0x85, 0x00, 0x92, 0xe5, 0x49, 0x99, 0x00, 0x92, + 0xe7, 0x21, 0xd4, 0x00, 0x92, 0xe8, 0x58, 0xe9, + 0x00, 0x92, 0xe9, 0x1b, 0x57, 0x00, 0x92, 0xea, + 0x0e, 0x2f, 0x00, 0x92, 0xec, 0x58, 0xea, 0x00, + 0x92, 0xed, 0x04, 0xf6, 0x00, 0x92, 0xee, 0x58, + 0xeb, 0x00, 0x92, 0xf0, 0x58, 0xec, 0x00, 0x92, + 0xf2, 0x0d, 0xb8, 0x00, 0x92, 0xf3, 0x0b, 0xb0, + 0x00, 0x92, 0xf7, 0x49, 0x9d, 0x00, 0x92, 0xf8, + 0x06, 0x92, 0x00, 0x92, 0xf9, 0x20, 0xb0, 0x00, + 0x92, 0xfa, 0x1b, 0x59, 0x00, 0x92, 0xfb, 0x21, + 0xde, 0x00, 0x92, 0xfc, 0x07, 0xef, 0x00, 0x92, + 0xff, 0x21, 0xe1, 0x00, 0x93, 0x00, 0x58, 0xed, + 0x00, 0x93, 0x02, 0x21, 0xe3, 0x00, 0x93, 0x04, + 0x34, 0x5a, 0x00, 0x93, 0x06, 0x08, 0x7a, 0x00, + 0x93, 0x08, 0x58, 0xee, 0x00, 0x93, 0x0d, 0x3b, + 0x80, 0x00, 0x93, 0x0f, 0x1b, 0x58, 0x00, 0x93, + 0x10, 0x0a, 0x33, 0x00, 0x93, 0x11, 0x49, 0x9a, + 0x00, 0x93, 0x14, 0x4d, 0xd6, 0x00, 0x93, 0x15, + 0x3b, 0x81, 0x00, 0x93, 0x18, 0x0a, 0x34, 0x00, + 0x93, 0x19, 0x1b, 0x5c, 0x00, 0x93, 0x1a, 0x1b, + 0x5e, 0x00, 0x93, 0x1c, 0x58, 0xef, 0x00, 0x93, + 0x1d, 0x21, 0xe2, 0x00, 0x93, 0x1e, 0x21, 0xe0, + 0x00, 0x93, 0x1f, 0x3b, 0x82, 0x00, 0x93, 0x20, + 0x09, 0xe3, 0x00, 0x93, 0x21, 0x21, 0xdd, 0x00, + 0x93, 0x22, 0x1b, 0x5d, 0x00, 0x93, 0x23, 0x1b, + 0x5f, 0x00, 0x93, 0x24, 0x58, 0xf0, 0x00, 0x93, + 0x25, 0x21, 0xdc, 0x00, 0x93, 0x26, 0x06, 0xcb, + 0x00, 0x93, 0x27, 0x3b, 0x83, 0x00, 0x93, 0x28, + 0x0d, 0xb7, 0x00, 0x93, 0x29, 0x49, 0x9e, 0x00, + 0x93, 0x2a, 0x58, 0xf1, 0x00, 0x93, 0x2b, 0x09, + 0x0e, 0x00, 0x93, 0x2c, 0x0f, 0xc9, 0x00, 0x93, + 0x2e, 0x1b, 0x5b, 0x00, 0x93, 0x2f, 0x08, 0x68, + 0x00, 0x93, 0x32, 0x0f, 0xe5, 0x00, 0x93, 0x33, + 0x4d, 0xd7, 0x00, 0x93, 0x34, 0x58, 0xf2, 0x00, + 0x93, 0x35, 0x1b, 0x61, 0x00, 0x93, 0x36, 0x4d, + 0xd8, 0x00, 0x93, 0x37, 0x58, 0xf3, 0x00, 0x93, + 0x3a, 0x1b, 0x60, 0x00, 0x93, 0x3b, 0x1b, 0x62, + 0x00, 0x93, 0x44, 0x1b, 0x5a, 0x00, 0x93, 0x47, + 0x3b, 0x84, 0x00, 0x93, 0x48, 0x20, 0xa9, 0x00, + 0x93, 0x49, 0x43, 0x0e, 0x00, 0x93, 0x4a, 0x34, + 0x58, 0x00, 0x93, 0x4b, 0x0c, 0xc1, 0x00, 0x93, + 0x4d, 0x0c, 0x4f, 0x00, 0x93, 0x50, 0x58, 0xf4, + 0x00, 0x93, 0x51, 0x49, 0xa1, 0x00, 0x93, 0x52, + 0x3b, 0x85, 0x00, 0x93, 0x54, 0x0b, 0xf3, 0x00, + 0x93, 0x55, 0x58, 0xf5, 0x00, 0x93, 0x56, 0x1b, + 0x67, 0x00, 0x93, 0x57, 0x21, 0xe5, 0x00, 0x93, + 0x58, 0x4d, 0xd9, 0x00, 0x93, 0x5a, 0x49, 0xa2, + 0x00, 0x93, 0x5b, 0x0b, 0x81, 0x00, 0x93, 0x5c, + 0x1b, 0x63, 0x00, 0x93, 0x5e, 0x58, 0xf6, 0x00, + 0x93, 0x60, 0x1b, 0x64, 0x00, 0x93, 0x64, 0x43, + 0x0f, 0x00, 0x93, 0x65, 0x43, 0x10, 0x00, 0x93, + 0x67, 0x58, 0xf7, 0x00, 0x93, 0x69, 0x58, 0xf8, + 0x00, 0x93, 0x6a, 0x3b, 0x87, 0x00, 0x93, 0x6b, + 0x49, 0xa3, 0x00, 0x93, 0x6c, 0x07, 0x03, 0x00, + 0x93, 0x6d, 0x3b, 0x88, 0x00, 0x93, 0x6e, 0x1b, + 0x66, 0x00, 0x93, 0x6f, 0x58, 0xf9, 0x00, 0x93, + 0x70, 0x21, 0xe4, 0x00, 0x93, 0x71, 0x49, 0xa4, + 0x00, 0x93, 0x73, 0x49, 0xa5, 0x00, 0x93, 0x74, + 0x58, 0xfa, 0x00, 0x93, 0x75, 0x07, 0x64, 0x00, + 0x93, 0x76, 0x58, 0xfb, 0x00, 0x93, 0x7a, 0x58, + 0xfc, 0x00, 0x93, 0x7c, 0x1b, 0x65, 0x00, 0x93, + 0x7d, 0x58, 0xfd, 0x00, 0x93, 0x7e, 0x09, 0xc9, + 0x00, 0x93, 0x7f, 0x4d, 0xda, 0x00, 0x93, 0x80, + 0x58, 0xfe, 0x00, 0x93, 0x81, 0x58, 0xff, 0x00, + 0x93, 0x82, 0x4d, 0xdb, 0x00, 0x93, 0x88, 0x49, + 0xa9, 0x00, 0x93, 0x8a, 0x4d, 0xdc, 0x00, 0x93, + 0x8b, 0x49, 0xaa, 0x00, 0x93, 0x8c, 0x05, 0xd7, + 0x00, 0x93, 0x8d, 0x59, 0x00, 0x00, 0x93, 0x8f, + 0x49, 0xab, 0x00, 0x93, 0x92, 0x59, 0x01, 0x00, + 0x93, 0x94, 0x1b, 0x6b, 0x00, 0x93, 0x95, 0x59, + 0x02, 0x00, 0x93, 0x96, 0x08, 0x2f, 0x00, 0x93, + 0x97, 0x0a, 0xfb, 0x00, 0x93, 0x98, 0x59, 0x03, + 0x00, 0x93, 0x9a, 0x0b, 0xe6, 0x00, 0x93, 0x9b, + 0x3b, 0x89, 0x00, 0x93, 0x9e, 0x49, 0xac, 0x00, + 0x93, 0xa1, 0x49, 0xa6, 0x00, 0x93, 0xa3, 0x43, + 0x11, 0x00, 0x93, 0xa4, 0x21, 0xe6, 0x00, 0x93, + 0xa6, 0x59, 0x05, 0x00, 0x93, 0xa7, 0x05, 0x99, + 0x00, 0x93, 0xa8, 0x59, 0x06, 0x00, 0x93, 0xa9, + 0x3b, 0x8b, 0x00, 0x93, 0xab, 0x59, 0x07, 0x00, + 0x93, 0xac, 0x1b, 0x69, 0x00, 0x93, 0xad, 0x1b, + 0x6a, 0x00, 0x93, 0xae, 0x0b, 0xdf, 0x00, 0x93, + 0xb0, 0x1b, 0x68, 0x00, 0x93, 0xb4, 0x59, 0x08, + 0x00, 0x93, 0xb5, 0x59, 0x09, 0x00, 0x93, 0xb6, + 0x59, 0x0a, 0x00, 0x93, 0xb9, 0x1b, 0x6c, 0x00, + 0x93, 0xba, 0x3b, 0x8a, 0x00, 0x93, 0xbb, 0x4d, + 0xdd, 0x00, 0x93, 0xc1, 0x3b, 0x8c, 0x00, 0x93, + 0xc3, 0x1b, 0x72, 0x00, 0x93, 0xc4, 0x59, 0x0b, + 0x00, 0x93, 0xc5, 0x59, 0x0c, 0x00, 0x93, 0xc6, + 0x21, 0xe7, 0x00, 0x93, 0xc7, 0x49, 0xb1, 0x00, + 0x93, 0xc8, 0x1b, 0x75, 0x00, 0x93, 0xc9, 0x59, + 0x0d, 0x00, 0x93, 0xca, 0x3b, 0x8d, 0x00, 0x93, + 0xcb, 0x59, 0x0e, 0x00, 0x93, 0xcc, 0x4d, 0xde, + 0x00, 0x93, 0xcd, 0x59, 0x0f, 0x00, 0x93, 0xd0, + 0x1b, 0x74, 0x00, 0x93, 0xd1, 0x0c, 0x27, 0x00, + 0x93, 0xd3, 0x59, 0x10, 0x00, 0x93, 0xd6, 0x1b, + 0x6d, 0x00, 0x93, 0xd7, 0x1b, 0x6e, 0x00, 0x93, + 0xd8, 0x1b, 0x71, 0x00, 0x93, 0xd9, 0x59, 0x11, + 0x00, 0x93, 0xdc, 0x49, 0xb2, 0x00, 0x93, 0xdd, + 0x1b, 0x73, 0x00, 0x93, 0xde, 0x21, 0xe8, 0x00, + 0x93, 0xdf, 0x43, 0x12, 0x00, 0x93, 0xe1, 0x06, + 0xb8, 0x00, 0x93, 0xe2, 0x3b, 0x8e, 0x00, 0x93, + 0xe4, 0x1b, 0x76, 0x00, 0x93, 0xe5, 0x1b, 0x70, + 0x00, 0x93, 0xe6, 0x4d, 0xdf, 0x00, 0x93, 0xe7, + 0x49, 0xb3, 0x00, 0x93, 0xe8, 0x1b, 0x6f, 0x00, + 0x93, 0xf1, 0x49, 0xb0, 0x00, 0x93, 0xf5, 0x49, + 0xad, 0x00, 0x93, 0xf7, 0x59, 0x12, 0x00, 0x93, + 0xf8, 0x21, 0xe9, 0x00, 0x93, 0xf9, 0x4d, 0xe0, + 0x00, 0x93, 0xfa, 0x3b, 0x8f, 0x00, 0x93, 0xfb, + 0x49, 0xb7, 0x00, 0x93, 0xfd, 0x3b, 0x90, 0x00, + 0x94, 0x01, 0x59, 0x13, 0x00, 0x94, 0x02, 0x4d, + 0xe1, 0x00, 0x94, 0x03, 0x1b, 0x7a, 0x00, 0x94, + 0x04, 0x43, 0x13, 0x00, 0x94, 0x07, 0x1b, 0x7b, + 0x00, 0x94, 0x08, 0x59, 0x14, 0x00, 0x94, 0x09, + 0x49, 0xb4, 0x00, 0x94, 0x0d, 0x4d, 0xe2, 0x00, + 0x94, 0x0e, 0x4d, 0xe3, 0x00, 0x94, 0x0f, 0x3b, + 0x91, 0x00, 0x94, 0x10, 0x1b, 0x7c, 0x00, 0x94, + 0x13, 0x1b, 0x79, 0x00, 0x94, 0x14, 0x1b, 0x78, + 0x00, 0x94, 0x15, 0x59, 0x15, 0x00, 0x94, 0x16, + 0x49, 0xb5, 0x00, 0x94, 0x17, 0x49, 0xb6, 0x00, + 0x94, 0x18, 0x09, 0xca, 0x00, 0x94, 0x19, 0x0c, + 0x82, 0x00, 0x94, 0x1a, 0x1b, 0x77, 0x00, 0x94, + 0x1f, 0x59, 0x16, 0x00, 0x94, 0x21, 0x1b, 0x80, + 0x00, 0x94, 0x2b, 0x1b, 0x7e, 0x00, 0x94, 0x2e, + 0x4d, 0xe4, 0x00, 0x94, 0x2f, 0x59, 0x17, 0x00, + 0x94, 0x31, 0x21, 0xea, 0x00, 0x94, 0x32, 0x49, + 0xb8, 0x00, 0x94, 0x33, 0x43, 0x14, 0x00, 0x94, + 0x34, 0x3b, 0x92, 0x00, 0x94, 0x35, 0x1b, 0x7f, + 0x00, 0x94, 0x36, 0x1b, 0x7d, 0x00, 0x94, 0x38, + 0x0b, 0x58, 0x00, 0x94, 0x3a, 0x1b, 0x81, 0x00, + 0x94, 0x3b, 0x49, 0xb9, 0x00, 0x94, 0x3d, 0x59, + 0x18, 0x00, 0x94, 0x3f, 0x3b, 0x93, 0x00, 0x94, + 0x41, 0x1b, 0x82, 0x00, 0x94, 0x43, 0x59, 0x19, + 0x00, 0x94, 0x44, 0x1b, 0x84, 0x00, 0x94, 0x45, + 0x21, 0xeb, 0x00, 0x94, 0x48, 0x21, 0xec, 0x00, + 0x94, 0x4a, 0x43, 0x15, 0x00, 0x94, 0x4c, 0x4d, + 0xe5, 0x00, 0x94, 0x51, 0x06, 0x11, 0x00, 0x94, + 0x52, 0x1b, 0x83, 0x00, 0x94, 0x53, 0x0f, 0x06, + 0x00, 0x94, 0x55, 0x3b, 0x94, 0x00, 0x94, 0x59, + 0x59, 0x1a, 0x00, 0x94, 0x5a, 0x1b, 0x8f, 0x00, + 0x94, 0x5b, 0x1b, 0x85, 0x00, 0x94, 0x5c, 0x59, + 0x1b, 0x00, 0x94, 0x5e, 0x1b, 0x88, 0x00, 0x94, + 0x5f, 0x59, 0x1c, 0x00, 0x94, 0x60, 0x1b, 0x86, + 0x00, 0x94, 0x61, 0x59, 0x1d, 0x00, 0x94, 0x62, + 0x1b, 0x87, 0x00, 0x94, 0x63, 0x43, 0x16, 0x00, + 0x94, 0x68, 0x59, 0x1e, 0x00, 0x94, 0x6a, 0x1b, + 0x89, 0x00, 0x94, 0x6b, 0x3b, 0x95, 0x00, 0x94, + 0x6d, 0x49, 0xbc, 0x00, 0x94, 0x6e, 0x59, 0x1f, + 0x00, 0x94, 0x6f, 0x49, 0xbd, 0x00, 0x94, 0x70, + 0x1b, 0x8b, 0x00, 0x94, 0x71, 0x43, 0x17, 0x00, + 0x94, 0x72, 0x3b, 0x96, 0x00, 0x94, 0x75, 0x1b, + 0x8c, 0x00, 0x94, 0x77, 0x1b, 0x8d, 0x00, 0x94, + 0x7c, 0x1b, 0x90, 0x00, 0x94, 0x7d, 0x1b, 0x8e, + 0x00, 0x94, 0x7e, 0x1b, 0x91, 0x00, 0x94, 0x7f, + 0x1b, 0x93, 0x00, 0x94, 0x81, 0x1b, 0x92, 0x00, + 0x94, 0x83, 0x59, 0x21, 0x00, 0x94, 0x84, 0x59, + 0x20, 0x00, 0x95, 0x77, 0x0b, 0xd5, 0x00, 0x95, + 0x78, 0x3b, 0x97, 0x00, 0x95, 0x79, 0x49, 0xbe, + 0x00, 0x95, 0x7e, 0x59, 0x22, 0x00, 0x95, 0x80, + 0x0e, 0xf3, 0x00, 0x95, 0x82, 0x1b, 0x94, 0x00, + 0x95, 0x83, 0x0a, 0xb0, 0x00, 0x95, 0x84, 0x59, + 0x23, 0x00, 0x95, 0x86, 0x49, 0xbf, 0x00, 0x95, + 0x87, 0x1b, 0x95, 0x00, 0x95, 0x88, 0x4d, 0xe6, + 0x00, 0x95, 0x89, 0x0e, 0x14, 0x00, 0x95, 0x8a, + 0x1b, 0x96, 0x00, 0x95, 0x8b, 0x05, 0x89, 0x00, + 0x95, 0x8c, 0x49, 0xc0, 0x00, 0x95, 0x8d, 0x49, + 0xc1, 0x00, 0x95, 0x8e, 0x43, 0x18, 0x00, 0x95, + 0x8f, 0x04, 0xde, 0x00, 0x95, 0x91, 0x06, 0x13, + 0x00, 0x95, 0x92, 0x21, 0xed, 0x00, 0x95, 0x93, + 0x06, 0x12, 0x00, 0x95, 0x94, 0x1b, 0x97, 0x00, + 0x95, 0x96, 0x1b, 0x98, 0x00, 0x95, 0x98, 0x1b, + 0x99, 0x00, 0x95, 0x99, 0x1b, 0x9a, 0x00, 0x95, + 0x9d, 0x59, 0x24, 0x00, 0x95, 0x9e, 0x59, 0x25, + 0x00, 0x95, 0x9f, 0x43, 0x19, 0x00, 0x95, 0xa0, + 0x1b, 0x9b, 0x00, 0x95, 0xa1, 0x4d, 0xe7, 0x00, + 0x95, 0xa2, 0x06, 0x14, 0x00, 0x95, 0xa3, 0x05, + 0xb3, 0x00, 0x95, 0xa4, 0x07, 0xf0, 0x00, 0x95, + 0xa5, 0x0d, 0x4a, 0x00, 0x95, 0xa6, 0x3b, 0x98, + 0x00, 0x95, 0xa7, 0x1b, 0x9d, 0x00, 0x95, 0xa8, + 0x1b, 0x9c, 0x00, 0x95, 0xa9, 0x3b, 0x99, 0x00, + 0x95, 0xab, 0x4f, 0x59, 0x00, 0x95, 0xac, 0x43, + 0x1a, 0x00, 0x95, 0xad, 0x1b, 0x9e, 0x00, 0x95, + 0xb1, 0x35, 0x55, 0x00, 0x95, 0xb2, 0x04, 0xfe, + 0x00, 0x95, 0xb4, 0x3b, 0x9b, 0x00, 0x95, 0xb6, + 0x43, 0x1b, 0x00, 0x95, 0xb9, 0x1b, 0xa1, 0x00, + 0x95, 0xba, 0x59, 0x26, 0x00, 0x95, 0xbb, 0x1b, + 0xa0, 0x00, 0x95, 0xbc, 0x1b, 0x9f, 0x00, 0x95, + 0xbd, 0x3b, 0x9c, 0x00, 0x95, 0xbe, 0x1b, 0xa2, + 0x00, 0x95, 0xbf, 0x4d, 0xe8, 0x00, 0x95, 0xc3, + 0x1b, 0xa5, 0x00, 0x95, 0xc6, 0x4d, 0xe9, 0x00, + 0x95, 0xc7, 0x04, 0x8b, 0x00, 0x95, 0xc8, 0x49, + 0xc4, 0x00, 0x95, 0xc9, 0x4d, 0xea, 0x00, 0x95, + 0xca, 0x1b, 0xa3, 0x00, 0x95, 0xcb, 0x43, 0x1c, + 0x00, 0x95, 0xcc, 0x1b, 0xa7, 0x00, 0x95, 0xcd, + 0x1b, 0xa6, 0x00, 0x95, 0xd0, 0x43, 0x1d, 0x00, + 0x95, 0xd1, 0x4d, 0xeb, 0x00, 0x95, 0xd2, 0x4d, + 0xec, 0x00, 0x95, 0xd3, 0x43, 0x1e, 0x00, 0x95, + 0xd4, 0x1b, 0xa9, 0x00, 0x95, 0xd5, 0x1b, 0xa8, + 0x00, 0x95, 0xd6, 0x1b, 0xaa, 0x00, 0x95, 0xd8, + 0x0c, 0x86, 0x00, 0x95, 0xd9, 0x59, 0x27, 0x00, + 0x95, 0xda, 0x3b, 0x9d, 0x00, 0x95, 0xdc, 0x1b, + 0xab, 0x00, 0x95, 0xdd, 0x59, 0x28, 0x00, 0x95, + 0xde, 0x43, 0x20, 0x00, 0x95, 0xdf, 0x59, 0x29, + 0x00, 0x95, 0xe0, 0x4d, 0xed, 0x00, 0x95, 0xe1, + 0x1b, 0xac, 0x00, 0x95, 0xe2, 0x1b, 0xae, 0x00, + 0x95, 0xe4, 0x4d, 0xee, 0x00, 0x95, 0xe5, 0x1b, + 0xad, 0x00, 0x95, 0xe6, 0x4d, 0xef, 0x00, 0x95, + 0xe8, 0x36, 0xed, 0x00, 0x96, 0x1c, 0x0d, 0xde, + 0x00, 0x96, 0x1d, 0x3b, 0x9e, 0x00, 0x96, 0x1e, + 0x59, 0x2a, 0x00, 0x96, 0x21, 0x1b, 0xaf, 0x00, + 0x96, 0x22, 0x59, 0x2b, 0x00, 0x96, 0x24, 0x4d, + 0xf0, 0x00, 0x96, 0x25, 0x59, 0x2c, 0x00, 0x96, + 0x26, 0x59, 0x2d, 0x00, 0x96, 0x28, 0x1b, 0xb0, + 0x00, 0x96, 0x2a, 0x08, 0x55, 0x00, 0x96, 0x2c, + 0x49, 0xc7, 0x00, 0x96, 0x2e, 0x1b, 0xb1, 0x00, + 0x96, 0x2f, 0x1b, 0xb2, 0x00, 0x96, 0x31, 0x4d, + 0xf1, 0x00, 0x96, 0x32, 0x0e, 0x77, 0x00, 0x96, + 0x33, 0x49, 0xc8, 0x00, 0x96, 0x34, 0x49, 0xc9, + 0x00, 0x96, 0x37, 0x59, 0x2e, 0x00, 0x96, 0x38, + 0x4d, 0xf2, 0x00, 0x96, 0x39, 0x59, 0x2f, 0x00, + 0x96, 0x3a, 0x59, 0x30, 0x00, 0x96, 0x3b, 0x0a, + 0xcd, 0x00, 0x96, 0x3c, 0x49, 0xcb, 0x00, 0x96, + 0x3d, 0x4d, 0xf3, 0x00, 0x96, 0x3f, 0x04, 0x68, + 0x00, 0x96, 0x40, 0x0b, 0x2b, 0x00, 0x96, 0x41, + 0x3b, 0x9f, 0x00, 0x96, 0x42, 0x1b, 0xb3, 0x00, + 0x96, 0x44, 0x0d, 0xdf, 0x00, 0x96, 0x4b, 0x1b, + 0xb6, 0x00, 0x96, 0x4c, 0x1b, 0xb4, 0x00, 0x96, + 0x4d, 0x07, 0xf1, 0x00, 0x96, 0x4f, 0x1b, 0xb5, + 0x00, 0x96, 0x50, 0x07, 0x76, 0x00, 0x96, 0x52, + 0x59, 0x31, 0x00, 0x96, 0x54, 0x4d, 0xf4, 0x00, + 0x96, 0x56, 0x59, 0x32, 0x00, 0x96, 0x57, 0x59, + 0x33, 0x00, 0x96, 0x58, 0x3b, 0xa0, 0x00, 0x96, + 0x5b, 0x0e, 0x15, 0x00, 0x96, 0x5c, 0x1b, 0xb8, + 0x00, 0x96, 0x5d, 0x1b, 0xba, 0x00, 0x96, 0x5e, + 0x1b, 0xb9, 0x00, 0x96, 0x5f, 0x1b, 0xbb, 0x00, + 0x96, 0x61, 0x49, 0xcc, 0x00, 0x96, 0x62, 0x04, + 0xc3, 0x00, 0x96, 0x63, 0x0a, 0x1e, 0x00, 0x96, + 0x64, 0x09, 0x86, 0x00, 0x96, 0x65, 0x06, 0x15, + 0x00, 0x96, 0x66, 0x1b, 0xbc, 0x00, 0x96, 0x6a, + 0x0d, 0x1c, 0x00, 0x96, 0x6c, 0x1b, 0xbe, 0x00, + 0x96, 0x6e, 0x59, 0x34, 0x00, 0x96, 0x70, 0x04, + 0xc4, 0x00, 0x96, 0x72, 0x1b, 0xbd, 0x00, 0x96, + 0x73, 0x0b, 0xe0, 0x00, 0x96, 0x74, 0x4d, 0xf5, + 0x00, 0x96, 0x75, 0x0f, 0x95, 0x00, 0x96, 0x76, + 0x0c, 0x83, 0x00, 0x96, 0x77, 0x1b, 0xb7, 0x00, + 0x96, 0x78, 0x0f, 0x6e, 0x00, 0x96, 0x7a, 0x07, + 0x65, 0x00, 0x96, 0x7b, 0x4d, 0xf6, 0x00, 0x96, + 0x7c, 0x59, 0x35, 0x00, 0x96, 0x7d, 0x0f, 0x45, + 0x00, 0x96, 0x7e, 0x59, 0x36, 0x00, 0x96, 0x7f, + 0x4d, 0xf7, 0x00, 0x96, 0x81, 0x4d, 0xf8, 0x00, + 0x96, 0x82, 0x49, 0xce, 0x00, 0x96, 0x83, 0x4d, + 0xf9, 0x00, 0x96, 0x84, 0x3b, 0xa1, 0x00, 0x96, + 0x85, 0x06, 0xf1, 0x00, 0x96, 0x86, 0x0f, 0x7c, + 0x00, 0x96, 0x88, 0x06, 0xfe, 0x00, 0x96, 0x89, + 0x4d, 0xfa, 0x00, 0x96, 0x8a, 0x0b, 0x42, 0x00, + 0x96, 0x8b, 0x18, 0x6c, 0x00, 0x96, 0x8d, 0x1b, + 0xbf, 0x00, 0x96, 0x8e, 0x05, 0x8a, 0x00, 0x96, + 0x8f, 0x0a, 0x35, 0x00, 0x96, 0x91, 0x59, 0x37, + 0x00, 0x96, 0x94, 0x05, 0xb4, 0x00, 0x96, 0x95, + 0x1b, 0xc1, 0x00, 0x96, 0x96, 0x4d, 0xfb, 0x00, + 0x96, 0x97, 0x1b, 0xc2, 0x00, 0x96, 0x98, 0x1b, + 0xc0, 0x00, 0x96, 0x99, 0x07, 0x3a, 0x00, 0x96, + 0x9a, 0x49, 0xd0, 0x00, 0x96, 0x9b, 0x08, 0x4d, + 0x00, 0x96, 0x9c, 0x09, 0xcb, 0x00, 0x96, 0x9d, + 0x21, 0xf0, 0x00, 0x96, 0x9f, 0x59, 0x38, 0x00, + 0x96, 0xa0, 0x04, 0xc5, 0x00, 0x96, 0xa3, 0x0f, + 0xa1, 0x00, 0x96, 0xa4, 0x3b, 0xa2, 0x00, 0x96, + 0xa5, 0x43, 0x21, 0x00, 0x96, 0xa6, 0x59, 0x39, + 0x00, 0x96, 0xa7, 0x1b, 0xc4, 0x00, 0x96, 0xa8, + 0x1b, 0x0b, 0x00, 0x96, 0xa9, 0x3b, 0xa3, 0x00, + 0x96, 0xaa, 0x1b, 0xc3, 0x00, 0x96, 0xae, 0x4d, + 0xfc, 0x00, 0x96, 0xaf, 0x21, 0xf1, 0x00, 0x96, + 0xb0, 0x1b, 0xc7, 0x00, 0x96, 0xb1, 0x1b, 0xc5, + 0x00, 0x96, 0xb2, 0x1b, 0xc6, 0x00, 0x96, 0xb3, + 0x49, 0xd3, 0x00, 0x96, 0xb4, 0x1b, 0xc8, 0x00, + 0x96, 0xb6, 0x1b, 0xc9, 0x00, 0x96, 0xb7, 0x0f, + 0xb4, 0x00, 0x96, 0xb8, 0x1b, 0xca, 0x00, 0x96, + 0xb9, 0x1b, 0xcb, 0x00, 0x96, 0xba, 0x49, 0xd4, + 0x00, 0x96, 0xbb, 0x0a, 0x6d, 0x00, 0x96, 0xbc, + 0x0d, 0x4f, 0x00, 0x96, 0xbd, 0x49, 0xd5, 0x00, + 0x96, 0xc0, 0x0a, 0x43, 0x00, 0x96, 0xc1, 0x06, + 0x23, 0x00, 0x96, 0xc4, 0x0f, 0x24, 0x00, 0x96, + 0xc5, 0x05, 0x6d, 0x00, 0x96, 0xc6, 0x09, 0x42, + 0x00, 0x96, 0xc7, 0x07, 0x8f, 0x00, 0x96, 0xc9, + 0x1b, 0xce, 0x00, 0x96, 0xca, 0x59, 0x3a, 0x00, + 0x96, 0xcb, 0x1b, 0xcd, 0x00, 0x96, 0xcc, 0x08, + 0xc1, 0x00, 0x96, 0xcd, 0x1b, 0xcf, 0x00, 0x96, + 0xce, 0x1b, 0xcc, 0x00, 0x96, 0xd1, 0x08, 0x76, + 0x00, 0x96, 0xd2, 0x3b, 0xa4, 0x00, 0x96, 0xd5, + 0x1b, 0xd3, 0x00, 0x96, 0xd6, 0x19, 0x92, 0x00, + 0x96, 0xd8, 0x49, 0xd8, 0x00, 0x96, 0xd9, 0x10, + 0xeb, 0x00, 0x96, 0xda, 0x49, 0xd9, 0x00, 0x96, + 0xdb, 0x0a, 0x3d, 0x00, 0x96, 0xdc, 0x1b, 0xd1, + 0x00, 0x96, 0xdd, 0x49, 0xda, 0x00, 0x96, 0xde, + 0x3b, 0xa6, 0x00, 0x96, 0xdf, 0x59, 0x3c, 0x00, + 0x96, 0xe2, 0x0f, 0x6d, 0x00, 0x96, 0xe3, 0x34, + 0x3e, 0x00, 0x96, 0xe8, 0x04, 0xcd, 0x00, 0x96, + 0xe9, 0x3b, 0xa7, 0x00, 0x96, 0xea, 0x0a, 0x87, + 0x00, 0x96, 0xeb, 0x08, 0xe2, 0x00, 0x96, 0xef, + 0x43, 0x22, 0x00, 0x96, 0xf0, 0x0e, 0x07, 0x00, + 0x96, 0xf1, 0x3b, 0xa8, 0x00, 0x96, 0xf2, 0x04, + 0xe2, 0x00, 0x96, 0xf6, 0x0f, 0xb5, 0x00, 0x96, + 0xf7, 0x0f, 0x55, 0x00, 0x96, 0xf9, 0x1b, 0xd4, + 0x00, 0x96, 0xfa, 0x59, 0x3d, 0x00, 0x96, 0xfb, + 0x0c, 0x3f, 0x00, 0x97, 0x00, 0x09, 0x27, 0x00, + 0x97, 0x02, 0x3b, 0xa9, 0x00, 0x97, 0x03, 0x4d, + 0xfd, 0x00, 0x97, 0x04, 0x1b, 0xd5, 0x00, 0x97, + 0x05, 0x59, 0x3e, 0x00, 0x97, 0x06, 0x1b, 0xd6, + 0x00, 0x97, 0x07, 0x0a, 0x12, 0x00, 0x97, 0x08, + 0x1b, 0xd7, 0x00, 0x97, 0x09, 0x3b, 0xaa, 0x00, + 0x97, 0x0a, 0x0f, 0xb6, 0x00, 0x97, 0x0d, 0x1b, + 0xd2, 0x00, 0x97, 0x0e, 0x1b, 0xd9, 0x00, 0x97, + 0x0f, 0x1b, 0xdb, 0x00, 0x97, 0x11, 0x1b, 0xda, + 0x00, 0x97, 0x13, 0x1b, 0xd8, 0x00, 0x97, 0x14, + 0x49, 0xdc, 0x00, 0x97, 0x16, 0x1b, 0xdc, 0x00, + 0x97, 0x19, 0x1b, 0xdd, 0x00, 0x97, 0x1a, 0x59, + 0x3f, 0x00, 0x97, 0x1b, 0x4d, 0xfe, 0x00, 0x97, + 0x1c, 0x0a, 0xfc, 0x00, 0x97, 0x1d, 0x59, 0x40, + 0x00, 0x97, 0x1e, 0x05, 0x62, 0x00, 0x97, 0x21, + 0x4d, 0xff, 0x00, 0x97, 0x22, 0x4e, 0x00, 0x00, + 0x97, 0x23, 0x49, 0xdd, 0x00, 0x97, 0x24, 0x1b, + 0xde, 0x00, 0x97, 0x27, 0x0e, 0xc4, 0x00, 0x97, + 0x28, 0x4e, 0x01, 0x00, 0x97, 0x2a, 0x1b, 0xdf, + 0x00, 0x97, 0x30, 0x1b, 0xe0, 0x00, 0x97, 0x31, + 0x4e, 0x02, 0x00, 0x97, 0x32, 0x0f, 0xd0, 0x00, + 0x97, 0x33, 0x21, 0xf2, 0x00, 0x97, 0x36, 0x49, + 0xdf, 0x00, 0x97, 0x38, 0x14, 0x14, 0x00, 0x97, + 0x39, 0x1b, 0xe1, 0x00, 0x97, 0x3b, 0x21, 0xf3, + 0x00, 0x97, 0x3d, 0x1b, 0xe2, 0x00, 0x97, 0x3e, + 0x1b, 0xe3, 0x00, 0x97, 0x41, 0x49, 0xe0, 0x00, + 0x97, 0x42, 0x1b, 0xe7, 0x00, 0x97, 0x43, 0x21, + 0xf4, 0x00, 0x97, 0x44, 0x1b, 0xe4, 0x00, 0x97, + 0x46, 0x1b, 0xe5, 0x00, 0x97, 0x47, 0x49, 0xe1, + 0x00, 0x97, 0x48, 0x1b, 0xe6, 0x00, 0x97, 0x49, + 0x1b, 0xe8, 0x00, 0x97, 0x4a, 0x59, 0x42, 0x00, + 0x97, 0x4d, 0x21, 0xf5, 0x00, 0x97, 0x4e, 0x43, + 0x23, 0x00, 0x97, 0x4f, 0x21, 0xf6, 0x00, 0x97, + 0x51, 0x21, 0xf7, 0x00, 0x97, 0x52, 0x0a, 0x68, + 0x00, 0x97, 0x55, 0x4f, 0x5a, 0x00, 0x97, 0x56, + 0x0f, 0x03, 0x00, 0x97, 0x57, 0x49, 0xe2, 0x00, + 0x97, 0x58, 0x59, 0x43, 0x00, 0x97, 0x59, 0x0a, + 0x69, 0x00, 0x97, 0x5a, 0x3b, 0xab, 0x00, 0x97, + 0x5b, 0x49, 0xe3, 0x00, 0x97, 0x5c, 0x1b, 0xe9, + 0x00, 0x97, 0x5e, 0x0d, 0x87, 0x00, 0x97, 0x60, + 0x1b, 0xea, 0x00, 0x97, 0x61, 0x1d, 0x06, 0x00, + 0x97, 0x62, 0x0e, 0xd8, 0x00, 0x97, 0x63, 0x3b, + 0xac, 0x00, 0x97, 0x64, 0x1b, 0xeb, 0x00, 0x97, + 0x66, 0x1b, 0xec, 0x00, 0x97, 0x67, 0x4e, 0x03, + 0x00, 0x97, 0x68, 0x1b, 0xed, 0x00, 0x97, 0x69, + 0x05, 0xb5, 0x00, 0x97, 0x6a, 0x49, 0xe4, 0x00, + 0x97, 0x6b, 0x1b, 0xef, 0x00, 0x97, 0x6d, 0x0a, + 0x1f, 0x00, 0x97, 0x6e, 0x3b, 0xad, 0x00, 0x97, + 0x71, 0x1b, 0xf0, 0x00, 0x97, 0x73, 0x3b, 0xae, + 0x00, 0x97, 0x74, 0x06, 0xfa, 0x00, 0x97, 0x76, + 0x4e, 0x04, 0x00, 0x97, 0x77, 0x59, 0x44, 0x00, + 0x97, 0x78, 0x59, 0x45, 0x00, 0x97, 0x79, 0x1b, + 0xf1, 0x00, 0x97, 0x7a, 0x1b, 0xf5, 0x00, 0x97, + 0x7b, 0x59, 0x46, 0x00, 0x97, 0x7c, 0x1b, 0xf3, + 0x00, 0x97, 0x7d, 0x4e, 0x05, 0x00, 0x97, 0x7f, + 0x4e, 0x06, 0x00, 0x97, 0x80, 0x59, 0x47, 0x00, + 0x97, 0x81, 0x1b, 0xf4, 0x00, 0x97, 0x84, 0x05, + 0xd1, 0x00, 0x97, 0x85, 0x1b, 0xf2, 0x00, 0x97, + 0x86, 0x1b, 0xf6, 0x00, 0x97, 0x89, 0x59, 0x48, + 0x00, 0x97, 0x8b, 0x1b, 0xf7, 0x00, 0x97, 0x8d, + 0x04, 0x8c, 0x00, 0x97, 0x8f, 0x1b, 0xf8, 0x00, + 0x97, 0x90, 0x1b, 0xf9, 0x00, 0x97, 0x95, 0x43, + 0x24, 0x00, 0x97, 0x96, 0x49, 0xe7, 0x00, 0x97, + 0x97, 0x59, 0x49, 0x00, 0x97, 0x98, 0x09, 0xcc, + 0x00, 0x97, 0x99, 0x4e, 0x07, 0x00, 0x97, 0x9a, + 0x3b, 0xaf, 0x00, 0x97, 0x9c, 0x1b, 0xfa, 0x00, + 0x97, 0x9e, 0x49, 0xe8, 0x00, 0x97, 0x9f, 0x4e, + 0x08, 0x00, 0x97, 0xa0, 0x06, 0x61, 0x00, 0x97, + 0xa2, 0x3b, 0xb0, 0x00, 0x97, 0xa3, 0x1b, 0xfd, + 0x00, 0x97, 0xa6, 0x1b, 0xfc, 0x00, 0x97, 0xa8, + 0x1b, 0xfb, 0x00, 0x97, 0xab, 0x1a, 0x34, 0x00, + 0x97, 0xac, 0x4e, 0x09, 0x00, 0x97, 0xad, 0x0e, + 0x2c, 0x00, 0x97, 0xae, 0x43, 0x25, 0x00, 0x97, + 0xb1, 0x49, 0xe9, 0x00, 0x97, 0xb2, 0x49, 0xea, + 0x00, 0x97, 0xb3, 0x1b, 0xfe, 0x00, 0x97, 0xb4, + 0x1b, 0xff, 0x00, 0x97, 0xb5, 0x3b, 0xb1, 0x00, + 0x97, 0xb6, 0x3b, 0xb2, 0x00, 0x97, 0xb8, 0x59, + 0x4a, 0x00, 0x97, 0xb9, 0x4e, 0x0a, 0x00, 0x97, + 0xba, 0x43, 0x26, 0x00, 0x97, 0xbc, 0x59, 0x4b, + 0x00, 0x97, 0xbe, 0x49, 0xeb, 0x00, 0x97, 0xbf, + 0x59, 0x4c, 0x00, 0x97, 0xc1, 0x43, 0x27, 0x00, + 0x97, 0xc3, 0x1c, 0x00, 0x00, 0x97, 0xc4, 0x59, + 0x4d, 0x00, 0x97, 0xc5, 0x59, 0x4e, 0x00, 0x97, + 0xc6, 0x1c, 0x01, 0x00, 0x97, 0xc7, 0x59, 0x4f, + 0x00, 0x97, 0xc8, 0x1c, 0x02, 0x00, 0x97, 0xc9, + 0x43, 0x28, 0x00, 0x97, 0xca, 0x59, 0x50, 0x00, + 0x97, 0xcb, 0x1c, 0x03, 0x00, 0x97, 0xcc, 0x49, + 0xec, 0x00, 0x97, 0xcd, 0x4e, 0x0b, 0x00, 0x97, + 0xce, 0x59, 0x51, 0x00, 0x97, 0xd0, 0x59, 0x52, + 0x00, 0x97, 0xd1, 0x49, 0xed, 0x00, 0x97, 0xd3, + 0x06, 0x16, 0x00, 0x97, 0xd4, 0x49, 0xee, 0x00, + 0x97, 0xd7, 0x59, 0x53, 0x00, 0x97, 0xd8, 0x49, + 0xef, 0x00, 0x97, 0xd9, 0x3b, 0xb3, 0x00, 0x97, + 0xdb, 0x43, 0x29, 0x00, 0x97, 0xdc, 0x1c, 0x04, + 0x00, 0x97, 0xdd, 0x59, 0x54, 0x00, 0x97, 0xde, + 0x3b, 0xb4, 0x00, 0x97, 0xe0, 0x4e, 0x0c, 0x00, + 0x97, 0xe1, 0x49, 0xf0, 0x00, 0x97, 0xe4, 0x59, + 0x55, 0x00, 0x97, 0xed, 0x1c, 0x05, 0x00, 0x97, + 0xee, 0x0c, 0xd9, 0x00, 0x97, 0xef, 0x4e, 0x0d, + 0x00, 0x97, 0xf1, 0x49, 0xf1, 0x00, 0x97, 0xf2, + 0x1c, 0x07, 0x00, 0x97, 0xf3, 0x05, 0x3b, 0x00, + 0x97, 0xf4, 0x3b, 0xb5, 0x00, 0x97, 0xf5, 0x1c, + 0x0a, 0x00, 0x97, 0xf6, 0x1c, 0x09, 0x00, 0x97, + 0xf7, 0x59, 0x56, 0x00, 0x97, 0xf8, 0x59, 0x57, + 0x00, 0x97, 0xfa, 0x59, 0x58, 0x00, 0x97, 0xfb, + 0x04, 0xc6, 0x00, 0x97, 0xff, 0x06, 0xb9, 0x00, + 0x98, 0x01, 0x0e, 0x17, 0x00, 0x98, 0x02, 0x0b, + 0xd6, 0x00, 0x98, 0x03, 0x08, 0x12, 0x00, 0x98, + 0x04, 0x49, 0xf2, 0x00, 0x98, 0x05, 0x07, 0xf2, + 0x00, 0x98, 0x06, 0x09, 0x71, 0x00, 0x98, 0x07, + 0x4e, 0x0e, 0x00, 0x98, 0x08, 0x0a, 0x22, 0x00, + 0x98, 0x0a, 0x3b, 0xb6, 0x00, 0x98, 0x0c, 0x1c, + 0x0c, 0x00, 0x98, 0x0d, 0x49, 0xf3, 0x00, 0x98, + 0x0e, 0x3b, 0xb7, 0x00, 0x98, 0x0f, 0x1c, 0x0b, + 0x00, 0x98, 0x10, 0x0f, 0x2c, 0x00, 0x98, 0x11, + 0x06, 0x24, 0x00, 0x98, 0x12, 0x0d, 0x66, 0x00, + 0x98, 0x13, 0x0c, 0xb4, 0x00, 0x98, 0x14, 0x49, + 0xf4, 0x00, 0x98, 0x16, 0x49, 0xf5, 0x00, 0x98, + 0x17, 0x0a, 0x42, 0x00, 0x98, 0x18, 0x0f, 0x96, + 0x00, 0x98, 0x19, 0x59, 0x59, 0x00, 0x98, 0x1a, + 0x07, 0x31, 0x00, 0x98, 0x1c, 0x59, 0x5a, 0x00, + 0x98, 0x1e, 0x3b, 0xb8, 0x00, 0x98, 0x20, 0x59, + 0x5b, 0x00, 0x98, 0x21, 0x1c, 0x0f, 0x00, 0x98, + 0x23, 0x3b, 0xb9, 0x00, 0x98, 0x24, 0x1c, 0x0e, + 0x00, 0x98, 0x25, 0x49, 0xfa, 0x00, 0x98, 0x26, + 0x4e, 0x0f, 0x00, 0x98, 0x2b, 0x3b, 0xba, 0x00, + 0x98, 0x2c, 0x0e, 0x79, 0x00, 0x98, 0x2d, 0x0c, + 0x84, 0x00, 0x98, 0x2e, 0x4e, 0x10, 0x00, 0x98, + 0x2f, 0x59, 0x5c, 0x00, 0x98, 0x30, 0x1e, 0x73, + 0x00, 0x98, 0x32, 0x49, 0xf8, 0x00, 0x98, 0x33, + 0x49, 0xf9, 0x00, 0x98, 0x34, 0x04, 0xf2, 0x00, + 0x98, 0x35, 0x59, 0x5d, 0x00, 0x98, 0x37, 0x1c, + 0x10, 0x00, 0x98, 0x38, 0x1c, 0x0d, 0x00, 0x98, + 0x39, 0x37, 0xb3, 0x00, 0x98, 0x3b, 0x1e, 0x6c, + 0x00, 0x98, 0x3c, 0x0f, 0x54, 0x00, 0x98, 0x3d, + 0x1c, 0x11, 0x00, 0x98, 0x3e, 0x3b, 0xbb, 0x00, + 0x98, 0x44, 0x59, 0x5e, 0x00, 0x98, 0x46, 0x1c, + 0x12, 0x00, 0x98, 0x47, 0x49, 0xfb, 0x00, 0x98, + 0x4a, 0x59, 0x5f, 0x00, 0x98, 0x4b, 0x1c, 0x14, + 0x00, 0x98, 0x4c, 0x0b, 0x4a, 0x00, 0x98, 0x4d, + 0x05, 0xb9, 0x00, 0x98, 0x4e, 0x05, 0xba, 0x00, + 0x98, 0x4f, 0x1c, 0x13, 0x00, 0x98, 0x51, 0x59, + 0x60, 0x00, 0x98, 0x52, 0x3b, 0xbc, 0x00, 0x98, + 0x53, 0x3b, 0xbd, 0x00, 0x98, 0x54, 0x06, 0x25, + 0x00, 0x98, 0x55, 0x07, 0x66, 0x00, 0x98, 0x56, + 0x43, 0x2a, 0x00, 0x98, 0x57, 0x21, 0xf9, 0x00, + 0x98, 0x58, 0x06, 0x26, 0x00, 0x98, 0x59, 0x3b, + 0xbe, 0x00, 0x98, 0x5a, 0x1e, 0x48, 0x00, 0x98, + 0x5b, 0x0c, 0x39, 0x00, 0x98, 0x5e, 0x34, 0x54, + 0x00, 0x98, 0x62, 0x4e, 0x11, 0x00, 0x98, 0x63, + 0x4e, 0x12, 0x00, 0x98, 0x65, 0x21, 0xfa, 0x00, + 0x98, 0x66, 0x49, 0xfc, 0x00, 0x98, 0x67, 0x07, + 0x90, 0x00, 0x98, 0x6a, 0x59, 0x61, 0x00, 0x98, + 0x6b, 0x1c, 0x15, 0x00, 0x98, 0x6c, 0x3b, 0xbf, + 0x00, 0x98, 0x6f, 0x1c, 0x16, 0x00, 0x98, 0x70, + 0x1c, 0x17, 0x00, 0x98, 0x71, 0x1c, 0x18, 0x00, + 0x98, 0x73, 0x1c, 0x1a, 0x00, 0x98, 0x74, 0x1c, + 0x19, 0x00, 0x98, 0xa8, 0x0d, 0xe9, 0x00, 0x98, + 0xaa, 0x1c, 0x1b, 0x00, 0x98, 0xab, 0x49, 0xfd, + 0x00, 0x98, 0xad, 0x49, 0xfe, 0x00, 0x98, 0xae, + 0x59, 0x62, 0x00, 0x98, 0xaf, 0x1c, 0x1c, 0x00, + 0x98, 0xb0, 0x49, 0xff, 0x00, 0x98, 0xb1, 0x1c, + 0x1d, 0x00, 0x98, 0xb4, 0x4e, 0x13, 0x00, 0x98, + 0xb6, 0x1c, 0x1e, 0x00, 0x98, 0xb7, 0x4a, 0x01, + 0x00, 0x98, 0xb8, 0x3b, 0xc0, 0x00, 0x98, 0xba, + 0x3b, 0xc1, 0x00, 0x98, 0xbb, 0x4a, 0x02, 0x00, + 0x98, 0xbc, 0x4a, 0x03, 0x00, 0x98, 0xbf, 0x3b, + 0xc2, 0x00, 0x98, 0xc2, 0x4a, 0x04, 0x00, 0x98, + 0xc3, 0x1c, 0x20, 0x00, 0x98, 0xc4, 0x1c, 0x1f, + 0x00, 0x98, 0xc5, 0x4e, 0x14, 0x00, 0x98, 0xc6, + 0x1c, 0x21, 0x00, 0x98, 0xc7, 0x4a, 0x05, 0x00, + 0x98, 0xc8, 0x3b, 0xc3, 0x00, 0x98, 0xcb, 0x4a, + 0x06, 0x00, 0x98, 0xcc, 0x59, 0x63, 0x00, 0x98, + 0xdb, 0x0d, 0x88, 0x00, 0x98, 0xdc, 0x18, 0x39, + 0x00, 0x98, 0xdf, 0x09, 0xef, 0x00, 0x98, 0xe0, + 0x36, 0x18, 0x00, 0x98, 0xe1, 0x4a, 0x07, 0x00, + 0x98, 0xe2, 0x06, 0x4c, 0x00, 0x98, 0xe3, 0x4a, + 0x08, 0x00, 0x98, 0xe5, 0x3b, 0xc4, 0x00, 0x98, + 0xe6, 0x59, 0x64, 0x00, 0x98, 0xe7, 0x43, 0x2b, + 0x00, 0x98, 0xe9, 0x1c, 0x22, 0x00, 0x98, 0xea, + 0x4a, 0x09, 0x00, 0x98, 0xeb, 0x1c, 0x23, 0x00, + 0x98, 0xed, 0x10, 0xc1, 0x00, 0x98, 0xee, 0x14, + 0xda, 0x00, 0x98, 0xef, 0x21, 0xfb, 0x00, 0x98, + 0xf0, 0x4a, 0x0a, 0x00, 0x98, 0xf1, 0x4a, 0x0b, + 0x00, 0x98, 0xf2, 0x04, 0xbf, 0x00, 0x98, 0xf3, + 0x4a, 0x0c, 0x00, 0x98, 0xf4, 0x04, 0x7f, 0x00, + 0x98, 0xf6, 0x59, 0x65, 0x00, 0x98, 0xfc, 0x08, + 0xc2, 0x00, 0x98, 0xfd, 0x0e, 0x5e, 0x00, 0x98, + 0xfe, 0x09, 0xe6, 0x00, 0x99, 0x02, 0x4e, 0x15, + 0x00, 0x99, 0x03, 0x1c, 0x24, 0x00, 0x99, 0x05, + 0x0e, 0xeb, 0x00, 0x99, 0x07, 0x59, 0x66, 0x00, + 0x99, 0x08, 0x4a, 0x0d, 0x00, 0x99, 0x09, 0x1c, + 0x25, 0x00, 0x99, 0x0a, 0x0f, 0x46, 0x00, 0x99, + 0x0c, 0x04, 0xe4, 0x00, 0x99, 0x10, 0x08, 0x8f, + 0x00, 0x99, 0x11, 0x4e, 0x16, 0x00, 0x99, 0x12, + 0x1c, 0x26, 0x00, 0x99, 0x13, 0x05, 0x6e, 0x00, + 0x99, 0x14, 0x1c, 0x27, 0x00, 0x99, 0x15, 0x4e, + 0x17, 0x00, 0x99, 0x16, 0x4a, 0x10, 0x00, 0x99, + 0x17, 0x4a, 0x11, 0x00, 0x99, 0x18, 0x1c, 0x28, + 0x00, 0x99, 0x1a, 0x4a, 0x13, 0x00, 0x99, 0x1b, + 0x4a, 0x14, 0x00, 0x99, 0x1c, 0x4a, 0x15, 0x00, + 0x99, 0x1d, 0x1c, 0x2a, 0x00, 0x99, 0x1e, 0x1c, + 0x2b, 0x00, 0x99, 0x1f, 0x59, 0x67, 0x00, 0x99, + 0x20, 0x1c, 0x2d, 0x00, 0x99, 0x21, 0x1c, 0x29, + 0x00, 0x99, 0x22, 0x59, 0x68, 0x00, 0x99, 0x24, + 0x1c, 0x2c, 0x00, 0x99, 0x26, 0x59, 0x69, 0x00, + 0x99, 0x27, 0x21, 0xfd, 0x00, 0x99, 0x28, 0x06, + 0x17, 0x00, 0x99, 0x2b, 0x59, 0x6a, 0x00, 0x99, + 0x2c, 0x1c, 0x2e, 0x00, 0x99, 0x2e, 0x1c, 0x2f, + 0x00, 0x99, 0x31, 0x4a, 0x17, 0x00, 0x99, 0x32, + 0x3b, 0xc5, 0x00, 0x99, 0x33, 0x3b, 0xc6, 0x00, + 0x99, 0x34, 0x59, 0x6b, 0x00, 0x99, 0x35, 0x4e, + 0x18, 0x00, 0x99, 0x39, 0x59, 0x6c, 0x00, 0x99, + 0x3a, 0x4a, 0x18, 0x00, 0x99, 0x3b, 0x4a, 0x19, + 0x00, 0x99, 0x3c, 0x4a, 0x1a, 0x00, 0x99, 0x3d, + 0x1c, 0x30, 0x00, 0x99, 0x3e, 0x1c, 0x31, 0x00, + 0x99, 0x40, 0x3b, 0xc7, 0x00, 0x99, 0x41, 0x4a, + 0x1b, 0x00, 0x99, 0x42, 0x1c, 0x32, 0x00, 0x99, + 0x45, 0x1c, 0x34, 0x00, 0x99, 0x46, 0x4a, 0x1c, + 0x00, 0x99, 0x47, 0x59, 0x6d, 0x00, 0x99, 0x48, + 0x4e, 0x19, 0x00, 0x99, 0x49, 0x1c, 0x33, 0x00, + 0x99, 0x4b, 0x1c, 0x36, 0x00, 0x99, 0x4c, 0x1c, + 0x39, 0x00, 0x99, 0x4d, 0x3b, 0xc8, 0x00, 0x99, + 0x4e, 0x4a, 0x1d, 0x00, 0x99, 0x50, 0x1c, 0x35, + 0x00, 0x99, 0x51, 0x1c, 0x37, 0x00, 0x99, 0x52, + 0x1c, 0x38, 0x00, 0x99, 0x54, 0x4e, 0x1a, 0x00, + 0x99, 0x55, 0x1c, 0x3a, 0x00, 0x99, 0x57, 0x06, + 0xba, 0x00, 0x99, 0x58, 0x43, 0x2c, 0x00, 0x99, + 0x59, 0x59, 0x6e, 0x00, 0x99, 0x5b, 0x59, 0x6f, + 0x00, 0x99, 0x5c, 0x3b, 0xc9, 0x00, 0x99, 0x5e, + 0x4e, 0x1b, 0x00, 0x99, 0x5f, 0x3b, 0xca, 0x00, + 0x99, 0x60, 0x4a, 0x1e, 0x00, 0x99, 0x96, 0x09, + 0x1f, 0x00, 0x99, 0x97, 0x1c, 0x3b, 0x00, 0x99, + 0x98, 0x1c, 0x3c, 0x00, 0x99, 0x99, 0x07, 0xf3, + 0x00, 0x99, 0x9b, 0x59, 0x70, 0x00, 0x99, 0x9d, + 0x59, 0x71, 0x00, 0x99, 0x9e, 0x21, 0xff, 0x00, + 0x99, 0x9f, 0x59, 0x72, 0x00, 0x99, 0xa3, 0x4a, + 0x1f, 0x00, 0x99, 0xa5, 0x1c, 0x3d, 0x00, 0x99, + 0xa6, 0x4a, 0x20, 0x00, 0x99, 0xa8, 0x05, 0x9c, + 0x00, 0x99, 0xac, 0x0d, 0x05, 0x00, 0x99, 0xad, + 0x1c, 0x3e, 0x00, 0x99, 0xae, 0x1c, 0x3f, 0x00, + 0x99, 0xb0, 0x59, 0x73, 0x00, 0x99, 0xb1, 0x3b, + 0xcb, 0x00, 0x99, 0xb2, 0x59, 0x74, 0x00, 0x99, + 0xb3, 0x0b, 0x98, 0x00, 0x99, 0xb4, 0x0c, 0xc3, + 0x00, 0x99, 0xb5, 0x59, 0x75, 0x00, 0x99, 0xb9, + 0x3b, 0xcc, 0x00, 0x99, 0xba, 0x3b, 0xcd, 0x00, + 0x99, 0xbc, 0x1c, 0x40, 0x00, 0x99, 0xbd, 0x4a, + 0x21, 0x00, 0x99, 0xbf, 0x4a, 0x22, 0x00, 0x99, + 0xc1, 0x0d, 0x33, 0x00, 0x99, 0xc3, 0x4a, 0x23, + 0x00, 0x99, 0xc4, 0x0b, 0x2c, 0x00, 0x99, 0xc5, + 0x04, 0xfa, 0x00, 0x99, 0xc6, 0x06, 0xe6, 0x00, + 0x99, 0xc8, 0x06, 0xe7, 0x00, 0x99, 0xc9, 0x3b, + 0xce, 0x00, 0x99, 0xd0, 0x0b, 0xb1, 0x00, 0x99, + 0xd1, 0x1c, 0x45, 0x00, 0x99, 0xd2, 0x06, 0xe8, + 0x00, 0x99, 0xd3, 0x59, 0x76, 0x00, 0x99, 0xd4, + 0x4a, 0x24, 0x00, 0x99, 0xd5, 0x05, 0x6f, 0x00, + 0x99, 0xd8, 0x1c, 0x44, 0x00, 0x99, 0xd9, 0x4a, + 0x25, 0x00, 0x99, 0xda, 0x59, 0x77, 0x00, 0x99, + 0xdb, 0x1c, 0x42, 0x00, 0x99, 0xdc, 0x59, 0x78, + 0x00, 0x99, 0xdd, 0x1c, 0x43, 0x00, 0x99, 0xde, + 0x4a, 0x26, 0x00, 0x99, 0xdf, 0x1c, 0x41, 0x00, + 0x99, 0xe1, 0x4e, 0x1c, 0x00, 0x99, 0xe2, 0x1c, + 0x4f, 0x00, 0x99, 0xe7, 0x59, 0x79, 0x00, 0x99, + 0xea, 0x59, 0x7a, 0x00, 0x99, 0xeb, 0x59, 0x7b, + 0x00, 0x99, 0xec, 0x59, 0x7c, 0x00, 0x99, 0xed, + 0x1c, 0x46, 0x00, 0x99, 0xee, 0x1c, 0x47, 0x00, + 0x99, 0xf0, 0x4a, 0x28, 0x00, 0x99, 0xf1, 0x1c, + 0x48, 0x00, 0x99, 0xf2, 0x1c, 0x49, 0x00, 0x99, + 0xf4, 0x59, 0x7d, 0x00, 0x99, 0xf5, 0x59, 0x7e, + 0x00, 0x99, 0xf8, 0x1c, 0x4b, 0x00, 0x99, 0xf9, + 0x4a, 0x29, 0x00, 0x99, 0xfb, 0x1c, 0x4a, 0x00, + 0x99, 0xfc, 0x4a, 0x2a, 0x00, 0x99, 0xfd, 0x59, + 0x7f, 0x00, 0x99, 0xfe, 0x59, 0x80, 0x00, 0x99, + 0xff, 0x09, 0x63, 0x00, 0x9a, 0x01, 0x1c, 0x4c, + 0x00, 0x9a, 0x02, 0x3b, 0xcf, 0x00, 0x9a, 0x03, + 0x43, 0x2d, 0x00, 0x9a, 0x04, 0x59, 0x81, 0x00, + 0x9a, 0x05, 0x1c, 0x4e, 0x00, 0x9a, 0x08, 0x37, + 0xba, 0x00, 0x9a, 0x0a, 0x4a, 0x2b, 0x00, 0x9a, + 0x0b, 0x59, 0x82, 0x00, 0x9a, 0x0c, 0x4e, 0x1d, + 0x00, 0x9a, 0x0e, 0x06, 0x4d, 0x00, 0x9a, 0x0f, + 0x1c, 0x4d, 0x00, 0x9a, 0x10, 0x4e, 0x1e, 0x00, + 0x9a, 0x11, 0x4a, 0x2c, 0x00, 0x9a, 0x12, 0x0a, + 0xfd, 0x00, 0x9a, 0x13, 0x07, 0x67, 0x00, 0x9a, + 0x16, 0x3b, 0xd0, 0x00, 0x9a, 0x19, 0x1c, 0x50, + 0x00, 0x9a, 0x1a, 0x4a, 0x2d, 0x00, 0x9a, 0x1e, + 0x59, 0x83, 0x00, 0x9a, 0x20, 0x4a, 0x2e, 0x00, + 0x9a, 0x22, 0x59, 0x84, 0x00, 0x9a, 0x23, 0x4e, + 0x1f, 0x00, 0x9a, 0x24, 0x3b, 0xd1, 0x00, 0x9a, + 0x27, 0x3b, 0xd2, 0x00, 0x9a, 0x28, 0x0b, 0x2d, + 0x00, 0x9a, 0x2b, 0x1c, 0x51, 0x00, 0x9a, 0x2d, + 0x3b, 0xd3, 0x00, 0x9a, 0x2e, 0x3b, 0xd4, 0x00, + 0x9a, 0x30, 0x0c, 0x85, 0x00, 0x9a, 0x31, 0x4a, + 0x2f, 0x00, 0x9a, 0x33, 0x59, 0x85, 0x00, 0x9a, + 0x35, 0x59, 0x86, 0x00, 0x9a, 0x36, 0x3b, 0xd5, + 0x00, 0x9a, 0x37, 0x1c, 0x52, 0x00, 0x9a, 0x38, + 0x3b, 0xd6, 0x00, 0x9a, 0x3e, 0x1c, 0x57, 0x00, + 0x9a, 0x40, 0x1c, 0x55, 0x00, 0x9a, 0x41, 0x4e, + 0x20, 0x00, 0x9a, 0x42, 0x1c, 0x54, 0x00, 0x9a, + 0x43, 0x1c, 0x56, 0x00, 0x9a, 0x44, 0x4a, 0x30, + 0x00, 0x9a, 0x45, 0x1c, 0x53, 0x00, 0x9a, 0x47, + 0x59, 0x87, 0x00, 0x9a, 0x4a, 0x3b, 0xd7, 0x00, + 0x9a, 0x4b, 0x59, 0x89, 0x00, 0x9a, 0x4c, 0x4a, + 0x31, 0x00, 0x9a, 0x4d, 0x1c, 0x59, 0x00, 0x9a, + 0x4e, 0x22, 0x00, 0x00, 0x9a, 0x51, 0x4e, 0x21, + 0x00, 0x9a, 0x52, 0x1e, 0x2f, 0x00, 0x9a, 0x54, + 0x59, 0x8a, 0x00, 0x9a, 0x55, 0x1c, 0x58, 0x00, + 0x9a, 0x56, 0x3b, 0xd8, 0x00, 0x9a, 0x57, 0x1c, + 0x5b, 0x00, 0x9a, 0x58, 0x4a, 0x32, 0x00, 0x9a, + 0x5a, 0x06, 0xbb, 0x00, 0x9a, 0x5b, 0x1c, 0x5a, + 0x00, 0x9a, 0x5d, 0x59, 0x8b, 0x00, 0x9a, 0x5f, + 0x1c, 0x5c, 0x00, 0x9a, 0x62, 0x1c, 0x5d, 0x00, + 0x9a, 0x64, 0x1c, 0x5f, 0x00, 0x9a, 0x65, 0x1c, + 0x5e, 0x00, 0x9a, 0x69, 0x1c, 0x60, 0x00, 0x9a, + 0x6a, 0x1c, 0x62, 0x00, 0x9a, 0x6b, 0x1c, 0x61, + 0x00, 0x9a, 0xa8, 0x08, 0x0e, 0x00, 0x9a, 0xaa, + 0x59, 0x8c, 0x00, 0x9a, 0xac, 0x59, 0x8d, 0x00, + 0x9a, 0xad, 0x1c, 0x63, 0x00, 0x9a, 0xae, 0x59, + 0x8e, 0x00, 0x9a, 0xaf, 0x4a, 0x34, 0x00, 0x9a, + 0xb0, 0x1c, 0x64, 0x00, 0x9a, 0xb2, 0x59, 0x8f, + 0x00, 0x9a, 0xb4, 0x59, 0x90, 0x00, 0x9a, 0xb5, + 0x3b, 0xd9, 0x00, 0x9a, 0xb6, 0x3b, 0xda, 0x00, + 0x9a, 0xb7, 0x4a, 0x36, 0x00, 0x9a, 0xb8, 0x05, + 0x9a, 0x00, 0x9a, 0xb9, 0x4a, 0x38, 0x00, 0x9a, + 0xbb, 0x59, 0x91, 0x00, 0x9a, 0xbc, 0x1c, 0x65, + 0x00, 0x9a, 0xbd, 0x4e, 0x22, 0x00, 0x9a, 0xbe, + 0x4e, 0x23, 0x00, 0x9a, 0xbf, 0x59, 0x92, 0x00, + 0x9a, 0xc0, 0x1c, 0x66, 0x00, 0x9a, 0xc1, 0x43, + 0x2e, 0x00, 0x9a, 0xc3, 0x43, 0x2f, 0x00, 0x9a, + 0xc4, 0x0a, 0x37, 0x00, 0x9a, 0xc6, 0x4a, 0x3a, + 0x00, 0x9a, 0xc8, 0x59, 0x93, 0x00, 0x9a, 0xce, + 0x43, 0x30, 0x00, 0x9a, 0xcf, 0x1c, 0x67, 0x00, + 0x9a, 0xd0, 0x4a, 0x3b, 0x00, 0x9a, 0xd1, 0x1c, + 0x68, 0x00, 0x9a, 0xd2, 0x4a, 0x3c, 0x00, 0x9a, + 0xd3, 0x1c, 0x69, 0x00, 0x9a, 0xd4, 0x1c, 0x6a, + 0x00, 0x9a, 0xd5, 0x4a, 0x3d, 0x00, 0x9a, 0xd6, + 0x43, 0x31, 0x00, 0x9a, 0xd7, 0x59, 0x94, 0x00, + 0x9a, 0xd8, 0x07, 0xf4, 0x00, 0x9a, 0xd9, 0x22, + 0x01, 0x00, 0x9a, 0xdb, 0x59, 0x95, 0x00, 0x9a, + 0xdc, 0x22, 0x02, 0x00, 0x9a, 0xde, 0x1c, 0x6b, + 0x00, 0x9a, 0xdf, 0x1c, 0x6c, 0x00, 0x9a, 0xe0, + 0x4a, 0x3e, 0x00, 0x9a, 0xe2, 0x1c, 0x6d, 0x00, + 0x9a, 0xe3, 0x1c, 0x6e, 0x00, 0x9a, 0xe4, 0x59, + 0x96, 0x00, 0x9a, 0xe5, 0x4a, 0x3f, 0x00, 0x9a, + 0xe6, 0x1c, 0x6f, 0x00, 0x9a, 0xe7, 0x59, 0x97, + 0x00, 0x9a, 0xe9, 0x4a, 0x40, 0x00, 0x9a, 0xea, + 0x0d, 0x45, 0x00, 0x9a, 0xeb, 0x1c, 0x71, 0x00, + 0x9a, 0xec, 0x59, 0x98, 0x00, 0x9a, 0xed, 0x0d, + 0x98, 0x00, 0x9a, 0xee, 0x1c, 0x72, 0x00, 0x9a, + 0xef, 0x1c, 0x70, 0x00, 0x9a, 0xf1, 0x1c, 0x74, + 0x00, 0x9a, 0xf2, 0x59, 0x99, 0x00, 0x9a, 0xf3, + 0x59, 0x9a, 0x00, 0x9a, 0xf4, 0x1c, 0x73, 0x00, + 0x9a, 0xf5, 0x59, 0x9b, 0x00, 0x9a, 0xf7, 0x1c, + 0x75, 0x00, 0x9a, 0xf9, 0x3b, 0xdb, 0x00, 0x9a, + 0xfa, 0x59, 0x9c, 0x00, 0x9a, 0xfb, 0x1c, 0x76, + 0x00, 0x9a, 0xfd, 0x59, 0x9d, 0x00, 0x9a, 0xff, + 0x59, 0x9e, 0x00, 0x9b, 0x00, 0x59, 0x9f, 0x00, + 0x9b, 0x01, 0x4e, 0x24, 0x00, 0x9b, 0x02, 0x43, + 0x32, 0x00, 0x9b, 0x03, 0x3b, 0xdc, 0x00, 0x9b, + 0x04, 0x59, 0xa0, 0x00, 0x9b, 0x05, 0x59, 0xa1, + 0x00, 0x9b, 0x06, 0x1c, 0x77, 0x00, 0x9b, 0x08, + 0x43, 0x33, 0x00, 0x9b, 0x09, 0x4e, 0x25, 0x00, + 0x9b, 0x0b, 0x4e, 0x26, 0x00, 0x9b, 0x0c, 0x4a, + 0x41, 0x00, 0x9b, 0x0d, 0x4e, 0x27, 0x00, 0x9b, + 0x0e, 0x4e, 0x28, 0x00, 0x9b, 0x10, 0x4a, 0x42, + 0x00, 0x9b, 0x12, 0x4a, 0x43, 0x00, 0x9b, 0x16, + 0x4a, 0x44, 0x00, 0x9b, 0x18, 0x1c, 0x78, 0x00, + 0x9b, 0x19, 0x4e, 0x29, 0x00, 0x9b, 0x1a, 0x1c, + 0x79, 0x00, 0x9b, 0x1b, 0x59, 0xa2, 0x00, 0x9b, + 0x1c, 0x4a, 0x45, 0x00, 0x9b, 0x1d, 0x4f, 0x49, + 0x00, 0x9b, 0x1f, 0x1c, 0x7a, 0x00, 0x9b, 0x20, + 0x3b, 0xdd, 0x00, 0x9b, 0x22, 0x1c, 0x7b, 0x00, + 0x9b, 0x23, 0x1c, 0x7c, 0x00, 0x9b, 0x25, 0x1c, + 0x7d, 0x00, 0x9b, 0x26, 0x59, 0xa3, 0x00, 0x9b, + 0x27, 0x1c, 0x7e, 0x00, 0x9b, 0x28, 0x1c, 0x7f, + 0x00, 0x9b, 0x29, 0x1c, 0x80, 0x00, 0x9b, 0x2a, + 0x1c, 0x81, 0x00, 0x9b, 0x2b, 0x4a, 0x46, 0x00, + 0x9b, 0x2c, 0x4f, 0x4a, 0x00, 0x9b, 0x2d, 0x43, + 0x35, 0x00, 0x9b, 0x2e, 0x1c, 0x82, 0x00, 0x9b, + 0x2f, 0x1c, 0x83, 0x00, 0x9b, 0x31, 0x14, 0xd4, + 0x00, 0x9b, 0x32, 0x1c, 0x84, 0x00, 0x9b, 0x33, + 0x3b, 0xde, 0x00, 0x9b, 0x34, 0x3b, 0xdf, 0x00, + 0x9b, 0x35, 0x4e, 0x2a, 0x00, 0x9b, 0x37, 0x59, + 0xa5, 0x00, 0x9b, 0x39, 0x59, 0xa6, 0x00, 0x9b, + 0x3a, 0x59, 0xa7, 0x00, 0x9b, 0x3b, 0x17, 0xa9, + 0x00, 0x9b, 0x3c, 0x06, 0x4e, 0x00, 0x9b, 0x3d, + 0x4a, 0x47, 0x00, 0x9b, 0x41, 0x05, 0x7f, 0x00, + 0x9b, 0x42, 0x08, 0x22, 0x00, 0x9b, 0x43, 0x1c, + 0x86, 0x00, 0x9b, 0x44, 0x1c, 0x85, 0x00, 0x9b, + 0x45, 0x0e, 0xb1, 0x00, 0x9b, 0x48, 0x4e, 0x2b, + 0x00, 0x9b, 0x4b, 0x4a, 0x49, 0x00, 0x9b, 0x4c, + 0x59, 0xa8, 0x00, 0x9b, 0x4d, 0x1c, 0x88, 0x00, + 0x9b, 0x4e, 0x1c, 0x89, 0x00, 0x9b, 0x4f, 0x1c, + 0x87, 0x00, 0x9b, 0x51, 0x1c, 0x8a, 0x00, 0x9b, + 0x54, 0x0e, 0x90, 0x00, 0x9b, 0x55, 0x4e, 0x2c, + 0x00, 0x9b, 0x56, 0x59, 0xa9, 0x00, 0x9b, 0x57, + 0x59, 0xaa, 0x00, 0x9b, 0x58, 0x1c, 0x8b, 0x00, + 0x9b, 0x5a, 0x06, 0x95, 0x00, 0x9b, 0x5b, 0x59, + 0xab, 0x00, 0x9b, 0x5e, 0x43, 0x36, 0x00, 0x9b, + 0x61, 0x59, 0xac, 0x00, 0x9b, 0x63, 0x4a, 0x4a, + 0x00, 0x9b, 0x65, 0x4a, 0x4b, 0x00, 0x9b, 0x66, + 0x43, 0x37, 0x00, 0x9b, 0x68, 0x4e, 0x2d, 0x00, + 0x9b, 0x6a, 0x59, 0xad, 0x00, 0x9b, 0x6b, 0x4a, + 0x4c, 0x00, 0x9b, 0x6c, 0x4a, 0x4d, 0x00, 0x9b, + 0x6d, 0x59, 0xae, 0x00, 0x9b, 0x6e, 0x59, 0xaf, + 0x00, 0x9b, 0x6f, 0x0f, 0xcb, 0x00, 0x9b, 0x72, + 0x22, 0x04, 0x00, 0x9b, 0x73, 0x3b, 0xe0, 0x00, + 0x9b, 0x74, 0x1c, 0x8c, 0x00, 0x9b, 0x75, 0x22, + 0x03, 0x00, 0x9b, 0x76, 0x4a, 0x4e, 0x00, 0x9b, + 0x77, 0x4a, 0x4f, 0x00, 0x9b, 0x78, 0x59, 0xb0, + 0x00, 0x9b, 0x79, 0x3b, 0xe1, 0x00, 0x9b, 0x7f, + 0x59, 0xb1, 0x00, 0x9b, 0x80, 0x4e, 0x2e, 0x00, + 0x9b, 0x83, 0x1c, 0x8e, 0x00, 0x9b, 0x84, 0x43, + 0x38, 0x00, 0x9b, 0x85, 0x59, 0xb2, 0x00, 0x9b, + 0x86, 0x4e, 0x2f, 0x00, 0x9b, 0x87, 0x59, 0xb3, + 0x00, 0x9b, 0x89, 0x59, 0xb4, 0x00, 0x9b, 0x8a, + 0x43, 0x39, 0x00, 0x9b, 0x8b, 0x59, 0xb5, 0x00, + 0x9b, 0x8d, 0x59, 0xb6, 0x00, 0x9b, 0x8e, 0x04, + 0x82, 0x00, 0x9b, 0x8f, 0x22, 0x05, 0x00, 0x9b, + 0x90, 0x4e, 0x30, 0x00, 0x9b, 0x91, 0x1c, 0x8f, + 0x00, 0x9b, 0x92, 0x0d, 0xfb, 0x00, 0x9b, 0x93, + 0x1c, 0x8d, 0x00, 0x9b, 0x94, 0x59, 0xb7, 0x00, + 0x9b, 0x96, 0x1c, 0x90, 0x00, 0x9b, 0x97, 0x1c, + 0x91, 0x00, 0x9b, 0x9a, 0x59, 0xb8, 0x00, 0x9b, + 0x9d, 0x4e, 0x31, 0x00, 0x9b, 0x9e, 0x43, 0x3a, + 0x00, 0x9b, 0x9f, 0x1c, 0x92, 0x00, 0x9b, 0xa0, + 0x1c, 0x93, 0x00, 0x9b, 0xa6, 0x4a, 0x50, 0x00, + 0x9b, 0xa7, 0x3b, 0xe2, 0x00, 0x9b, 0xa8, 0x1c, + 0x94, 0x00, 0x9b, 0xa9, 0x59, 0xb9, 0x00, 0x9b, + 0xaa, 0x0e, 0x9c, 0x00, 0x9b, 0xab, 0x08, 0x7b, + 0x00, 0x9b, 0xac, 0x4a, 0x51, 0x00, 0x9b, 0xad, + 0x08, 0x6a, 0x00, 0x9b, 0xae, 0x0a, 0xb1, 0x00, + 0x9b, 0xb0, 0x4e, 0x32, 0x00, 0x9b, 0xb1, 0x22, + 0x06, 0x00, 0x9b, 0xb2, 0x4a, 0x53, 0x00, 0x9b, + 0xb4, 0x1c, 0x95, 0x00, 0x9b, 0xb7, 0x59, 0xba, + 0x00, 0x9b, 0xb8, 0x4a, 0x54, 0x00, 0x9b, 0xb9, + 0x1c, 0x98, 0x00, 0x9b, 0xbb, 0x22, 0x07, 0x00, + 0x9b, 0xbc, 0x59, 0xbb, 0x00, 0x9b, 0xbe, 0x4a, + 0x55, 0x00, 0x9b, 0xbf, 0x4e, 0x33, 0x00, 0x9b, + 0xc0, 0x1c, 0x96, 0x00, 0x9b, 0xc1, 0x3b, 0xe3, + 0x00, 0x9b, 0xc6, 0x1c, 0x99, 0x00, 0x9b, 0xc7, + 0x3b, 0xe4, 0x00, 0x9b, 0xc8, 0x4e, 0x34, 0x00, + 0x9b, 0xc9, 0x07, 0xa5, 0x00, 0x9b, 0xca, 0x1c, + 0x97, 0x00, 0x9b, 0xce, 0x43, 0x3b, 0x00, 0x9b, + 0xcf, 0x1c, 0x9a, 0x00, 0x9b, 0xd0, 0x59, 0xbc, + 0x00, 0x9b, 0xd1, 0x1c, 0x9b, 0x00, 0x9b, 0xd2, + 0x1c, 0x9c, 0x00, 0x9b, 0xd4, 0x1c, 0xa0, 0x00, + 0x9b, 0xd6, 0x08, 0x78, 0x00, 0x9b, 0xd7, 0x3b, + 0xe5, 0x00, 0x9b, 0xd8, 0x4a, 0x57, 0x00, 0x9b, + 0xdb, 0x0b, 0x44, 0x00, 0x9b, 0xdd, 0x4a, 0x58, + 0x00, 0x9b, 0xdf, 0x37, 0xbf, 0x00, 0x9b, 0xe1, + 0x1c, 0xa1, 0x00, 0x9b, 0xe2, 0x1c, 0x9e, 0x00, + 0x9b, 0xe3, 0x1c, 0x9d, 0x00, 0x9b, 0xe4, 0x1c, + 0x9f, 0x00, 0x9b, 0xe5, 0x43, 0x3c, 0x00, 0x9b, + 0xe7, 0x3b, 0xe6, 0x00, 0x9b, 0xe8, 0x07, 0x35, + 0x00, 0x9b, 0xea, 0x4a, 0x59, 0x00, 0x9b, 0xeb, + 0x3b, 0xe7, 0x00, 0x9b, 0xee, 0x4a, 0x5b, 0x00, + 0x9b, 0xef, 0x4a, 0x5a, 0x00, 0x9b, 0xf0, 0x1c, + 0xa5, 0x00, 0x9b, 0xf1, 0x1c, 0xa4, 0x00, 0x9b, + 0xf2, 0x1c, 0xa3, 0x00, 0x9b, 0xf3, 0x4a, 0x56, + 0x00, 0x9b, 0xf5, 0x04, 0x77, 0x00, 0x9b, 0xf7, + 0x3b, 0xe8, 0x00, 0x9b, 0xf8, 0x43, 0x3d, 0x00, + 0x9b, 0xf9, 0x59, 0xbd, 0x00, 0x9b, 0xfa, 0x3b, + 0xe9, 0x00, 0x9b, 0xfd, 0x3b, 0xea, 0x00, 0x9b, + 0xff, 0x4e, 0x35, 0x00, 0x9c, 0x00, 0x22, 0x08, + 0x00, 0x9c, 0x02, 0x4e, 0x36, 0x00, 0x9c, 0x04, + 0x1c, 0xaf, 0x00, 0x9c, 0x06, 0x1c, 0xab, 0x00, + 0x9c, 0x08, 0x1c, 0xac, 0x00, 0x9c, 0x09, 0x1c, + 0xa8, 0x00, 0x9c, 0x0a, 0x1c, 0xae, 0x00, 0x9c, + 0x0b, 0x3b, 0xeb, 0x00, 0x9c, 0x0c, 0x1c, 0xaa, + 0x00, 0x9c, 0x0d, 0x05, 0xc0, 0x00, 0x9c, 0x0f, + 0x59, 0xbe, 0x00, 0x9c, 0x10, 0x0f, 0xf2, 0x00, + 0x9c, 0x11, 0x59, 0xbf, 0x00, 0x9c, 0x12, 0x1c, + 0xad, 0x00, 0x9c, 0x13, 0x1c, 0xa9, 0x00, 0x9c, + 0x14, 0x1c, 0xa7, 0x00, 0x9c, 0x15, 0x1c, 0xa6, + 0x00, 0x9c, 0x16, 0x4a, 0x5f, 0x00, 0x9c, 0x18, + 0x4a, 0x60, 0x00, 0x9c, 0x19, 0x4a, 0x61, 0x00, + 0x9c, 0x1a, 0x4a, 0x62, 0x00, 0x9c, 0x1b, 0x1c, + 0xb1, 0x00, 0x9c, 0x1c, 0x4e, 0x37, 0x00, 0x9c, + 0x1d, 0x4a, 0x63, 0x00, 0x9c, 0x1e, 0x59, 0xc0, + 0x00, 0x9c, 0x21, 0x1c, 0xb4, 0x00, 0x9c, 0x22, + 0x4a, 0x64, 0x00, 0x9c, 0x23, 0x43, 0x3e, 0x00, + 0x9c, 0x24, 0x1c, 0xb3, 0x00, 0x9c, 0x25, 0x1c, + 0xb2, 0x00, 0x9c, 0x26, 0x59, 0xc1, 0x00, 0x9c, + 0x27, 0x3b, 0xec, 0x00, 0x9c, 0x28, 0x59, 0xc2, + 0x00, 0x9c, 0x29, 0x4a, 0x65, 0x00, 0x9c, 0x2a, + 0x3b, 0xed, 0x00, 0x9c, 0x2d, 0x0d, 0xbb, 0x00, + 0x9c, 0x2e, 0x1c, 0xb0, 0x00, 0x9c, 0x2f, 0x04, + 0xb7, 0x00, 0x9c, 0x30, 0x1c, 0xb5, 0x00, 0x9c, + 0x31, 0x4a, 0x67, 0x00, 0x9c, 0x32, 0x1c, 0xb7, + 0x00, 0x9c, 0x35, 0x4e, 0x38, 0x00, 0x9c, 0x36, + 0x3b, 0xee, 0x00, 0x9c, 0x37, 0x4a, 0x68, 0x00, + 0x9c, 0x39, 0x05, 0xcd, 0x00, 0x9c, 0x3a, 0x1c, + 0xa2, 0x00, 0x9c, 0x3b, 0x04, 0xd9, 0x00, 0x9c, + 0x3d, 0x59, 0xc3, 0x00, 0x9c, 0x3e, 0x1c, 0xb9, + 0x00, 0x9c, 0x41, 0x3b, 0xef, 0x00, 0x9c, 0x43, + 0x59, 0xc4, 0x00, 0x9c, 0x44, 0x4e, 0x39, 0x00, + 0x9c, 0x45, 0x4a, 0x69, 0x00, 0x9c, 0x46, 0x1c, + 0xb8, 0x00, 0x9c, 0x47, 0x1c, 0xb6, 0x00, 0x9c, + 0x48, 0x0b, 0x6b, 0x00, 0x9c, 0x49, 0x4a, 0x6c, + 0x00, 0x9c, 0x4a, 0x4a, 0x6d, 0x00, 0x9c, 0x4e, + 0x59, 0xc5, 0x00, 0x9c, 0x4f, 0x43, 0x3f, 0x00, + 0x9c, 0x50, 0x43, 0x40, 0x00, 0x9c, 0x52, 0x0e, + 0x9e, 0x00, 0x9c, 0x53, 0x3b, 0xf0, 0x00, 0x9c, + 0x54, 0x4a, 0x6f, 0x00, 0x9c, 0x56, 0x4e, 0x3a, + 0x00, 0x9c, 0x57, 0x0f, 0xa2, 0x00, 0x9c, 0x58, + 0x4a, 0x70, 0x00, 0x9c, 0x5a, 0x1c, 0xba, 0x00, + 0x9c, 0x5b, 0x4a, 0x71, 0x00, 0x9c, 0x5c, 0x4a, + 0x6a, 0x00, 0x9c, 0x5d, 0x4a, 0x72, 0x00, 0x9c, + 0x5e, 0x59, 0xc6, 0x00, 0x9c, 0x5f, 0x4a, 0x73, + 0x00, 0x9c, 0x60, 0x1c, 0xbb, 0x00, 0x9c, 0x61, + 0x4e, 0x3b, 0x00, 0x9c, 0x63, 0x3b, 0xf1, 0x00, + 0x9c, 0x65, 0x43, 0x41, 0x00, 0x9c, 0x67, 0x1c, + 0xbc, 0x00, 0x9c, 0x68, 0x4e, 0x3c, 0x00, 0x9c, + 0x69, 0x4a, 0x74, 0x00, 0x9c, 0x6a, 0x4a, 0x75, + 0x00, 0x9c, 0x6b, 0x4a, 0x76, 0x00, 0x9c, 0x6d, + 0x4a, 0x77, 0x00, 0x9c, 0x6e, 0x4a, 0x78, 0x00, + 0x9c, 0x70, 0x3b, 0xf2, 0x00, 0x9c, 0x72, 0x4a, + 0x79, 0x00, 0x9c, 0x75, 0x4a, 0x7a, 0x00, 0x9c, + 0x76, 0x1c, 0xbd, 0x00, 0x9c, 0x77, 0x3b, 0xf3, + 0x00, 0x9c, 0x78, 0x1c, 0xbe, 0x00, 0x9c, 0x7a, + 0x4a, 0x7b, 0x00, 0x9c, 0x7b, 0x59, 0xc7, 0x00, + 0x9c, 0xe5, 0x0b, 0xd7, 0x00, 0x9c, 0xe6, 0x4a, + 0x7c, 0x00, 0x9c, 0xe7, 0x1c, 0xbf, 0x00, 0x9c, + 0xe9, 0x0d, 0x4b, 0x00, 0x9c, 0xeb, 0x1c, 0xc4, + 0x00, 0x9c, 0xec, 0x1c, 0xc0, 0x00, 0x9c, 0xf0, + 0x1c, 0xc1, 0x00, 0x9c, 0xf2, 0x4a, 0x7d, 0x00, + 0x9c, 0xf3, 0x0e, 0x5f, 0x00, 0x9c, 0xf4, 0x0e, + 0xd0, 0x00, 0x9c, 0xf6, 0x0c, 0xa8, 0x00, 0x9c, + 0xf7, 0x59, 0xc8, 0x00, 0x9c, 0xf9, 0x59, 0xc9, + 0x00, 0x9d, 0x02, 0x3b, 0xf4, 0x00, 0x9d, 0x03, + 0x1c, 0xc5, 0x00, 0x9d, 0x06, 0x1c, 0xc6, 0x00, + 0x9d, 0x07, 0x0c, 0x96, 0x00, 0x9d, 0x08, 0x1c, + 0xc3, 0x00, 0x9d, 0x09, 0x1c, 0xc2, 0x00, 0x9d, + 0x0b, 0x4a, 0x7e, 0x00, 0x9d, 0x0e, 0x05, 0x2a, + 0x00, 0x9d, 0x11, 0x4a, 0x80, 0x00, 0x9d, 0x12, + 0x1c, 0xce, 0x00, 0x9d, 0x15, 0x1c, 0xcd, 0x00, + 0x9d, 0x17, 0x4a, 0x81, 0x00, 0x9d, 0x18, 0x4a, + 0x82, 0x00, 0x9d, 0x1b, 0x05, 0x17, 0x00, 0x9d, + 0x1c, 0x59, 0xca, 0x00, 0x9d, 0x1d, 0x43, 0x42, + 0x00, 0x9d, 0x1e, 0x43, 0x43, 0x00, 0x9d, 0x1f, + 0x1c, 0xcb, 0x00, 0x9d, 0x23, 0x1c, 0xca, 0x00, + 0x9d, 0x26, 0x1c, 0xc8, 0x00, 0x9d, 0x28, 0x05, + 0xd9, 0x00, 0x9d, 0x2a, 0x1c, 0xc7, 0x00, 0x9d, + 0x2b, 0x08, 0xde, 0x00, 0x9d, 0x2c, 0x05, 0x29, + 0x00, 0x9d, 0x2f, 0x59, 0xcb, 0x00, 0x9d, 0x30, + 0x4e, 0x3d, 0x00, 0x9d, 0x32, 0x4a, 0x86, 0x00, + 0x9d, 0x33, 0x59, 0xcc, 0x00, 0x9d, 0x34, 0x59, + 0xcd, 0x00, 0x9d, 0x3a, 0x59, 0xce, 0x00, 0x9d, + 0x3b, 0x07, 0xf5, 0x00, 0x9d, 0x3c, 0x59, 0xcf, + 0x00, 0x9d, 0x3d, 0x4e, 0x3e, 0x00, 0x9d, 0x3e, + 0x1c, 0xd1, 0x00, 0x9d, 0x3f, 0x1c, 0xd0, 0x00, + 0x9d, 0x41, 0x1c, 0xcf, 0x00, 0x9d, 0x42, 0x3b, + 0xf5, 0x00, 0x9d, 0x43, 0x43, 0x44, 0x00, 0x9d, + 0x44, 0x1c, 0xcc, 0x00, 0x9d, 0x45, 0x59, 0xd0, + 0x00, 0x9d, 0x46, 0x1c, 0xd2, 0x00, 0x9d, 0x47, + 0x3b, 0xf6, 0x00, 0x9d, 0x48, 0x1c, 0xd3, 0x00, + 0x9d, 0x4a, 0x4a, 0x88, 0x00, 0x9d, 0x50, 0x1c, + 0xd8, 0x00, 0x9d, 0x51, 0x1c, 0xd7, 0x00, 0x9d, + 0x52, 0x43, 0x45, 0x00, 0x9d, 0x53, 0x59, 0xd1, + 0x00, 0x9d, 0x54, 0x59, 0xd2, 0x00, 0x9d, 0x59, + 0x1c, 0xd9, 0x00, 0x9d, 0x5c, 0x04, 0xcf, 0x00, + 0x9d, 0x5d, 0x1c, 0xd4, 0x00, 0x9d, 0x5e, 0x1c, + 0xd5, 0x00, 0x9d, 0x5f, 0x4a, 0x89, 0x00, 0x9d, + 0x60, 0x08, 0x06, 0x00, 0x9d, 0x61, 0x0e, 0xc5, + 0x00, 0x9d, 0x62, 0x4a, 0x8a, 0x00, 0x9d, 0x63, + 0x3b, 0xf7, 0x00, 0x9d, 0x64, 0x1c, 0xd6, 0x00, + 0x9d, 0x65, 0x59, 0xd3, 0x00, 0x9d, 0x69, 0x3b, + 0xf8, 0x00, 0x9d, 0x6a, 0x4e, 0x3f, 0x00, 0x9d, + 0x6b, 0x22, 0x0a, 0x00, 0x9d, 0x6c, 0x0e, 0x60, + 0x00, 0x9d, 0x6f, 0x1c, 0xde, 0x00, 0x9d, 0x70, + 0x22, 0x09, 0x00, 0x9d, 0x72, 0x1c, 0xda, 0x00, + 0x9d, 0x73, 0x4a, 0x8d, 0x00, 0x9d, 0x76, 0x4a, + 0x8e, 0x00, 0x9d, 0x77, 0x4a, 0x8f, 0x00, 0x9d, + 0x7a, 0x1c, 0xdf, 0x00, 0x9d, 0x7b, 0x4e, 0x40, + 0x00, 0x9d, 0x7c, 0x3b, 0xf9, 0x00, 0x9d, 0x7e, + 0x3b, 0xfa, 0x00, 0x9d, 0x83, 0x59, 0xd4, 0x00, + 0x9d, 0x84, 0x4a, 0x90, 0x00, 0x9d, 0x86, 0x59, + 0xd5, 0x00, 0x9d, 0x87, 0x1c, 0xdc, 0x00, 0x9d, + 0x89, 0x1c, 0xdb, 0x00, 0x9d, 0x8a, 0x43, 0x46, + 0x00, 0x9d, 0x8d, 0x3b, 0xfb, 0x00, 0x9d, 0x8e, + 0x59, 0xd6, 0x00, 0x9d, 0x8f, 0x07, 0x32, 0x00, + 0x9d, 0x92, 0x59, 0xd7, 0x00, 0x9d, 0x93, 0x59, + 0xd8, 0x00, 0x9d, 0x95, 0x59, 0xd9, 0x00, 0x9d, + 0x96, 0x43, 0x47, 0x00, 0x9d, 0x97, 0x59, 0xda, + 0x00, 0x9d, 0x98, 0x59, 0xdb, 0x00, 0x9d, 0x99, + 0x4a, 0x91, 0x00, 0x9d, 0x9a, 0x1c, 0xe0, 0x00, + 0x9d, 0xa1, 0x4a, 0x92, 0x00, 0x9d, 0xa4, 0x1c, + 0xe1, 0x00, 0x9d, 0xa9, 0x1c, 0xe2, 0x00, 0x9d, + 0xaa, 0x59, 0xdc, 0x00, 0x9d, 0xab, 0x1c, 0xdd, + 0x00, 0x9d, 0xac, 0x43, 0x49, 0x00, 0x9d, 0xae, + 0x59, 0xdd, 0x00, 0x9d, 0xaf, 0x1c, 0xc9, 0x00, + 0x9d, 0xb1, 0x3b, 0xfc, 0x00, 0x9d, 0xb2, 0x1c, + 0xe3, 0x00, 0x9d, 0xb4, 0x22, 0x0b, 0x00, 0x9d, + 0xb5, 0x4a, 0x94, 0x00, 0x9d, 0xb8, 0x1c, 0xe7, + 0x00, 0x9d, 0xb9, 0x4a, 0x95, 0x00, 0x9d, 0xba, + 0x1c, 0xe8, 0x00, 0x9d, 0xbb, 0x1c, 0xe6, 0x00, + 0x9d, 0xbc, 0x43, 0x4a, 0x00, 0x9d, 0xbd, 0x4a, + 0x96, 0x00, 0x9d, 0xbf, 0x4a, 0x93, 0x00, 0x9d, + 0xc0, 0x43, 0x48, 0x00, 0x9d, 0xc1, 0x1c, 0xe5, + 0x00, 0x9d, 0xc2, 0x1c, 0xeb, 0x00, 0x9d, 0xc3, + 0x3b, 0xfd, 0x00, 0x9d, 0xc4, 0x1c, 0xe4, 0x00, + 0x9d, 0xc6, 0x1c, 0xe9, 0x00, 0x9d, 0xc7, 0x3b, + 0xfe, 0x00, 0x9d, 0xc9, 0x4a, 0x97, 0x00, 0x9d, + 0xca, 0x59, 0xdf, 0x00, 0x9d, 0xcf, 0x1c, 0xea, + 0x00, 0x9d, 0xd3, 0x1c, 0xed, 0x00, 0x9d, 0xd4, + 0x59, 0xe0, 0x00, 0x9d, 0xd5, 0x59, 0xe1, 0x00, + 0x9d, 0xd6, 0x3b, 0xff, 0x00, 0x9d, 0xd7, 0x1d, + 0xde, 0x00, 0x9d, 0xd9, 0x1c, 0xec, 0x00, 0x9d, + 0xda, 0x4a, 0x98, 0x00, 0x9d, 0xde, 0x59, 0xe2, + 0x00, 0x9d, 0xdf, 0x3c, 0x00, 0x00, 0x9d, 0xe0, + 0x4a, 0x99, 0x00, 0x9d, 0xe3, 0x4a, 0x9a, 0x00, + 0x9d, 0xe5, 0x4e, 0x41, 0x00, 0x9d, 0xe6, 0x1c, + 0xef, 0x00, 0x9d, 0xe7, 0x43, 0x4c, 0x00, 0x9d, + 0xe9, 0x4e, 0x42, 0x00, 0x9d, 0xeb, 0x3c, 0x01, + 0x00, 0x9d, 0xed, 0x1c, 0xf0, 0x00, 0x9d, 0xee, + 0x59, 0xe3, 0x00, 0x9d, 0xef, 0x1c, 0xf1, 0x00, + 0x9d, 0xf0, 0x59, 0xe4, 0x00, 0x9d, 0xf2, 0x0f, + 0xef, 0x00, 0x9d, 0xf3, 0x4e, 0x43, 0x00, 0x9d, + 0xf4, 0x3c, 0x02, 0x00, 0x9d, 0xf8, 0x1c, 0xee, + 0x00, 0x9d, 0xf9, 0x0b, 0x4b, 0x00, 0x9d, 0xfa, + 0x08, 0x5d, 0x00, 0x9d, 0xfd, 0x1c, 0xf2, 0x00, + 0x9d, 0xfe, 0x59, 0xe5, 0x00, 0x9e, 0x02, 0x4a, + 0x9d, 0x00, 0x9e, 0x07, 0x43, 0x4d, 0x00, 0x9e, + 0x0a, 0x4a, 0x9c, 0x00, 0x9e, 0x0d, 0x4a, 0x9e, + 0x00, 0x9e, 0x0e, 0x59, 0xe6, 0x00, 0x9e, 0x10, + 0x59, 0xe7, 0x00, 0x9e, 0x11, 0x59, 0xe8, 0x00, + 0x9e, 0x12, 0x59, 0xe9, 0x00, 0x9e, 0x15, 0x3c, + 0x03, 0x00, 0x9e, 0x16, 0x59, 0xea, 0x00, 0x9e, + 0x19, 0x22, 0x0c, 0x00, 0x9e, 0x1a, 0x1c, 0xf3, + 0x00, 0x9e, 0x1b, 0x1c, 0xf4, 0x00, 0x9e, 0x1c, + 0x4a, 0x9f, 0x00, 0x9e, 0x1d, 0x3c, 0x04, 0x00, + 0x9e, 0x1e, 0x1c, 0xf5, 0x00, 0x9e, 0x75, 0x1c, + 0xf6, 0x00, 0x9e, 0x78, 0x07, 0x68, 0x00, 0x9e, + 0x79, 0x1c, 0xf7, 0x00, 0x9e, 0x7a, 0x4e, 0x44, + 0x00, 0x9e, 0x7b, 0x4a, 0xa0, 0x00, 0x9e, 0x7c, + 0x1d, 0xfd, 0x00, 0x9e, 0x7d, 0x1c, 0xf8, 0x00, + 0x9e, 0x7f, 0x08, 0xdb, 0x00, 0x9e, 0x80, 0x4a, + 0xa2, 0x00, 0x9e, 0x81, 0x1c, 0xf9, 0x00, 0x9e, + 0x82, 0x4e, 0x45, 0x00, 0x9e, 0x83, 0x4e, 0x46, + 0x00, 0x9e, 0x84, 0x4e, 0x47, 0x00, 0x9e, 0x85, + 0x4a, 0xa3, 0x00, 0x9e, 0x87, 0x59, 0xeb, 0x00, + 0x9e, 0x88, 0x1c, 0xfa, 0x00, 0x9e, 0x8b, 0x1c, + 0xfb, 0x00, 0x9e, 0x8c, 0x1c, 0xfc, 0x00, 0x9e, + 0x8e, 0x59, 0xec, 0x00, 0x9e, 0x8f, 0x59, 0xed, + 0x00, 0x9e, 0x91, 0x1c, 0xff, 0x00, 0x9e, 0x92, + 0x1c, 0xfd, 0x00, 0x9e, 0x93, 0x0f, 0xe2, 0x00, + 0x9e, 0x95, 0x1c, 0xfe, 0x00, 0x9e, 0x96, 0x59, + 0xee, 0x00, 0x9e, 0x97, 0x0f, 0xb7, 0x00, 0x9e, + 0x98, 0x59, 0xef, 0x00, 0x9e, 0x9b, 0x4a, 0xa4, + 0x00, 0x9e, 0x9d, 0x1d, 0x00, 0x00, 0x9e, 0x9e, + 0x43, 0x4e, 0x00, 0x9e, 0x9f, 0x0f, 0xa3, 0x00, + 0x9e, 0xa4, 0x3c, 0x05, 0x00, 0x9e, 0xa5, 0x1d, + 0x01, 0x00, 0x9e, 0xa6, 0x0d, 0x34, 0x00, 0x9e, + 0xa8, 0x3c, 0x06, 0x00, 0x9e, 0xa9, 0x1d, 0x02, + 0x00, 0x9e, 0xaa, 0x1d, 0x04, 0x00, 0x9e, 0xac, + 0x3c, 0x07, 0x00, 0x9e, 0xad, 0x1d, 0x05, 0x00, + 0x9e, 0xae, 0x59, 0xf0, 0x00, 0x9e, 0xaf, 0x43, + 0x4f, 0x00, 0x9e, 0xb0, 0x4e, 0x48, 0x00, 0x9e, + 0xb3, 0x59, 0xf1, 0x00, 0x9e, 0xb4, 0x1e, 0x02, + 0x00, 0x9e, 0xb5, 0x1e, 0x75, 0x00, 0x9e, 0xb8, + 0x1d, 0x03, 0x00, 0x9e, 0xb9, 0x07, 0xff, 0x00, + 0x9e, 0xba, 0x0e, 0xd9, 0x00, 0x9e, 0xbb, 0x0e, + 0x91, 0x00, 0x9e, 0xbc, 0x12, 0x84, 0x00, 0x9e, + 0xbd, 0x4a, 0xa6, 0x00, 0x9e, 0xbe, 0x14, 0xff, + 0x00, 0x9e, 0xbf, 0x0e, 0xa9, 0x00, 0x9e, 0xc3, + 0x34, 0x0b, 0x00, 0x9e, 0xc4, 0x05, 0x2b, 0x00, + 0x9e, 0xc6, 0x59, 0xf2, 0x00, 0x9e, 0xc8, 0x59, + 0xf3, 0x00, 0x9e, 0xcb, 0x59, 0xf4, 0x00, 0x9e, + 0xcc, 0x1d, 0x07, 0x00, 0x9e, 0xcd, 0x06, 0x6a, + 0x00, 0x9e, 0xce, 0x1d, 0x08, 0x00, 0x9e, 0xcf, + 0x1d, 0x09, 0x00, 0x9e, 0xd0, 0x1d, 0x0a, 0x00, + 0x9e, 0xd1, 0x22, 0x0d, 0x00, 0x9e, 0xd2, 0x08, + 0x07, 0x00, 0x9e, 0xd4, 0x1d, 0x0b, 0x00, 0x9e, + 0xd5, 0x59, 0xf5, 0x00, 0x9e, 0xd8, 0x16, 0x0d, + 0x00, 0x9e, 0xd9, 0x0e, 0xe7, 0x00, 0x9e, 0xdb, + 0x0b, 0x43, 0x00, 0x9e, 0xdc, 0x1d, 0x0c, 0x00, + 0x9e, 0xdd, 0x1d, 0x0e, 0x00, 0x9e, 0xde, 0x1d, + 0x0d, 0x00, 0x9e, 0xdf, 0x4a, 0xa8, 0x00, 0x9e, + 0xe0, 0x1d, 0x0f, 0x00, 0x9e, 0xe4, 0x4e, 0x49, + 0x00, 0x9e, 0xe5, 0x1d, 0x10, 0x00, 0x9e, 0xe7, + 0x3c, 0x08, 0x00, 0x9e, 0xe8, 0x1d, 0x11, 0x00, + 0x9e, 0xec, 0x59, 0xf6, 0x00, 0x9e, 0xed, 0x59, + 0xf7, 0x00, 0x9e, 0xee, 0x3c, 0x09, 0x00, 0x9e, + 0xef, 0x1d, 0x12, 0x00, 0x9e, 0xf0, 0x4e, 0x4a, + 0x00, 0x9e, 0xf1, 0x59, 0xf8, 0x00, 0x9e, 0xf2, + 0x4e, 0x4b, 0x00, 0x9e, 0xf4, 0x1d, 0x13, 0x00, + 0x9e, 0xf5, 0x59, 0xf9, 0x00, 0x9e, 0xf6, 0x1d, + 0x14, 0x00, 0x9e, 0xf7, 0x1d, 0x15, 0x00, 0x9e, + 0xf8, 0x59, 0xfa, 0x00, 0x9e, 0xf9, 0x1d, 0x16, + 0x00, 0x9e, 0xfb, 0x1d, 0x17, 0x00, 0x9e, 0xfc, + 0x1d, 0x18, 0x00, 0x9e, 0xfd, 0x1d, 0x19, 0x00, + 0x9e, 0xff, 0x4a, 0xa9, 0x00, 0x9f, 0x02, 0x4a, + 0xaa, 0x00, 0x9f, 0x03, 0x4a, 0xac, 0x00, 0x9f, + 0x07, 0x1d, 0x1a, 0x00, 0x9f, 0x08, 0x1d, 0x1b, + 0x00, 0x9f, 0x09, 0x4e, 0x4c, 0x00, 0x9f, 0x0e, + 0x0c, 0x1e, 0x00, 0x9f, 0x0f, 0x4e, 0x4d, 0x00, + 0x9f, 0x10, 0x3c, 0x0a, 0x00, 0x9f, 0x11, 0x59, + 0xfb, 0x00, 0x9f, 0x12, 0x3c, 0x0b, 0x00, 0x9f, + 0x13, 0x07, 0x91, 0x00, 0x9f, 0x14, 0x4e, 0x4e, + 0x00, 0x9f, 0x15, 0x1d, 0x1d, 0x00, 0x9f, 0x16, + 0x59, 0xfc, 0x00, 0x9f, 0x17, 0x3c, 0x0c, 0x00, + 0x9f, 0x19, 0x3c, 0x0d, 0x00, 0x9f, 0x1a, 0x59, + 0xfd, 0x00, 0x9f, 0x1b, 0x4e, 0x4f, 0x00, 0x9f, + 0x1f, 0x59, 0xfe, 0x00, 0x9f, 0x20, 0x0a, 0xcf, + 0x00, 0x9f, 0x21, 0x1d, 0x1e, 0x00, 0x9f, 0x22, + 0x4e, 0x50, 0x00, 0x9f, 0x26, 0x4e, 0x51, 0x00, + 0x9f, 0x2a, 0x4e, 0x52, 0x00, 0x9f, 0x2b, 0x4e, + 0x53, 0x00, 0x9f, 0x2c, 0x1d, 0x1f, 0x00, 0x9f, + 0x2f, 0x3c, 0x0e, 0x00, 0x9f, 0x31, 0x59, 0xff, + 0x00, 0x9f, 0x32, 0x5a, 0x00, 0x00, 0x9f, 0x34, + 0x4e, 0x54, 0x00, 0x9f, 0x37, 0x3c, 0x0f, 0x00, + 0x9f, 0x39, 0x3c, 0x10, 0x00, 0x9f, 0x3a, 0x4a, + 0xad, 0x00, 0x9f, 0x3b, 0x0d, 0x93, 0x00, 0x9f, + 0x3c, 0x5a, 0x01, 0x00, 0x9f, 0x3d, 0x4a, 0xae, + 0x00, 0x9f, 0x3e, 0x1d, 0x20, 0x00, 0x9f, 0x3f, + 0x5a, 0x02, 0x00, 0x9f, 0x41, 0x3c, 0x11, 0x00, + 0x9f, 0x43, 0x5a, 0x03, 0x00, 0x9f, 0x44, 0x5a, + 0x04, 0x00, 0x9f, 0x45, 0x3c, 0x12, 0x00, 0x9f, + 0x46, 0x4a, 0xaf, 0x00, 0x9f, 0x47, 0x5a, 0x05, + 0x00, 0x9f, 0x4a, 0x1d, 0x21, 0x00, 0x9f, 0x4b, + 0x17, 0x0a, 0x00, 0x9f, 0x4e, 0x1a, 0x7b, 0x00, + 0x9f, 0x4f, 0x1c, 0x06, 0x00, 0x9f, 0x52, 0x1d, + 0x22, 0x00, 0x9f, 0x53, 0x4a, 0xb0, 0x00, 0x9f, + 0x54, 0x1d, 0x23, 0x00, 0x9f, 0x55, 0x4a, 0xb1, + 0x00, 0x9f, 0x56, 0x5a, 0x06, 0x00, 0x9f, 0x57, + 0x3c, 0x13, 0x00, 0x9f, 0x58, 0x4a, 0xb2, 0x00, + 0x9f, 0x5a, 0x4e, 0x55, 0x00, 0x9f, 0x5d, 0x4a, + 0xb4, 0x00, 0x9f, 0x5e, 0x5a, 0x07, 0x00, 0x9f, + 0x5f, 0x1d, 0x25, 0x00, 0x9f, 0x60, 0x1d, 0x26, + 0x00, 0x9f, 0x61, 0x1d, 0x27, 0x00, 0x9f, 0x62, + 0x0f, 0xb8, 0x00, 0x9f, 0x63, 0x1d, 0x24, 0x00, + 0x9f, 0x66, 0x1d, 0x28, 0x00, 0x9f, 0x67, 0x1d, + 0x29, 0x00, 0x9f, 0x68, 0x3c, 0x14, 0x00, 0x9f, + 0x69, 0x4a, 0xb6, 0x00, 0x9f, 0x6a, 0x1d, 0x2b, + 0x00, 0x9f, 0x6c, 0x1d, 0x2a, 0x00, 0x9f, 0x6d, + 0x4a, 0xb7, 0x00, 0x9f, 0x6e, 0x5a, 0x08, 0x00, + 0x9f, 0x6f, 0x4e, 0x56, 0x00, 0x9f, 0x70, 0x4a, + 0xb8, 0x00, 0x9f, 0x71, 0x3c, 0x15, 0x00, 0x9f, + 0x72, 0x1d, 0x2d, 0x00, 0x9f, 0x73, 0x5a, 0x09, + 0x00, 0x9f, 0x75, 0x3c, 0x16, 0x00, 0x9f, 0x76, + 0x1d, 0x2e, 0x00, 0x9f, 0x77, 0x1d, 0x2c, 0x00, + 0x9f, 0x7a, 0x5a, 0x0a, 0x00, 0x9f, 0x7d, 0x5a, + 0x0b, 0x00, 0x9f, 0x8d, 0x0f, 0x7e, 0x00, 0x9f, + 0x8f, 0x5a, 0x0c, 0x00, 0x9f, 0x90, 0x3c, 0x17, + 0x00, 0x9f, 0x91, 0x5a, 0x0d, 0x00, 0x9f, 0x92, + 0x5a, 0x0e, 0x00, 0x9f, 0x94, 0x3c, 0x18, 0x00, + 0x9f, 0x95, 0x1d, 0x2f, 0x00, 0x9f, 0x96, 0x5a, + 0x0f, 0x00, 0x9f, 0x97, 0x43, 0x50, 0x00, 0x9f, + 0x9c, 0x1d, 0x30, 0x00, 0x9f, 0x9d, 0x17, 0x27, + 0x00, 0x9f, 0x9e, 0x4e, 0x57, 0x00, 0x9f, 0xa0, + 0x1d, 0x31, 0x00, 0x9f, 0xa1, 0x5a, 0x10, 0x00, + 0x9f, 0xa2, 0x3c, 0x19, 0x00, 0x9f, 0xa3, 0x5a, + 0x11, 0x00, 0x9f, 0xa5, 0x4e, 0x58, 0x00, 0x9f, + 0xb4, 0x36, 0xe0, 0x00, 0x9f, 0xbc, 0x3c, 0x47, + 0x00, 0x9f, 0xbd, 0x3c, 0x45, 0x00, 0x9f, 0xbe, + 0x3c, 0x4a, 0x00, 0x9f, 0xbf, 0x4e, 0x64, 0x00, + 0x9f, 0xc0, 0x4e, 0x65, 0x00, 0x9f, 0xc1, 0x4e, + 0x66, 0x00, 0x9f, 0xc2, 0x4e, 0x67, 0x00, 0x9f, + 0xc4, 0x37, 0x09, 0x00, 0x9f, 0xc6, 0x37, 0x58, + 0x00, 0x9f, 0xcc, 0x4e, 0xbc, 0x00, 0xfa, 0x0e, + 0x20, 0xda, 0x00, 0xfa, 0x0f, 0x20, 0xe5, 0x00, + 0xfa, 0x11, 0x37, 0xd2, 0x00, 0xfa, 0x13, 0x21, + 0x31, 0x00, 0xfa, 0x14, 0x21, 0x33, 0x00, 0xfa, + 0x1f, 0x21, 0xa2, 0x00, 0xfa, 0x21, 0x21, 0xa5, + 0x00, 0xfa, 0x23, 0x21, 0xb6, 0x00, 0xfa, 0x24, + 0x49, 0x48, 0x00, 0xfa, 0x27, 0x21, 0xd8, 0x00, + 0xfa, 0x28, 0x21, 0xdf, 0x00, 0xfa, 0x29, 0x21, + 0xef, 0x02, 0x00, 0x0b, 0x36, 0x0f, 0x02, 0x00, + 0x89, 0x43, 0x51, 0x02, 0x00, 0x8a, 0x37, 0x1c, + 0x02, 0x00, 0xa2, 0x43, 0x58, 0x02, 0x00, 0xa4, + 0x43, 0x5b, 0x02, 0x00, 0xb0, 0x37, 0x81, 0x02, + 0x00, 0xf5, 0x4e, 0x59, 0x02, 0x01, 0x58, 0x4e, + 0x6b, 0x02, 0x01, 0xa2, 0x36, 0x21, 0x02, 0x02, + 0x13, 0x43, 0x6b, 0x02, 0x03, 0x2b, 0x43, 0x82, + 0x02, 0x03, 0x71, 0x43, 0x8b, 0x02, 0x03, 0x81, + 0x43, 0x89, 0x02, 0x03, 0xf9, 0x43, 0x8f, 0x02, + 0x04, 0x4a, 0x43, 0x91, 0x02, 0x05, 0x09, 0x43, + 0x93, 0x02, 0x05, 0x3f, 0x37, 0x6c, 0x02, 0x05, + 0xb1, 0x4e, 0x70, 0x02, 0x05, 0xd6, 0x43, 0x9c, + 0x02, 0x06, 0x11, 0x37, 0xd6, 0x02, 0x06, 0x28, + 0x37, 0x19, 0x02, 0x06, 0xec, 0x4e, 0x73, 0x02, + 0x07, 0x4f, 0x43, 0xa0, 0x02, 0x07, 0xc8, 0x4e, + 0xa0, 0x02, 0x08, 0x07, 0x43, 0xa7, 0x02, 0x08, + 0x3a, 0x43, 0xa9, 0x02, 0x08, 0xb9, 0x43, 0xaf, + 0x02, 0x09, 0x0e, 0x34, 0xd3, 0x02, 0x09, 0x7c, + 0x43, 0xb3, 0x02, 0x09, 0x84, 0x37, 0x1d, 0x02, + 0x09, 0x9d, 0x43, 0xb4, 0x02, 0x0a, 0x64, 0x35, + 0xbb, 0x02, 0x0a, 0xd3, 0x43, 0xb9, 0x02, 0x0b, + 0x1d, 0x43, 0xbc, 0x02, 0x0b, 0x9f, 0x35, 0xeb, + 0x02, 0x0b, 0xb7, 0x35, 0x8a, 0x02, 0x0d, 0x45, + 0x43, 0xcf, 0x02, 0x0d, 0x58, 0x4e, 0x7a, 0x02, + 0x0d, 0xe1, 0x43, 0xdd, 0x02, 0x0e, 0x64, 0x43, + 0xec, 0x02, 0x0e, 0x6d, 0x43, 0xe4, 0x02, 0x0e, + 0x95, 0x43, 0xe3, 0x02, 0x0f, 0x5f, 0x43, 0xef, + 0x02, 0x12, 0x01, 0x44, 0x06, 0x02, 0x12, 0x3d, + 0x36, 0x81, 0x02, 0x12, 0x55, 0x44, 0x07, 0x02, + 0x12, 0x74, 0x44, 0x0d, 0x02, 0x12, 0x7b, 0x44, + 0x09, 0x02, 0x12, 0xd7, 0x44, 0x15, 0x02, 0x12, + 0xe4, 0x44, 0x14, 0x02, 0x12, 0xfd, 0x44, 0x1b, + 0x02, 0x13, 0x1b, 0x41, 0xb0, 0x02, 0x13, 0x36, + 0x44, 0x1d, 0x02, 0x13, 0x44, 0x44, 0x1e, 0x02, + 0x13, 0xc4, 0x44, 0x29, 0x02, 0x14, 0x6d, 0x44, + 0x36, 0x02, 0x14, 0x6e, 0x41, 0xb5, 0x02, 0x15, + 0xd7, 0x44, 0x40, 0x02, 0x16, 0x47, 0x44, 0x48, + 0x02, 0x16, 0xb4, 0x41, 0xc6, 0x02, 0x17, 0x06, + 0x44, 0x54, 0x02, 0x17, 0x42, 0x44, 0x55, 0x02, + 0x18, 0xbd, 0x41, 0xc1, 0x02, 0x19, 0xc3, 0x44, + 0x75, 0x02, 0x1a, 0x1a, 0x1e, 0x91, 0x02, 0x1c, + 0x56, 0x44, 0x83, 0x02, 0x1d, 0x2d, 0x44, 0x88, + 0x02, 0x1d, 0x45, 0x44, 0x89, 0x02, 0x1d, 0x62, + 0x44, 0x8b, 0x02, 0x1d, 0x78, 0x44, 0x8a, 0x02, + 0x1d, 0x92, 0x44, 0x94, 0x02, 0x1d, 0x9c, 0x44, + 0x90, 0x02, 0x1d, 0xa1, 0x44, 0x8f, 0x02, 0x1d, + 0xb7, 0x44, 0x97, 0x02, 0x1d, 0xe0, 0x44, 0x99, + 0x02, 0x1e, 0x33, 0x44, 0x9a, 0x02, 0x1e, 0x34, + 0x41, 0xcd, 0x02, 0x1f, 0x1e, 0x44, 0xa7, 0x02, + 0x1f, 0x76, 0x44, 0xae, 0x02, 0x1f, 0xfa, 0x44, + 0xb1, 0x02, 0x21, 0x7b, 0x44, 0xbf, 0x02, 0x22, + 0x18, 0x4a, 0xa1, 0x02, 0x23, 0x1e, 0x44, 0xc5, + 0x02, 0x23, 0xad, 0x44, 0xc8, 0x02, 0x26, 0x09, + 0x3c, 0x53, 0x02, 0x26, 0xf3, 0x44, 0xe0, 0x02, + 0x28, 0x5b, 0x44, 0xef, 0x02, 0x28, 0xab, 0x44, + 0xf5, 0x02, 0x29, 0x8f, 0x44, 0xf9, 0x02, 0x2a, + 0xb8, 0x45, 0x03, 0x02, 0x2b, 0x46, 0x45, 0x10, + 0x02, 0x2b, 0x4f, 0x45, 0x07, 0x02, 0x2b, 0x50, + 0x45, 0x08, 0x02, 0x2b, 0xa6, 0x45, 0x13, 0x02, + 0x2c, 0x1d, 0x45, 0x12, 0x02, 0x2c, 0x24, 0x45, + 0x16, 0x02, 0x2d, 0xe1, 0x45, 0x2e, 0x02, 0x2e, + 0x42, 0x4e, 0x9c, 0x02, 0x2f, 0xeb, 0x4e, 0xa2, + 0x02, 0x31, 0xb6, 0x45, 0x50, 0x02, 0x31, 0xc3, + 0x45, 0x4e, 0x02, 0x31, 0xc4, 0x41, 0xf8, 0x02, + 0x31, 0xf5, 0x45, 0x4f, 0x02, 0x33, 0x72, 0x45, + 0x61, 0x02, 0x33, 0xcc, 0x37, 0x3c, 0x02, 0x33, + 0xd0, 0x45, 0x68, 0x02, 0x33, 0xd2, 0x45, 0x64, + 0x02, 0x33, 0xd3, 0x45, 0x63, 0x02, 0x33, 0xd5, + 0x45, 0x6a, 0x02, 0x33, 0xda, 0x45, 0x6c, 0x02, + 0x33, 0xdf, 0x45, 0x6e, 0x02, 0x33, 0xe4, 0x45, + 0x69, 0x02, 0x33, 0xfe, 0x3c, 0x3e, 0x02, 0x34, + 0x4a, 0x45, 0x76, 0x02, 0x34, 0x4b, 0x45, 0x78, + 0x02, 0x34, 0x51, 0x45, 0x77, 0x02, 0x34, 0x65, + 0x45, 0x7c, 0x02, 0x34, 0xe4, 0x45, 0x96, 0x02, + 0x35, 0x5a, 0x45, 0x97, 0x02, 0x35, 0x94, 0x45, + 0xa3, 0x02, 0x35, 0xc4, 0x42, 0x09, 0x02, 0x36, + 0x38, 0x45, 0xb3, 0x02, 0x36, 0x39, 0x45, 0xb1, + 0x02, 0x36, 0x3a, 0x3c, 0x21, 0x02, 0x36, 0x47, + 0x45, 0xb2, 0x02, 0x37, 0x0c, 0x45, 0xc7, 0x02, + 0x37, 0x1c, 0x45, 0xbe, 0x02, 0x37, 0x3f, 0x42, + 0x12, 0x02, 0x37, 0x63, 0x42, 0x14, 0x02, 0x37, + 0x64, 0x45, 0xcb, 0x02, 0x37, 0xe7, 0x45, 0xd3, + 0x02, 0x37, 0xf1, 0x4e, 0xb8, 0x02, 0x37, 0xff, + 0x45, 0xd2, 0x02, 0x38, 0x24, 0x45, 0xd8, 0x02, + 0x38, 0x3d, 0x45, 0xdd, 0x02, 0x3a, 0x98, 0x45, + 0xe9, 0x02, 0x3c, 0x7f, 0x45, 0xf6, 0x02, 0x3c, + 0xbe, 0x37, 0xd5, 0x02, 0x3c, 0xfe, 0x36, 0x50, + 0x02, 0x3d, 0x00, 0x46, 0x05, 0x02, 0x3d, 0x0e, + 0x47, 0xda, 0x02, 0x3d, 0x40, 0x46, 0x16, 0x02, + 0x3d, 0xd3, 0x46, 0x19, 0x02, 0x3d, 0xf9, 0x46, + 0x18, 0x02, 0x3d, 0xfa, 0x46, 0x17, 0x02, 0x3f, + 0x7e, 0x46, 0x3f, 0x02, 0x40, 0x4b, 0x4e, 0xc8, + 0x02, 0x40, 0x96, 0x46, 0x4e, 0x02, 0x41, 0x03, + 0x46, 0x53, 0x02, 0x41, 0xc6, 0x46, 0x5f, 0x02, + 0x41, 0xfe, 0x46, 0x62, 0x02, 0x42, 0xee, 0x37, + 0xca, 0x02, 0x43, 0xbc, 0x46, 0x77, 0x02, 0x43, + 0xd0, 0x1e, 0x9e, 0x02, 0x46, 0x29, 0x46, 0x81, + 0x02, 0x46, 0xa5, 0x46, 0x87, 0x02, 0x47, 0xf1, + 0x42, 0x4a, 0x02, 0x48, 0x96, 0x46, 0x9d, 0x02, + 0x4a, 0x4d, 0x46, 0xb8, 0x02, 0x4b, 0x56, 0x46, + 0xc5, 0x02, 0x4b, 0x6f, 0x46, 0xc7, 0x02, 0x4c, + 0x16, 0x46, 0xcc, 0x02, 0x4d, 0x14, 0x36, 0xab, + 0x02, 0x4e, 0x04, 0x4e, 0x5a, 0x02, 0x4e, 0x0e, + 0x46, 0xee, 0x02, 0x4e, 0x37, 0x46, 0xf2, 0x02, + 0x4e, 0x6a, 0x46, 0xf7, 0x02, 0x4e, 0x8b, 0x46, + 0xfa, 0x02, 0x4f, 0xf2, 0x4e, 0x5b, 0x02, 0x50, + 0x4a, 0x47, 0x05, 0x02, 0x50, 0x55, 0x47, 0x07, + 0x02, 0x51, 0x22, 0x47, 0x09, 0x02, 0x51, 0xa9, + 0x47, 0x0e, 0x02, 0x51, 0xcd, 0x47, 0x11, 0x02, + 0x51, 0xe5, 0x47, 0x10, 0x02, 0x52, 0x1e, 0x47, + 0x13, 0x02, 0x52, 0x4c, 0x47, 0x15, 0x02, 0x54, + 0x2e, 0x47, 0x21, 0x02, 0x54, 0x8e, 0x42, 0x6d, + 0x02, 0x54, 0xd9, 0x47, 0x29, 0x02, 0x55, 0x0e, + 0x42, 0x71, 0x02, 0x55, 0xa7, 0x47, 0x35, 0x02, + 0x56, 0x7f, 0x36, 0xfb, 0x02, 0x57, 0x71, 0x42, + 0x7a, 0x02, 0x57, 0xa9, 0x47, 0x48, 0x02, 0x57, + 0xb4, 0x47, 0x49, 0x02, 0x58, 0x74, 0x1d, 0xf6, + 0x02, 0x59, 0xc4, 0x42, 0x80, 0x02, 0x59, 0xcc, + 0x4e, 0x90, 0x02, 0x59, 0xd4, 0x47, 0x5c, 0x02, + 0x5a, 0xd7, 0x36, 0x62, 0x02, 0x5a, 0xe3, 0x47, + 0x65, 0x02, 0x5a, 0xe4, 0x47, 0x64, 0x02, 0x5a, + 0xf1, 0x47, 0x66, 0x02, 0x5b, 0xb2, 0x47, 0x75, + 0x02, 0x5c, 0x4b, 0x47, 0x7e, 0x02, 0x5c, 0x64, + 0x47, 0x7f, 0x02, 0x5d, 0xa1, 0x42, 0x89, 0x02, + 0x5e, 0x2e, 0x47, 0x8e, 0x02, 0x5e, 0x56, 0x47, + 0x8f, 0x02, 0x5e, 0x62, 0x47, 0x92, 0x02, 0x5e, + 0x65, 0x47, 0x90, 0x02, 0x5e, 0xc2, 0x47, 0x97, + 0x02, 0x5e, 0xd8, 0x47, 0x95, 0x02, 0x5e, 0xe8, + 0x47, 0x99, 0x02, 0x5f, 0x23, 0x47, 0x9a, 0x02, + 0x5f, 0x5c, 0x47, 0x9c, 0x02, 0x5f, 0xd4, 0x47, + 0xa3, 0x02, 0x5f, 0xe0, 0x47, 0xa2, 0x02, 0x5f, + 0xfb, 0x47, 0xa9, 0x02, 0x60, 0x0c, 0x47, 0xa8, + 0x02, 0x60, 0x17, 0x47, 0xb0, 0x02, 0x60, 0x60, + 0x47, 0xb3, 0x02, 0x60, 0xed, 0x47, 0xbd, 0x02, + 0x62, 0x22, 0x35, 0x7b, 0x02, 0x62, 0x6a, 0x37, + 0x6d, 0x02, 0x62, 0x70, 0x47, 0xd1, 0x02, 0x62, + 0x86, 0x47, 0xd2, 0x02, 0x63, 0x4c, 0x4f, 0x57, + 0x02, 0x64, 0x02, 0x47, 0xde, 0x02, 0x66, 0x7e, + 0x47, 0xf0, 0x02, 0x66, 0xb0, 0x37, 0x14, 0x02, + 0x67, 0x1d, 0x47, 0xfe, 0x02, 0x68, 0xdd, 0x48, + 0x0c, 0x02, 0x68, 0xea, 0x48, 0x0e, 0x02, 0x69, + 0x51, 0x35, 0x4e, 0x02, 0x69, 0x6f, 0x48, 0x12, + 0x02, 0x69, 0x99, 0x37, 0x36, 0x02, 0x69, 0xdd, + 0x48, 0x14, 0x02, 0x6a, 0x1e, 0x48, 0x17, 0x02, + 0x6a, 0x58, 0x48, 0x1b, 0x02, 0x6a, 0x8c, 0x48, + 0x1f, 0x02, 0x6a, 0xb7, 0x48, 0x22, 0x02, 0x6a, + 0xff, 0x42, 0xa7, 0x02, 0x6c, 0x29, 0x44, 0x46, + 0x02, 0x6c, 0x73, 0x48, 0x4a, 0x02, 0x6c, 0x9e, + 0x4e, 0xee, 0x02, 0x6c, 0xdd, 0x48, 0x53, 0x02, + 0x6e, 0x40, 0x42, 0xc1, 0x02, 0x6e, 0x65, 0x48, + 0x60, 0x02, 0x6f, 0x94, 0x48, 0x70, 0x02, 0x6f, + 0xf6, 0x48, 0x7a, 0x02, 0x6f, 0xf7, 0x48, 0x7b, + 0x02, 0x6f, 0xf8, 0x48, 0x79, 0x02, 0x70, 0xf4, + 0x42, 0xcf, 0x02, 0x71, 0x0d, 0x48, 0x8b, 0x02, + 0x71, 0x39, 0x48, 0x8e, 0x02, 0x73, 0xda, 0x48, + 0xb3, 0x02, 0x73, 0xdb, 0x48, 0xb2, 0x02, 0x73, + 0xfe, 0x48, 0xb9, 0x02, 0x74, 0x10, 0x48, 0xbc, + 0x02, 0x74, 0x49, 0x48, 0xc0, 0x02, 0x76, 0x14, + 0x48, 0xce, 0x02, 0x76, 0x15, 0x48, 0xcd, 0x02, + 0x76, 0x31, 0x48, 0xd0, 0x02, 0x76, 0x84, 0x42, + 0xdd, 0x02, 0x76, 0x93, 0x48, 0xd5, 0x02, 0x77, + 0x0e, 0x48, 0xda, 0x02, 0x77, 0x23, 0x48, 0xdc, + 0x02, 0x77, 0x52, 0x48, 0xe0, 0x02, 0x79, 0x85, + 0x48, 0xf0, 0x02, 0x79, 0xb4, 0x4e, 0xa5, 0x02, + 0x7a, 0x84, 0x48, 0xfc, 0x02, 0x7b, 0xb3, 0x49, + 0x0b, 0x02, 0x7b, 0xbe, 0x49, 0x0d, 0x02, 0x7b, + 0xc7, 0x49, 0x0e, 0x02, 0x7c, 0x3c, 0x4e, 0xfc, + 0x02, 0x7c, 0xb8, 0x49, 0x14, 0x02, 0x7d, 0x73, + 0x4e, 0x5c, 0x02, 0x7d, 0xa0, 0x49, 0x1c, 0x02, + 0x7e, 0x10, 0x49, 0x1e, 0x02, 0x7f, 0xb7, 0x36, + 0x4a, 0x02, 0x80, 0x8a, 0x49, 0x27, 0x02, 0x80, + 0xbb, 0x49, 0x2d, 0x02, 0x82, 0x77, 0x42, 0xf4, + 0x02, 0x82, 0x82, 0x49, 0x39, 0x02, 0x82, 0xf3, + 0x49, 0x3b, 0x02, 0x83, 0xcd, 0x42, 0xfa, 0x02, + 0x84, 0x0c, 0x49, 0x42, 0x02, 0x84, 0x55, 0x49, + 0x45, 0x02, 0x85, 0x6b, 0x49, 0x52, 0x02, 0x85, + 0xc8, 0x49, 0x55, 0x02, 0x85, 0xc9, 0x49, 0x56, + 0x02, 0x86, 0xd7, 0x49, 0x60, 0x02, 0x86, 0xfa, + 0x49, 0x63, 0x02, 0x89, 0x46, 0x49, 0x7c, 0x02, + 0x89, 0x49, 0x49, 0x7b, 0x02, 0x89, 0x6b, 0x49, + 0x81, 0x02, 0x89, 0x87, 0x37, 0xad, 0x02, 0x89, + 0x88, 0x49, 0x88, 0x02, 0x89, 0xba, 0x49, 0x92, + 0x02, 0x89, 0xbb, 0x49, 0x93, 0x02, 0x8a, 0x1e, + 0x49, 0x9b, 0x02, 0x8a, 0x29, 0x49, 0x9c, 0x02, + 0x8a, 0x43, 0x49, 0xa0, 0x02, 0x8a, 0x71, 0x49, + 0x9f, 0x02, 0x8a, 0x99, 0x49, 0xa7, 0x02, 0x8a, + 0xcd, 0x49, 0xa8, 0x02, 0x8a, 0xdd, 0x49, 0xaf, + 0x02, 0x8a, 0xe4, 0x49, 0xae, 0x02, 0x8b, 0xc1, + 0x49, 0xba, 0x02, 0x8b, 0xef, 0x49, 0xbb, 0x02, + 0x8c, 0xdd, 0x1d, 0xd9, 0x02, 0x8d, 0x10, 0x49, + 0xc2, 0x02, 0x8d, 0x71, 0x49, 0xc3, 0x02, 0x8d, + 0xfb, 0x49, 0xc5, 0x02, 0x8e, 0x17, 0x37, 0xb0, + 0x02, 0x8e, 0x1f, 0x49, 0xc6, 0x02, 0x8e, 0x36, + 0x49, 0xca, 0x02, 0x8e, 0x89, 0x49, 0xcd, 0x02, + 0x8e, 0xeb, 0x49, 0xcf, 0x02, 0x8e, 0xf6, 0x1d, + 0xf9, 0x02, 0x8f, 0x32, 0x49, 0xd1, 0x02, 0x8f, + 0xf8, 0x49, 0xd7, 0x02, 0x92, 0xa0, 0x49, 0xe5, + 0x02, 0x92, 0xb1, 0x49, 0xe6, 0x02, 0x94, 0x90, + 0x49, 0xf7, 0x02, 0x95, 0xcf, 0x4a, 0x00, 0x02, + 0x96, 0x7f, 0x36, 0x19, 0x02, 0x96, 0xf0, 0x4a, + 0x0f, 0x02, 0x97, 0x19, 0x4a, 0x12, 0x02, 0x97, + 0x50, 0x4a, 0x16, 0x02, 0x98, 0xc6, 0x4a, 0x27, + 0x02, 0x9a, 0x72, 0x4a, 0x39, 0x02, 0x9d, 0x4b, + 0x35, 0x95, 0x02, 0x9d, 0xdb, 0x4a, 0x52, 0x02, + 0x9e, 0x15, 0x4a, 0x5c, 0x02, 0x9e, 0x3d, 0x4f, + 0x5b, 0x02, 0x9e, 0x49, 0x4a, 0x5e, 0x02, 0x9e, + 0x8a, 0x4a, 0x5d, 0x02, 0x9e, 0xc4, 0x4a, 0x66, + 0x02, 0x9e, 0xdb, 0x4a, 0x6e, 0x02, 0x9e, 0xe9, + 0x4a, 0x6b, 0x02, 0x9f, 0xce, 0x4a, 0x7f, 0x02, + 0x9f, 0xd7, 0x4a, 0x7f, 0x02, 0xa0, 0x1a, 0x4a, + 0x85, 0x02, 0xa0, 0x2f, 0x4a, 0x83, 0x02, 0xa0, + 0x82, 0x4a, 0x8c, 0x02, 0xa0, 0xf9, 0x4a, 0x8b, + 0x02, 0xa1, 0x90, 0x43, 0x4b, 0x02, 0xa2, 0xb2, + 0x4e, 0x68, 0x02, 0xa3, 0x8c, 0x4a, 0xa5, 0x02, + 0xa4, 0x37, 0x4a, 0xa7, 0x02, 0xa5, 0xf1, 0x4a, + 0xb3, 0x02, 0xa6, 0x02, 0x4a, 0xb5, 0x02, 0xa6, + 0x1a, 0x4f, 0x5c, 0x02, 0xa6, 0xb2, 0x4a, 0xb9, + 0x02, 0xa9, 0xe6, 0x37, 0x41, 0x02, 0xb7, 0x46, + 0x35, 0xd4, 0x02, 0xb7, 0x51, 0x36, 0x2a, 0x02, + 0xb7, 0x53, 0x4e, 0x78, 0x02, 0xb7, 0x5a, 0x4e, + 0x80, 0x02, 0xb7, 0x5c, 0x4e, 0x81, 0x02, 0xb7, + 0x65, 0x4f, 0x17, 0x02, 0xb7, 0x76, 0x4e, 0x92, + 0x02, 0xb7, 0x77, 0x35, 0xd6, 0x02, 0xb7, 0x7c, + 0x4e, 0x9d, 0x02, 0xb7, 0x82, 0x4e, 0xad, 0x02, + 0xb7, 0x89, 0x36, 0xf0, 0x02, 0xb7, 0x8b, 0x4e, + 0xb5, 0x02, 0xb7, 0x8e, 0x35, 0x9c, 0x02, 0xb7, + 0x94, 0x4e, 0xb9, 0x02, 0xb7, 0xac, 0x4e, 0xd0, + 0x02, 0xb7, 0xaf, 0x4e, 0xd4, 0x02, 0xb7, 0xbd, + 0x37, 0x5e, 0x02, 0xb7, 0xc9, 0x4e, 0xe2, 0x02, + 0xb7, 0xcf, 0x4e, 0xe9, 0x02, 0xb7, 0xd2, 0x4e, + 0xec, 0x02, 0xb7, 0xd8, 0x35, 0x53, 0x02, 0xb7, + 0xf0, 0x4f, 0x10, 0x02, 0xb8, 0x0d, 0x4f, 0x20, + 0x02, 0xb8, 0x17, 0x4f, 0x24, 0x02, 0xb8, 0x1a, + 0x37, 0xc6, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x34, + 0x02, 0x35, 0x81, 0x00, 0x4e, 0x08, 0x34, 0x97, + 0x00, 0x4e, 0x0e, 0x4e, 0x69, 0x00, 0x4e, 0x19, + 0x36, 0xb9, 0x00, 0x4e, 0x26, 0x4e, 0x6a, 0x00, + 0x4e, 0x30, 0x3c, 0x1a, 0x00, 0x4e, 0x39, 0x36, + 0x5a, 0x00, 0x4e, 0x3b, 0x35, 0xf4, 0x00, 0x4e, + 0x73, 0x36, 0x90, 0x00, 0x4e, 0xa1, 0x36, 0xcf, + 0x00, 0x4e, 0xa4, 0x34, 0x7f, 0x00, 0x4e, 0xca, + 0x35, 0xd4, 0x00, 0x4f, 0x34, 0x36, 0xa0, 0x00, + 0x4f, 0x4f, 0x35, 0xfc, 0x00, 0x4f, 0x60, 0x3c, + 0x1c, 0x00, 0x4f, 0x73, 0x4e, 0x6c, 0x00, 0x4f, + 0x75, 0x34, 0x47, 0x00, 0x4f, 0x7f, 0x34, 0x8a, + 0x00, 0x4f, 0xae, 0x34, 0x46, 0x00, 0x4f, 0xb5, + 0x36, 0x1b, 0x00, 0x4f, 0xbf, 0x34, 0xc2, 0x00, + 0x50, 0x24, 0x36, 0x5f, 0x00, 0x50, 0x26, 0x1d, + 0xfa, 0x00, 0x50, 0x49, 0x34, 0x61, 0x00, 0x50, + 0x4f, 0x36, 0xbe, 0x00, 0x50, 0x56, 0x4e, 0x6d, + 0x00, 0x50, 0x65, 0x34, 0x7b, 0x00, 0x50, 0x85, + 0x34, 0xd0, 0x00, 0x50, 0x91, 0x34, 0x79, 0x00, + 0x50, 0xc5, 0x1d, 0xee, 0x00, 0x50, 0xca, 0x1f, + 0x2e, 0x00, 0x50, 0xcf, 0x34, 0xa2, 0x00, 0x50, + 0xe7, 0x34, 0x30, 0x00, 0x50, 0xed, 0x4e, 0x6e, + 0x00, 0x50, 0xf2, 0x52, 0xac, 0x00, 0x51, 0x1a, + 0x37, 0x16, 0x00, 0x51, 0x32, 0x1e, 0x76, 0x00, + 0x51, 0x46, 0x34, 0xa5, 0x00, 0x51, 0x4d, 0x34, + 0x4d, 0x00, 0x51, 0x4e, 0x36, 0x7d, 0x00, 0x51, + 0x54, 0x10, 0x74, 0x00, 0x51, 0x68, 0x36, 0x42, + 0x00, 0x51, 0x6b, 0x4e, 0x6f, 0x00, 0x51, 0x6c, + 0x34, 0x80, 0x00, 0x51, 0x77, 0x35, 0xa5, 0x00, + 0x51, 0x7c, 0x35, 0xb4, 0x00, 0x51, 0x89, 0x1e, + 0x87, 0x00, 0x51, 0x8d, 0x08, 0x36, 0x00, 0x51, + 0x92, 0x36, 0xd6, 0x00, 0x51, 0x93, 0x34, 0xd1, + 0x00, 0x51, 0x95, 0x10, 0x82, 0x00, 0x51, 0xa4, + 0x1e, 0x89, 0x00, 0x51, 0xac, 0x0c, 0x59, 0x00, + 0x51, 0xb4, 0x34, 0x5c, 0x00, 0x51, 0xcb, 0x1e, + 0x3e, 0x00, 0x51, 0xdb, 0x34, 0xd2, 0x00, 0x51, + 0xde, 0x4f, 0x53, 0x00, 0x51, 0xe1, 0x36, 0xd9, + 0x00, 0x51, 0xfd, 0x4e, 0x72, 0x00, 0x52, 0x03, + 0x36, 0x22, 0x00, 0x52, 0x06, 0x34, 0xbb, 0x00, + 0x52, 0x24, 0x36, 0xa1, 0x00, 0x52, 0x38, 0x35, + 0xb5, 0x00, 0x52, 0x4a, 0x35, 0xdd, 0x00, 0x52, + 0x4d, 0x36, 0x41, 0x00, 0x52, 0x64, 0x4e, 0x74, + 0x00, 0x52, 0x71, 0x4e, 0x75, 0x00, 0x52, 0x72, + 0x05, 0xc2, 0x00, 0x52, 0x75, 0x1e, 0x2b, 0x00, + 0x52, 0x8d, 0x37, 0x1a, 0x00, 0x52, 0xc7, 0x36, + 0xf6, 0x00, 0x52, 0xc9, 0x0e, 0x29, 0x00, 0x52, + 0xd7, 0x37, 0x1b, 0x00, 0x52, 0xdd, 0x36, 0x05, + 0x00, 0x52, 0xe2, 0x36, 0x2a, 0x00, 0x52, 0xe4, + 0x34, 0x1a, 0x00, 0x52, 0xfa, 0x09, 0x07, 0x00, + 0x53, 0x00, 0x37, 0xcf, 0x00, 0x53, 0x05, 0x36, + 0xc3, 0x00, 0x53, 0x07, 0x20, 0xd4, 0x00, 0x53, + 0x15, 0x1f, 0x2f, 0x00, 0x53, 0x16, 0x35, 0x61, + 0x00, 0x53, 0x39, 0x36, 0xaa, 0x00, 0x53, 0x3f, + 0x4e, 0x77, 0x00, 0x53, 0x40, 0x34, 0xd4, 0x00, + 0x53, 0x4a, 0x36, 0xa2, 0x00, 0x53, 0x51, 0x0d, + 0x70, 0x00, 0x53, 0x5a, 0x36, 0x98, 0x00, 0x53, + 0x65, 0x52, 0xf3, 0x00, 0x53, 0x71, 0x35, 0x80, + 0x00, 0x53, 0x78, 0x35, 0x5f, 0x00, 0x53, 0x7f, + 0x06, 0xa2, 0x00, 0x53, 0xa9, 0x1d, 0xd8, 0x00, + 0x53, 0xc9, 0x4f, 0x39, 0x00, 0x53, 0xca, 0x35, + 0x8e, 0x00, 0x53, 0xce, 0x34, 0x8f, 0x00, 0x53, + 0xd7, 0x35, 0xf5, 0x00, 0x53, 0xdb, 0x1f, 0x2a, + 0x00, 0x53, 0xdf, 0x37, 0x1f, 0x00, 0x53, 0xe0, + 0x53, 0x00, 0x00, 0x53, 0xf1, 0x1e, 0x0c, 0x00, + 0x53, 0xf2, 0x34, 0x8b, 0x00, 0x54, 0x0f, 0x34, + 0xc9, 0x00, 0x54, 0x38, 0x35, 0x8f, 0x00, 0x54, + 0x40, 0x4e, 0x79, 0x00, 0x54, 0x48, 0x36, 0x76, + 0x00, 0x54, 0x68, 0x09, 0x2a, 0x00, 0x54, 0xac, + 0x4f, 0x35, 0x00, 0x54, 0xb2, 0x35, 0xdc, 0x00, + 0x54, 0xe8, 0x1e, 0x17, 0x00, 0x55, 0x10, 0x36, + 0x83, 0x00, 0x55, 0x33, 0x1e, 0x8b, 0x00, 0x55, + 0x39, 0x1e, 0x8a, 0x00, 0x55, 0x44, 0x1e, 0x32, + 0x00, 0x55, 0x46, 0x36, 0x06, 0x00, 0x55, 0x53, + 0x35, 0xaa, 0x00, 0x55, 0x61, 0x38, 0x39, 0x00, + 0x55, 0x84, 0x4e, 0x5e, 0x00, 0x55, 0x9c, 0x4e, + 0x7b, 0x00, 0x55, 0x9d, 0x1d, 0xe3, 0x00, 0x55, + 0xa9, 0x1f, 0x30, 0x00, 0x55, 0xab, 0x35, 0x8b, + 0x00, 0x55, 0xb0, 0x1d, 0xf0, 0x00, 0x55, 0xe4, + 0x1e, 0x8c, 0x00, 0x56, 0x05, 0x53, 0x2d, 0x00, + 0x56, 0x06, 0x0b, 0x70, 0x00, 0x56, 0x09, 0x4e, + 0x7d, 0x00, 0x56, 0x32, 0x1e, 0x8d, 0x00, 0x56, + 0x42, 0x1d, 0xda, 0x00, 0x56, 0x4c, 0x1e, 0x29, + 0x00, 0x56, 0x68, 0x34, 0x15, 0x00, 0x56, 0x74, + 0x34, 0xbc, 0x00, 0x56, 0x78, 0x1e, 0x52, 0x00, + 0x56, 0xa5, 0x1e, 0x8e, 0x00, 0x56, 0xae, 0x1f, + 0x31, 0x00, 0x56, 0xc0, 0x37, 0x24, 0x00, 0x56, + 0xc1, 0x34, 0xd7, 0x00, 0x56, 0xce, 0x4e, 0x82, + 0x00, 0x56, 0xee, 0x4e, 0x83, 0x00, 0x57, 0x0d, + 0x34, 0xd8, 0x00, 0x57, 0x47, 0x34, 0x78, 0x00, + 0x57, 0x6a, 0x36, 0x74, 0x00, 0x57, 0xce, 0x09, + 0xd3, 0x00, 0x57, 0xd6, 0x4e, 0x84, 0x00, 0x57, + 0xf4, 0x34, 0x98, 0x00, 0x58, 0x0b, 0x1e, 0x8f, + 0x00, 0x58, 0x19, 0x1f, 0x32, 0x00, 0x58, 0x35, + 0x1e, 0x49, 0x00, 0x58, 0x3d, 0x4e, 0x85, 0x00, + 0x58, 0x40, 0x34, 0x48, 0x00, 0x58, 0x58, 0x1e, + 0x4d, 0x00, 0x58, 0x59, 0x4e, 0x86, 0x00, 0x58, + 0x5a, 0x1e, 0x42, 0x00, 0x58, 0x9c, 0x36, 0x71, + 0x00, 0x58, 0xa8, 0x0e, 0x7d, 0x00, 0x58, 0xab, + 0x34, 0xd9, 0x00, 0x59, 0x06, 0x53, 0x7b, 0x00, + 0x59, 0x1b, 0x1f, 0x33, 0x00, 0x59, 0x27, 0x36, + 0x55, 0x00, 0x59, 0x4f, 0x4e, 0x87, 0x00, 0x59, + 0x51, 0x35, 0xab, 0x00, 0x59, 0x53, 0x37, 0xd1, + 0x00, 0x59, 0x60, 0x4e, 0x89, 0x00, 0x59, 0x62, + 0x4e, 0x8a, 0x00, 0x59, 0x73, 0x36, 0x04, 0x00, + 0x59, 0x84, 0x36, 0xe7, 0x00, 0x59, 0xa5, 0x36, + 0x4f, 0x00, 0x59, 0xc9, 0x34, 0x8c, 0x00, 0x59, + 0xda, 0x34, 0xda, 0x00, 0x59, 0xec, 0x36, 0xae, + 0x00, 0x59, 0xff, 0x35, 0xe0, 0x00, 0x5a, 0x1c, + 0x37, 0x26, 0x00, 0x5a, 0x29, 0x1e, 0x6f, 0x00, + 0x5a, 0x36, 0x34, 0xdb, 0x00, 0x5a, 0x66, 0x36, + 0xb2, 0x00, 0x5a, 0x9b, 0x1e, 0x68, 0x00, 0x5a, + 0xbe, 0x1e, 0x90, 0x00, 0x5a, 0xc2, 0x37, 0x27, + 0x00, 0x5a, 0xcc, 0x1d, 0xfb, 0x00, 0x5a, 0xda, + 0x4e, 0x8b, 0x00, 0x5b, 0x5a, 0x4e, 0x8c, 0x00, + 0x5b, 0x73, 0x4e, 0x8d, 0x00, 0x5b, 0x7c, 0x4e, + 0x8e, 0x00, 0x5b, 0xb3, 0x34, 0x6d, 0x00, 0x5b, + 0xb5, 0x36, 0x07, 0x00, 0x5b, 0xc3, 0x37, 0x29, + 0x00, 0x5b, 0xd2, 0x35, 0x78, 0x00, 0x5b, 0xdb, + 0x20, 0xf4, 0x00, 0x5b, 0xe7, 0x0c, 0xe1, 0x00, + 0x5b, 0xe8, 0x37, 0x42, 0x00, 0x5c, 0x06, 0x09, + 0x95, 0x00, 0x5c, 0x0a, 0x36, 0x4d, 0x00, 0x5c, + 0x0b, 0x36, 0x23, 0x00, 0x5c, 0x0e, 0x36, 0x8a, + 0x00, 0x5c, 0x0f, 0x36, 0x09, 0x00, 0x5c, 0x28, + 0x1f, 0x34, 0x00, 0x5c, 0x51, 0x1d, 0xf2, 0x00, + 0x5c, 0x60, 0x1e, 0x4a, 0x00, 0x5c, 0x64, 0x34, + 0x31, 0x00, 0x5c, 0x6e, 0x12, 0x32, 0x00, 0x5d, + 0x29, 0x36, 0xc4, 0x00, 0x5d, 0x4e, 0x34, 0xdd, + 0x00, 0x5d, 0x87, 0x34, 0xde, 0x00, 0x5d, 0xb2, + 0x3c, 0x2d, 0x00, 0x5d, 0xc9, 0x34, 0xdf, 0x00, + 0x5d, 0xcc, 0x34, 0x73, 0x00, 0x5d, 0xd3, 0x34, + 0xe0, 0x00, 0x5d, 0xe1, 0x35, 0xff, 0x00, 0x5d, + 0xe5, 0x35, 0xc3, 0x00, 0x5d, 0xe8, 0x35, 0x92, + 0x00, 0x5d, 0xf7, 0x1d, 0xff, 0x00, 0x5d, 0xfd, + 0x0b, 0x65, 0x00, 0x5e, 0x06, 0x36, 0xa3, 0x00, + 0x5e, 0x1d, 0x36, 0x77, 0x00, 0x5e, 0x30, 0x34, + 0x75, 0x00, 0x5e, 0x3d, 0x36, 0xd0, 0x00, 0x5e, + 0x43, 0x4e, 0x91, 0x00, 0x5e, 0x54, 0x37, 0x2d, + 0x00, 0x5e, 0x63, 0x36, 0xba, 0x00, 0x5e, 0x64, + 0x1e, 0x93, 0x00, 0x5e, 0x73, 0x36, 0xbb, 0x00, + 0x5e, 0x7e, 0x35, 0x84, 0x00, 0x5e, 0x96, 0x1e, + 0x70, 0x00, 0x5e, 0xa7, 0x4e, 0x92, 0x00, 0x5e, + 0xad, 0x34, 0xa9, 0x00, 0x5e, 0xc9, 0x0f, 0xbf, + 0x00, 0x5e, 0xca, 0x4f, 0x4f, 0x00, 0x5e, 0xcb, + 0x38, 0xae, 0x00, 0x5e, 0xcf, 0x1f, 0x36, 0x00, + 0x5e, 0xd0, 0x1f, 0x35, 0x00, 0x5e, 0xdf, 0x1e, + 0x6a, 0x00, 0x5e, 0xe0, 0x1e, 0x18, 0x00, 0x5e, + 0xe3, 0x37, 0x2f, 0x00, 0x5e, 0xf6, 0x34, 0x67, + 0x00, 0x5e, 0xf7, 0x34, 0xaa, 0x00, 0x5e, 0xfa, + 0x34, 0x7c, 0x00, 0x5e, 0xfb, 0x35, 0x69, 0x00, + 0x5f, 0x0a, 0x36, 0xbc, 0x00, 0x5f, 0x2d, 0x34, + 0xe1, 0x00, 0x5f, 0x31, 0x35, 0xf3, 0x00, 0x5f, + 0x38, 0x4e, 0x94, 0x00, 0x5f, 0x45, 0x37, 0xce, + 0x00, 0x5f, 0x50, 0x3c, 0x1f, 0x00, 0x5f, 0x62, + 0x4e, 0x5f, 0x00, 0x5f, 0x69, 0x35, 0xd7, 0x00, + 0x5f, 0x6b, 0x36, 0x68, 0x00, 0x5f, 0x80, 0x35, + 0x5d, 0x00, 0x5f, 0x98, 0x34, 0xe2, 0x00, 0x5f, + 0xa1, 0x4e, 0x95, 0x00, 0x5f, 0xae, 0x36, 0xa8, + 0x00, 0x5f, 0xb5, 0x36, 0x69, 0x00, 0x5f, 0xbd, + 0x1d, 0xea, 0x00, 0x5f, 0xcd, 0x36, 0x91, 0x00, + 0x5f, 0xd8, 0x36, 0xd1, 0x00, 0x5f, 0xd9, 0x36, + 0xd2, 0x00, 0x5f, 0xdd, 0x4e, 0x96, 0x00, 0x60, + 0x25, 0x35, 0x90, 0x00, 0x60, 0x50, 0x35, 0x99, + 0x00, 0x60, 0x62, 0x1d, 0xe0, 0x00, 0x60, 0x65, + 0x34, 0xa4, 0x00, 0x60, 0x75, 0x35, 0xac, 0x00, + 0x60, 0x94, 0x05, 0x79, 0x00, 0x60, 0x97, 0x1e, + 0x94, 0x00, 0x60, 0x9e, 0x54, 0x36, 0x00, 0x60, + 0xa4, 0x3c, 0x20, 0x00, 0x60, 0xb2, 0x34, 0xb3, + 0x00, 0x60, 0xc5, 0x36, 0x12, 0x00, 0x60, 0xd8, + 0x34, 0xe3, 0x00, 0x61, 0x08, 0x1e, 0x7a, 0x00, + 0x61, 0x09, 0x36, 0xf3, 0x00, 0x61, 0x0f, 0x35, + 0x47, 0x00, 0x61, 0x3d, 0x34, 0xe4, 0x00, 0x61, + 0x48, 0x4e, 0x60, 0x00, 0x61, 0x4c, 0x35, 0xc4, + 0x00, 0x61, 0x4e, 0x34, 0x2c, 0x00, 0x61, 0x62, + 0x4e, 0x97, 0x00, 0x61, 0x67, 0x1d, 0xf5, 0x00, + 0x61, 0x68, 0x34, 0x10, 0x00, 0x61, 0x8e, 0x0b, + 0x00, 0x00, 0x61, 0x90, 0x37, 0x10, 0x00, 0x61, + 0xa4, 0x34, 0xbd, 0x00, 0x61, 0xb2, 0x35, 0xb6, + 0x00, 0x61, 0xf2, 0x34, 0x39, 0x00, 0x61, 0xf8, + 0x4e, 0x99, 0x00, 0x61, 0xfe, 0x34, 0xe5, 0x00, + 0x62, 0x10, 0x36, 0x2b, 0x00, 0x62, 0x3b, 0x36, + 0xeb, 0x00, 0x62, 0x3f, 0x36, 0xd3, 0x00, 0x62, + 0x40, 0x36, 0x02, 0x00, 0x62, 0x41, 0x1f, 0x37, + 0x00, 0x62, 0x47, 0x36, 0x3b, 0x00, 0x62, 0x48, + 0x1e, 0xc2, 0x00, 0x62, 0x49, 0x1e, 0x63, 0x00, + 0x62, 0x68, 0x34, 0xe6, 0x00, 0x62, 0x71, 0x35, + 0x45, 0x00, 0x62, 0xb1, 0x36, 0xc5, 0x00, 0x62, + 0xcc, 0x37, 0x32, 0x00, 0x62, 0xcf, 0x34, 0xe7, + 0x00, 0x62, 0xd0, 0x1d, 0xe1, 0x00, 0x62, 0xd2, + 0x35, 0x93, 0x00, 0x62, 0xd4, 0x13, 0x5d, 0x00, + 0x62, 0xf3, 0x1f, 0x21, 0x00, 0x62, 0xf7, 0x34, + 0x88, 0x00, 0x63, 0x3a, 0x4f, 0x3e, 0x00, 0x63, + 0x3d, 0x1e, 0x62, 0x00, 0x63, 0x4c, 0x34, 0x5d, + 0x00, 0x63, 0x57, 0x1e, 0x3f, 0x00, 0x63, 0x67, + 0x34, 0xc3, 0x00, 0x63, 0x68, 0x35, 0xec, 0x00, + 0x63, 0x69, 0x1e, 0x95, 0x00, 0x63, 0x6e, 0x34, + 0x9d, 0x00, 0x63, 0x72, 0x1d, 0xfc, 0x00, 0x63, + 0x83, 0x36, 0x43, 0x00, 0x63, 0x88, 0x35, 0xf6, + 0x00, 0x63, 0x92, 0x34, 0xaf, 0x00, 0x63, 0xa1, + 0x35, 0xd8, 0x00, 0x63, 0xa7, 0x35, 0xc6, 0x00, + 0x63, 0xc3, 0x1f, 0x27, 0x00, 0x63, 0xc6, 0x37, + 0x34, 0x00, 0x63, 0xf4, 0x35, 0x57, 0x00, 0x64, + 0x06, 0x1e, 0x96, 0x00, 0x64, 0x0f, 0x34, 0xe9, + 0x00, 0x64, 0x1c, 0x37, 0x33, 0x00, 0x64, 0x28, + 0x37, 0x35, 0x00, 0x64, 0x42, 0x34, 0x9e, 0x00, + 0x64, 0x69, 0x36, 0xd7, 0x00, 0x64, 0x6f, 0x4f, + 0x28, 0x00, 0x64, 0x7a, 0x1e, 0x21, 0x00, 0x64, + 0xb0, 0x1e, 0x24, 0x00, 0x64, 0xe2, 0x1e, 0x45, + 0x00, 0x64, 0xf2, 0x34, 0xea, 0x00, 0x64, 0xf6, + 0x4e, 0x9e, 0x00, 0x65, 0x1d, 0x34, 0xe8, 0x00, + 0x65, 0x4f, 0x0d, 0xc4, 0x00, 0x65, 0x5d, 0x34, + 0xeb, 0x00, 0x65, 0x5e, 0x4e, 0xa1, 0x00, 0x65, + 0x62, 0x34, 0x71, 0x00, 0x65, 0x77, 0x36, 0xb3, + 0x00, 0x65, 0x83, 0x1e, 0x98, 0x00, 0x65, 0x87, + 0x4e, 0xa3, 0x00, 0x65, 0x89, 0x4e, 0xa4, 0x00, + 0x65, 0x8e, 0x4e, 0xa6, 0x00, 0x65, 0x90, 0x34, + 0xb5, 0x00, 0x65, 0x9c, 0x35, 0xed, 0x00, 0x65, + 0xa7, 0x4f, 0x41, 0x00, 0x65, 0xbc, 0x35, 0x5c, + 0x00, 0x65, 0xc5, 0x37, 0x08, 0x00, 0x65, 0xdf, + 0x54, 0xbe, 0x00, 0x65, 0xe1, 0x4e, 0xa9, 0x00, + 0x65, 0xe2, 0x06, 0x37, 0x00, 0x66, 0x0e, 0x36, + 0xe4, 0x00, 0x66, 0x1e, 0x21, 0x1c, 0x00, 0x66, + 0x5f, 0x34, 0xec, 0x00, 0x66, 0x66, 0x1d, 0xe2, + 0x00, 0x66, 0x67, 0x4e, 0xaa, 0x00, 0x66, 0x69, + 0x36, 0xa5, 0x00, 0x66, 0x6e, 0x4e, 0xab, 0x00, + 0x66, 0x74, 0x0a, 0x56, 0x00, 0x66, 0x77, 0x39, + 0x11, 0x00, 0x66, 0x81, 0x35, 0xa0, 0x00, 0x66, + 0x91, 0x34, 0x28, 0x00, 0x66, 0x96, 0x36, 0x5e, + 0x00, 0x66, 0x97, 0x35, 0x46, 0x00, 0x66, 0xb5, + 0x54, 0xda, 0x00, 0x66, 0xc1, 0x1f, 0x38, 0x00, + 0x66, 0xd9, 0x1e, 0x13, 0x00, 0x66, 0xdc, 0x36, + 0xfd, 0x00, 0x66, 0xf4, 0x34, 0x81, 0x00, 0x66, + 0xf5, 0x37, 0x3b, 0x00, 0x66, 0xf8, 0x36, 0x03, + 0x00, 0x66, 0xfb, 0x37, 0xcd, 0x00, 0x66, 0xfc, + 0x37, 0x20, 0x00, 0x67, 0x00, 0x4e, 0xaf, 0x00, + 0x67, 0x08, 0x35, 0xb2, 0x00, 0x67, 0x09, 0x36, + 0xf7, 0x00, 0x67, 0x0b, 0x36, 0xc6, 0x00, 0x67, + 0x0d, 0x36, 0xb7, 0x00, 0x67, 0x15, 0x36, 0x6f, + 0x00, 0x67, 0x17, 0x0f, 0xd5, 0x00, 0x67, 0x1b, + 0x36, 0xd4, 0x00, 0x67, 0x1d, 0x36, 0x6b, 0x00, + 0x67, 0x1f, 0x35, 0x86, 0x00, 0x67, 0x53, 0x1e, + 0x0f, 0x00, 0x67, 0x56, 0x4f, 0x3a, 0x00, 0x67, + 0x5e, 0x37, 0x3c, 0x00, 0x67, 0x61, 0x4e, 0xb0, + 0x00, 0x67, 0x7e, 0x34, 0x95, 0x00, 0x67, 0xa6, + 0x1e, 0x99, 0x00, 0x67, 0xa9, 0x34, 0xed, 0x00, + 0x67, 0xc4, 0x4e, 0xb1, 0x00, 0x67, 0xca, 0x1e, + 0x65, 0x00, 0x67, 0xd4, 0x34, 0x91, 0x00, 0x67, + 0xe7, 0x34, 0xee, 0x00, 0x67, 0xf1, 0x36, 0x65, + 0x00, 0x68, 0x01, 0x21, 0x2e, 0x00, 0x68, 0x02, + 0x4e, 0xb2, 0x00, 0x68, 0x13, 0x1e, 0x25, 0x00, + 0x68, 0x1f, 0x4e, 0x61, 0x00, 0x68, 0x21, 0x34, + 0x82, 0x00, 0x68, 0x43, 0x34, 0xac, 0x00, 0x68, + 0x52, 0x21, 0x2c, 0x00, 0x68, 0x5d, 0x34, 0xc5, + 0x00, 0x68, 0x7a, 0x36, 0xf0, 0x00, 0x68, 0x81, + 0x37, 0x09, 0x00, 0x68, 0x85, 0x0d, 0x15, 0x00, + 0x68, 0x8d, 0x37, 0x3e, 0x00, 0x68, 0x97, 0x4f, + 0x37, 0x00, 0x68, 0x9b, 0x1e, 0x9b, 0x00, 0x68, + 0x9d, 0x37, 0x3d, 0x00, 0x68, 0xa2, 0x1e, 0x19, + 0x00, 0x68, 0xc8, 0x37, 0xcc, 0x00, 0x68, 0xda, + 0x1e, 0x38, 0x00, 0x69, 0x0d, 0x34, 0x99, 0x00, + 0x69, 0x30, 0x34, 0xf0, 0x00, 0x69, 0x3d, 0x4e, + 0xb3, 0x00, 0x69, 0x5e, 0x4e, 0xb4, 0x00, 0x69, + 0x62, 0x1e, 0x58, 0x00, 0x69, 0x6b, 0x34, 0xef, + 0x00, 0x69, 0x6f, 0x34, 0x94, 0x00, 0x69, 0x82, + 0x34, 0x5b, 0x00, 0x69, 0x8a, 0x1e, 0x06, 0x00, + 0x69, 0x94, 0x1e, 0x84, 0x00, 0x69, 0xa7, 0x34, + 0xf1, 0x00, 0x69, 0xbb, 0x37, 0x43, 0x00, 0x69, + 0xc1, 0x35, 0x9a, 0x00, 0x69, 0xcb, 0x35, 0xc7, + 0x00, 0x69, 0xcc, 0x1e, 0x40, 0x00, 0x69, 0xd9, + 0x36, 0xdd, 0x00, 0x69, 0xea, 0x35, 0x6f, 0x00, + 0x69, 0xfe, 0x55, 0x1f, 0x00, 0x6a, 0x0b, 0x1e, + 0x64, 0x00, 0x6a, 0x3d, 0x1e, 0x3a, 0x00, 0x6a, + 0x44, 0x34, 0xf2, 0x00, 0x6a, 0x55, 0x55, 0x25, + 0x00, 0x6a, 0x5f, 0x35, 0x87, 0x00, 0x6a, 0x73, + 0x37, 0xd4, 0x00, 0x6a, 0x8e, 0x34, 0x7e, 0x00, + 0x6a, 0x90, 0x34, 0xf3, 0x00, 0x6a, 0x9c, 0x4e, + 0xb6, 0x00, 0x6a, 0xdb, 0x06, 0xf3, 0x00, 0x6b, + 0x04, 0x0f, 0x5d, 0x00, 0x6b, 0x1d, 0x1d, 0xd7, + 0x00, 0x6b, 0x21, 0x35, 0xe7, 0x00, 0x6b, 0x24, + 0x3c, 0x22, 0x00, 0x6b, 0x4e, 0x36, 0x5b, 0x00, + 0x6b, 0x96, 0x36, 0x16, 0x00, 0x6b, 0xba, 0x08, + 0x74, 0x00, 0x6b, 0xbb, 0x34, 0x70, 0x00, 0x6c, + 0x08, 0x1f, 0x39, 0x00, 0x6c, 0x13, 0x34, 0xf5, + 0x00, 0x6c, 0x38, 0x4e, 0xba, 0x00, 0x6c, 0x3a, + 0x39, 0x62, 0x00, 0x6c, 0x72, 0x1f, 0x1e, 0x00, + 0x6c, 0xaa, 0x37, 0x48, 0x00, 0x6c, 0xbf, 0x05, + 0x0a, 0x00, 0x6c, 0xe1, 0x1e, 0x71, 0x00, 0x6c, + 0xe8, 0x36, 0x66, 0x00, 0x6d, 0x3e, 0x34, 0xae, + 0x00, 0x6d, 0x69, 0x35, 0xc8, 0x00, 0x6d, 0x6e, + 0x36, 0xb4, 0x00, 0x6d, 0x77, 0x05, 0x82, 0x00, + 0x6d, 0x78, 0x36, 0x1d, 0x00, 0x6d, 0x88, 0x36, + 0x0c, 0x00, 0x6d, 0xe4, 0x4e, 0xbd, 0x00, 0x6d, + 0xeb, 0x1d, 0xd5, 0x00, 0x6d, 0xfb, 0x36, 0x7c, + 0x00, 0x6e, 0x08, 0x4e, 0xbf, 0x00, 0x6e, 0x1a, + 0x09, 0x77, 0x00, 0x6e, 0x23, 0x1f, 0x3a, 0x00, + 0x6e, 0x2f, 0x35, 0xc9, 0x00, 0x6e, 0x6e, 0x1e, + 0x9d, 0x00, 0x6e, 0x72, 0x4e, 0xc0, 0x00, 0x6e, + 0x7e, 0x34, 0xcf, 0x00, 0x6e, 0x9d, 0x1e, 0x01, + 0x00, 0x6e, 0xa2, 0x1d, 0xd3, 0x00, 0x6e, 0xba, + 0x1e, 0x46, 0x00, 0x6e, 0xcb, 0x35, 0xe9, 0x00, + 0x6e, 0xd5, 0x4e, 0xc2, 0x00, 0x6e, 0xdb, 0x4e, + 0xc3, 0x00, 0x6e, 0xec, 0x1f, 0x3b, 0x00, 0x6e, + 0xfe, 0x34, 0xf8, 0x00, 0x6f, 0x11, 0x34, 0xf7, + 0x00, 0x6f, 0x22, 0x34, 0x14, 0x00, 0x6f, 0x23, + 0x0f, 0xc2, 0x00, 0x6f, 0x3e, 0x34, 0xf9, 0x00, + 0x6f, 0x51, 0x36, 0x9e, 0x00, 0x6f, 0x54, 0x35, + 0xb0, 0x00, 0x6f, 0x5b, 0x4e, 0xc4, 0x00, 0x6f, + 0x64, 0x4e, 0xc6, 0x00, 0x6f, 0x6e, 0x0b, 0xc8, + 0x00, 0x6f, 0x74, 0x4e, 0xc7, 0x00, 0x6f, 0x98, + 0x37, 0x47, 0x00, 0x6f, 0xef, 0x1e, 0x33, 0x00, + 0x6f, 0xf9, 0x39, 0x95, 0x00, 0x70, 0x15, 0x1e, + 0x6b, 0x00, 0x70, 0x1b, 0x37, 0x4a, 0x00, 0x70, + 0x1e, 0x1e, 0x51, 0x00, 0x70, 0x26, 0x1e, 0x3d, + 0x00, 0x70, 0x27, 0x36, 0x57, 0x00, 0x70, 0x4a, + 0x39, 0x98, 0x00, 0x70, 0x58, 0x1e, 0x57, 0x00, + 0x70, 0x70, 0x35, 0x6a, 0x00, 0x70, 0x78, 0x4f, + 0x2e, 0x00, 0x70, 0x7c, 0x1e, 0x10, 0x00, 0x70, + 0xad, 0x36, 0x5c, 0x00, 0x71, 0x49, 0x0f, 0xc3, + 0x00, 0x71, 0x4e, 0x1e, 0x26, 0x00, 0x71, 0x52, + 0x55, 0xad, 0x00, 0x71, 0x59, 0x35, 0x59, 0x00, + 0x71, 0x62, 0x37, 0x4b, 0x00, 0x71, 0x6e, 0x08, + 0xfd, 0x00, 0x71, 0x7d, 0x1e, 0x27, 0x00, 0x71, + 0x94, 0x1e, 0x7d, 0x00, 0x71, 0xb3, 0x39, 0xae, + 0x00, 0x71, 0xd0, 0x37, 0x0a, 0x00, 0x71, 0xff, + 0x34, 0xfa, 0x00, 0x72, 0x28, 0x15, 0xdf, 0x00, + 0x72, 0x2b, 0x3c, 0x26, 0x00, 0x72, 0x35, 0x09, + 0x0b, 0x00, 0x72, 0x36, 0x34, 0xb9, 0x00, 0x72, + 0x3a, 0x4f, 0x46, 0x00, 0x72, 0x3b, 0x37, 0x4c, + 0x00, 0x72, 0x3e, 0x4e, 0xc9, 0x00, 0x72, 0x4c, + 0x1e, 0x5b, 0x00, 0x72, 0x59, 0x1f, 0x1d, 0x00, + 0x72, 0xe1, 0x4f, 0x36, 0x00, 0x73, 0x1c, 0x37, + 0x4e, 0x00, 0x73, 0x2a, 0x0b, 0xb4, 0x00, 0x73, + 0x36, 0x36, 0xf8, 0x00, 0x73, 0x37, 0x1e, 0x7c, + 0x00, 0x73, 0x87, 0x37, 0x05, 0x00, 0x73, 0x8b, + 0x35, 0xa1, 0x00, 0x73, 0xca, 0x1e, 0x0b, 0x00, + 0x73, 0xce, 0x1e, 0xa0, 0x00, 0x73, 0xe5, 0x34, + 0xfb, 0x00, 0x73, 0xed, 0x34, 0xb1, 0x00, 0x74, + 0x22, 0x0b, 0x56, 0x00, 0x74, 0x32, 0x34, 0xfc, + 0x00, 0x74, 0x5f, 0x34, 0xfd, 0x00, 0x74, 0x62, + 0x21, 0x71, 0x00, 0x74, 0xb0, 0x35, 0x79, 0x00, + 0x74, 0xbd, 0x4e, 0xcd, 0x00, 0x74, 0xca, 0x37, + 0x4f, 0x00, 0x74, 0xd8, 0x55, 0xf6, 0x00, 0x74, + 0xdc, 0x35, 0x50, 0x00, 0x74, 0xe0, 0x34, 0xfe, + 0x00, 0x74, 0xef, 0x55, 0xfa, 0x00, 0x75, 0x04, + 0x1e, 0xa1, 0x00, 0x75, 0x0c, 0x34, 0xff, 0x00, + 0x75, 0x0d, 0x1e, 0xa2, 0x00, 0x75, 0x11, 0x1e, + 0x04, 0x00, 0x75, 0x15, 0x1e, 0xa3, 0x00, 0x75, + 0x26, 0x4f, 0x3b, 0x00, 0x75, 0x54, 0x36, 0xa4, + 0x00, 0x75, 0x5d, 0x4e, 0xce, 0x00, 0x75, 0xbc, + 0x4e, 0xcf, 0x00, 0x75, 0xc5, 0x36, 0xb1, 0x00, + 0x76, 0x08, 0x4e, 0xd1, 0x00, 0x76, 0x26, 0x1e, + 0x2d, 0x00, 0x76, 0x52, 0x1e, 0x7b, 0x00, 0x76, + 0x64, 0x4e, 0xd2, 0x00, 0x76, 0x69, 0x4e, 0xd3, + 0x00, 0x76, 0x72, 0x35, 0x00, 0x00, 0x76, 0x84, + 0x36, 0x79, 0x00, 0x76, 0x93, 0x1e, 0xa4, 0x00, + 0x76, 0xc6, 0x34, 0xc4, 0x00, 0x76, 0xca, 0x21, + 0x7b, 0x00, 0x76, 0xd4, 0x56, 0x1d, 0x00, 0x76, + 0xdb, 0x36, 0x2c, 0x00, 0x76, 0xdf, 0x36, 0xe5, + 0x00, 0x76, 0xf2, 0x36, 0xe9, 0x00, 0x76, 0xf4, + 0x36, 0x6e, 0x00, 0x77, 0x1e, 0x16, 0xb8, 0x00, + 0x77, 0x1f, 0x36, 0x1e, 0x00, 0x77, 0x37, 0x4e, + 0xd5, 0x00, 0x77, 0x3a, 0x34, 0xa6, 0x00, 0x77, + 0x7e, 0x4e, 0xd6, 0x00, 0x77, 0x8d, 0x56, 0x2e, + 0x00, 0x77, 0xa2, 0x56, 0x2f, 0x00, 0x77, 0xa5, + 0x1e, 0x6e, 0x00, 0x77, 0xac, 0x34, 0x92, 0x00, + 0x77, 0xe9, 0x35, 0xa4, 0x00, 0x78, 0x32, 0x36, + 0xc7, 0x00, 0x78, 0x3a, 0x36, 0x7f, 0x00, 0x78, + 0x5d, 0x36, 0x0d, 0x00, 0x78, 0x6c, 0x34, 0x83, + 0x00, 0x78, 0x7c, 0x1e, 0xa5, 0x00, 0x78, 0x91, + 0x0d, 0x7e, 0x00, 0x78, 0xd4, 0x35, 0x02, 0x00, + 0x78, 0xe8, 0x36, 0xda, 0x00, 0x78, 0xef, 0x35, + 0x4b, 0x00, 0x79, 0x2a, 0x35, 0x01, 0x00, 0x79, + 0x34, 0x3a, 0x38, 0x00, 0x79, 0x3a, 0x08, 0xd4, + 0x00, 0x79, 0x3c, 0x21, 0x83, 0x00, 0x79, 0x3e, + 0x34, 0x24, 0x00, 0x79, 0x40, 0x37, 0x57, 0x00, + 0x79, 0x41, 0x1d, 0xf4, 0x00, 0x79, 0x47, 0x1d, + 0xeb, 0x00, 0x79, 0x48, 0x06, 0x41, 0x00, 0x79, + 0x49, 0x34, 0x21, 0x00, 0x79, 0x50, 0x0f, 0x1e, + 0x00, 0x79, 0x53, 0x37, 0x58, 0x00, 0x79, 0x56, + 0x34, 0x2f, 0x00, 0x79, 0x5d, 0x09, 0x55, 0x00, + 0x79, 0x5e, 0x0a, 0x06, 0x00, 0x79, 0x62, 0x1f, + 0x29, 0x00, 0x79, 0x65, 0x09, 0xb5, 0x00, 0x79, + 0x8d, 0x05, 0x52, 0x00, 0x79, 0x8e, 0x34, 0x3b, + 0x00, 0x79, 0x8f, 0x21, 0x87, 0x00, 0x79, 0xa7, + 0x4e, 0xd7, 0x00, 0x79, 0xae, 0x37, 0x5b, 0x00, + 0x79, 0xb0, 0x1e, 0x59, 0x00, 0x79, 0xb1, 0x4e, + 0xd8, 0x00, 0x79, 0xba, 0x35, 0x03, 0x00, 0x79, + 0xe4, 0x1e, 0x5d, 0x00, 0x7a, 0x0b, 0x36, 0x78, + 0x00, 0x7a, 0x17, 0x1e, 0x66, 0x00, 0x7a, 0x19, + 0x35, 0x04, 0x00, 0x7a, 0x31, 0x1e, 0xa6, 0x00, + 0x7a, 0x40, 0x08, 0x04, 0x00, 0x7a, 0x60, 0x3a, + 0x4e, 0x00, 0x7a, 0x74, 0x34, 0x7a, 0x00, 0x7a, + 0x7a, 0x35, 0xa7, 0x00, 0x7a, 0x7f, 0x1f, 0x25, + 0x00, 0x7a, 0x81, 0x34, 0x3d, 0x00, 0x7a, 0x95, + 0x35, 0x05, 0x00, 0x7a, 0x97, 0x1f, 0x3c, 0x00, + 0x7a, 0xae, 0x34, 0x77, 0x00, 0x7a, 0xbe, 0x4e, + 0xd9, 0x00, 0x7a, 0xc6, 0x3c, 0x27, 0x00, 0x7a, + 0xc8, 0x4f, 0x3d, 0x00, 0x7b, 0x08, 0x1f, 0x1f, + 0x00, 0x7b, 0x51, 0x36, 0x63, 0x00, 0x7b, 0x75, + 0x4f, 0x2a, 0x00, 0x7b, 0x99, 0x1e, 0xa8, 0x00, + 0x7b, 0xad, 0x1f, 0x26, 0x00, 0x7b, 0xb8, 0x1e, + 0x5f, 0x00, 0x7b, 0xc0, 0x34, 0x2e, 0x00, 0x7b, + 0xc7, 0x1f, 0x2b, 0x00, 0x7b, 0xc9, 0x36, 0x61, + 0x00, 0x7b, 0xdd, 0x1f, 0x3d, 0x00, 0x7b, 0xe0, + 0x4e, 0xda, 0x00, 0x7c, 0x14, 0x37, 0x5f, 0x00, + 0x7c, 0x3e, 0x1f, 0x2d, 0x00, 0x7c, 0x3f, 0x36, + 0xc2, 0x00, 0x7c, 0x4d, 0x36, 0x36, 0x00, 0x7c, + 0x50, 0x37, 0x61, 0x00, 0x7c, 0x58, 0x37, 0x62, + 0x00, 0x7c, 0x69, 0x56, 0xaa, 0x00, 0x7c, 0x7e, + 0x1e, 0x78, 0x00, 0x7c, 0x82, 0x4f, 0x30, 0x00, + 0x7c, 0x89, 0x34, 0xbe, 0x00, 0x7c, 0x90, 0x1e, + 0xa9, 0x00, 0x7c, 0xae, 0x1e, 0xaa, 0x00, 0x7c, + 0xbe, 0x0a, 0x5e, 0x00, 0x7c, 0xd6, 0x0c, 0x76, + 0x00, 0x7c, 0xf2, 0x35, 0x06, 0x00, 0x7d, 0x04, + 0x36, 0xee, 0x00, 0x7d, 0x09, 0x4e, 0xdc, 0x00, + 0x7d, 0x0b, 0x36, 0xec, 0x00, 0x7d, 0x0d, 0x36, + 0x94, 0x00, 0x7d, 0x1a, 0x35, 0x91, 0x00, 0x7d, + 0x1b, 0x34, 0xbf, 0x00, 0x7d, 0x42, 0x35, 0xf8, + 0x00, 0x7d, 0x46, 0x37, 0x63, 0x00, 0x7d, 0x5c, + 0x21, 0x90, 0x00, 0x7d, 0x5e, 0x34, 0x84, 0x00, + 0x7d, 0x63, 0x37, 0x64, 0x00, 0x7d, 0x73, 0x35, + 0x07, 0x00, 0x7d, 0x9b, 0x1e, 0xab, 0x00, 0x7d, + 0x9f, 0x1e, 0xad, 0x00, 0x7d, 0xae, 0x1e, 0xac, + 0x00, 0x7d, 0xb2, 0x4e, 0xdd, 0x00, 0x7d, 0xcb, + 0x34, 0xb6, 0x00, 0x7d, 0xcf, 0x34, 0xa0, 0x00, + 0x7d, 0xdd, 0x35, 0x08, 0x00, 0x7d, 0xe8, 0x36, + 0xbf, 0x00, 0x7d, 0xe9, 0x35, 0x7a, 0x00, 0x7d, + 0xef, 0x34, 0x62, 0x00, 0x7d, 0xf4, 0x0f, 0xc5, + 0x00, 0x7e, 0x09, 0x47, 0xbe, 0x00, 0x7e, 0x1b, + 0x36, 0x9b, 0x00, 0x7e, 0x22, 0x37, 0x65, 0x00, + 0x7e, 0x2b, 0x36, 0xc8, 0x00, 0x7e, 0x35, 0x35, + 0x09, 0x00, 0x7e, 0x41, 0x34, 0x40, 0x00, 0x7e, + 0x43, 0x37, 0x69, 0x00, 0x7e, 0x6d, 0x36, 0xe1, + 0x00, 0x7e, 0x8c, 0x37, 0x6a, 0x00, 0x7f, 0x3e, + 0x4e, 0xdf, 0x00, 0x7f, 0x50, 0x37, 0x6b, 0x00, + 0x7f, 0x61, 0x3c, 0x28, 0x00, 0x7f, 0x6a, 0x34, + 0x89, 0x00, 0x7f, 0x6e, 0x36, 0x60, 0x00, 0x7f, + 0x72, 0x09, 0x7a, 0x00, 0x7f, 0x80, 0x56, 0xda, + 0x00, 0x7f, 0x8a, 0x0f, 0x3d, 0x00, 0x7f, 0xa1, + 0x36, 0x3d, 0x00, 0x7f, 0xae, 0x35, 0x0a, 0x00, + 0x7f, 0xbd, 0x04, 0xcb, 0x00, 0x7f, 0xc1, 0x34, + 0x6a, 0x00, 0x7f, 0xc5, 0x37, 0x6f, 0x00, 0x7f, + 0xc6, 0x37, 0x70, 0x00, 0x7f, 0xcc, 0x37, 0x01, + 0x00, 0x7f, 0xd2, 0x35, 0xf9, 0x00, 0x7f, 0xd4, + 0x1e, 0xae, 0x00, 0x7f, 0xe0, 0x1e, 0x20, 0x00, + 0x7f, 0xe1, 0x35, 0x0b, 0x00, 0x7f, 0xe9, 0x1f, + 0x3e, 0x00, 0x7f, 0xeb, 0x1d, 0xe9, 0x00, 0x7f, + 0xf0, 0x1d, 0xe8, 0x00, 0x7f, 0xfb, 0x36, 0xd8, + 0x00, 0x7f, 0xfc, 0x34, 0xc8, 0x00, 0x80, 0x00, + 0x1e, 0x7e, 0x00, 0x80, 0x03, 0x34, 0x85, 0x00, + 0x80, 0x05, 0x34, 0x25, 0x00, 0x80, 0x12, 0x4e, + 0xe1, 0x00, 0x80, 0x15, 0x35, 0xca, 0x00, 0x80, + 0x17, 0x36, 0xea, 0x00, 0x80, 0x36, 0x34, 0xc7, + 0x00, 0x80, 0x56, 0x36, 0x2d, 0x00, 0x80, 0x5a, + 0x35, 0x0c, 0x00, 0x80, 0x5f, 0x35, 0x0d, 0x00, + 0x80, 0x61, 0x34, 0xa1, 0x00, 0x80, 0x6f, 0x34, + 0xcd, 0x00, 0x80, 0x70, 0x35, 0x0f, 0x00, 0x80, + 0x71, 0x3c, 0x29, 0x00, 0x80, 0x73, 0x35, 0x0e, + 0x00, 0x80, 0x74, 0x34, 0xa7, 0x00, 0x80, 0x76, + 0x35, 0x10, 0x00, 0x80, 0x77, 0x34, 0x9a, 0x00, + 0x80, 0x7e, 0x34, 0xce, 0x00, 0x80, 0x87, 0x36, + 0x9c, 0x00, 0x80, 0x89, 0x36, 0x8f, 0x00, 0x80, + 0x96, 0x36, 0x0e, 0x00, 0x80, 0x9e, 0x3c, 0x2a, + 0x00, 0x80, 0xa9, 0x35, 0xb8, 0x00, 0x80, 0xba, + 0x36, 0x97, 0x00, 0x80, 0xd6, 0x4e, 0xe3, 0x00, + 0x80, 0xde, 0x36, 0xc9, 0x00, 0x81, 0x06, 0x36, + 0x34, 0x00, 0x81, 0x08, 0x34, 0xc6, 0x00, 0x81, + 0x09, 0x4e, 0xe4, 0x00, 0x81, 0x29, 0x4e, 0xe5, + 0x00, 0x81, 0x53, 0x35, 0x11, 0x00, 0x81, 0x54, + 0x35, 0xcb, 0x00, 0x81, 0x70, 0x35, 0xd1, 0x00, + 0x81, 0x71, 0x4f, 0x33, 0x00, 0x81, 0x7f, 0x1e, + 0x30, 0x00, 0x81, 0x8a, 0x35, 0x12, 0x00, 0x81, + 0xb5, 0x35, 0x13, 0x00, 0x81, 0xcd, 0x35, 0x14, + 0x00, 0x81, 0xed, 0x34, 0x26, 0x00, 0x82, 0x00, + 0x57, 0x0f, 0x00, 0x82, 0x0c, 0x4e, 0xe6, 0x00, + 0x82, 0x18, 0x35, 0x7f, 0x00, 0x82, 0x1b, 0x4e, + 0xe7, 0x00, 0x82, 0x1c, 0x34, 0x93, 0x00, 0x82, + 0x1f, 0x35, 0xb3, 0x00, 0x82, 0x2e, 0x1e, 0xaf, + 0x00, 0x82, 0x39, 0x34, 0x9f, 0x00, 0x82, 0x40, + 0x4e, 0xe8, 0x00, 0x82, 0x47, 0x34, 0xab, 0x00, + 0x82, 0x58, 0x37, 0x74, 0x00, 0x82, 0x79, 0x37, + 0x77, 0x00, 0x82, 0x8d, 0x1e, 0xb0, 0x00, 0x82, + 0x92, 0x4f, 0x44, 0x00, 0x82, 0xa6, 0x1f, 0x19, + 0x00, 0x82, 0xb1, 0x35, 0x62, 0x00, 0x82, 0xbd, + 0x05, 0x6a, 0x00, 0x82, 0xc5, 0x35, 0x77, 0x00, + 0x82, 0xd2, 0x1e, 0xb1, 0x00, 0x82, 0xe3, 0x37, + 0x78, 0x00, 0x83, 0x23, 0x1e, 0xb2, 0x00, 0x83, + 0x28, 0x1f, 0x1a, 0x00, 0x83, 0x52, 0x35, 0xcc, + 0x00, 0x83, 0x75, 0x1e, 0xb3, 0x00, 0x83, 0xbd, + 0x37, 0x7c, 0x00, 0x83, 0xd3, 0x35, 0x63, 0x00, + 0x83, 0xd4, 0x4e, 0xea, 0x00, 0x83, 0xdc, 0x35, + 0xda, 0x00, 0x83, 0xdf, 0x1e, 0x4b, 0x00, 0x83, + 0xf2, 0x35, 0x15, 0x00, 0x84, 0x0c, 0x36, 0xca, + 0x00, 0x84, 0x0f, 0x4e, 0xeb, 0x00, 0x84, 0x20, + 0x37, 0x7b, 0x00, 0x84, 0x22, 0x1f, 0x3f, 0x00, + 0x84, 0x57, 0x34, 0x37, 0x00, 0x84, 0x5b, 0x1d, + 0xe4, 0x00, 0x84, 0x5c, 0x57, 0x45, 0x00, 0x84, + 0x7a, 0x34, 0xba, 0x00, 0x84, 0xea, 0x4e, 0xed, + 0x00, 0x84, 0xec, 0x1e, 0x72, 0x00, 0x84, 0xee, + 0x0f, 0xc7, 0x00, 0x84, 0xf4, 0x37, 0x7d, 0x00, + 0x85, 0x11, 0x36, 0xbd, 0x00, 0x85, 0x17, 0x1e, + 0xb4, 0x00, 0x85, 0x3d, 0x1e, 0x6d, 0x00, 0x85, + 0x43, 0x36, 0xa6, 0x00, 0x85, 0x51, 0x4e, 0xef, + 0x00, 0x85, 0x55, 0x35, 0x16, 0x00, 0x85, 0x5d, + 0x57, 0x64, 0x00, 0x85, 0x63, 0x4e, 0xf0, 0x00, + 0x85, 0x84, 0x36, 0x99, 0x00, 0x85, 0x87, 0x37, + 0x7f, 0x00, 0x85, 0xa9, 0x1e, 0x08, 0x00, 0x85, + 0xaf, 0x1e, 0x15, 0x00, 0x85, 0xcf, 0x4e, 0xf1, + 0x00, 0x85, 0xd5, 0x35, 0x17, 0x00, 0x85, 0xe4, + 0x36, 0x85, 0x00, 0x85, 0xf7, 0x1e, 0x16, 0x00, + 0x86, 0x12, 0x21, 0xa4, 0x00, 0x86, 0x2d, 0x37, + 0x04, 0x00, 0x86, 0x4e, 0x4e, 0xf2, 0x00, 0x86, + 0x50, 0x35, 0x8c, 0x00, 0x86, 0x54, 0x4f, 0x32, + 0x00, 0x86, 0x5c, 0x0f, 0x82, 0x00, 0x86, 0x5e, + 0x35, 0xa6, 0x00, 0x86, 0x62, 0x4e, 0xf3, 0x00, + 0x86, 0x8a, 0x4e, 0xf4, 0x00, 0x86, 0xdb, 0x34, + 0x5e, 0x00, 0x86, 0xf8, 0x1e, 0x35, 0x00, 0x87, + 0x03, 0x4f, 0x48, 0x00, 0x87, 0x1a, 0x35, 0x18, + 0x00, 0x87, 0x37, 0x37, 0x82, 0x00, 0x87, 0x3b, + 0x37, 0x83, 0x00, 0x87, 0x55, 0x1e, 0x1d, 0x00, + 0x87, 0x59, 0x1f, 0x40, 0x00, 0x87, 0x82, 0x1e, + 0xb6, 0x00, 0x87, 0xa3, 0x57, 0xaa, 0x00, 0x87, + 0xbd, 0x37, 0x85, 0x00, 0x87, 0xd2, 0x1e, 0xb7, + 0x00, 0x88, 0x03, 0x3b, 0x03, 0x00, 0x88, 0x05, + 0x37, 0x84, 0x00, 0x88, 0x0e, 0x1f, 0x41, 0x00, + 0x88, 0x36, 0x35, 0x19, 0x00, 0x88, 0x42, 0x4e, + 0xf5, 0x00, 0x88, 0x46, 0x35, 0xfa, 0x00, 0x88, + 0x4b, 0x57, 0xc3, 0x00, 0x88, 0x53, 0x35, 0xfd, + 0x00, 0x88, 0x5b, 0x34, 0x66, 0x00, 0x88, 0x5e, + 0x35, 0x53, 0x00, 0x88, 0x63, 0x35, 0x48, 0x00, + 0x88, 0x70, 0x36, 0x27, 0x00, 0x88, 0x77, 0x4e, + 0xf6, 0x00, 0x88, 0x9e, 0x35, 0x1a, 0x00, 0x88, + 0xd8, 0x35, 0x1b, 0x00, 0x88, 0xf4, 0x35, 0x1c, + 0x00, 0x89, 0x0a, 0x1e, 0xb8, 0x00, 0x89, 0x10, + 0x34, 0x13, 0x00, 0x89, 0x1c, 0x37, 0xcb, 0x00, + 0x89, 0x2b, 0x35, 0x1d, 0x00, 0x89, 0x3b, 0x35, + 0x1e, 0x00, 0x89, 0x41, 0x4e, 0xf7, 0x00, 0x89, + 0x56, 0x1d, 0xdd, 0x00, 0x89, 0x6a, 0x35, 0x1f, + 0x00, 0x89, 0x6f, 0x35, 0x20, 0x00, 0x89, 0x81, + 0x36, 0xff, 0x00, 0x89, 0x86, 0x36, 0xb8, 0x00, + 0x89, 0x87, 0x36, 0x95, 0x00, 0x89, 0x96, 0x34, + 0x22, 0x00, 0x89, 0xaa, 0x34, 0x9b, 0x00, 0x89, + 0xaf, 0x1e, 0xb9, 0x00, 0x89, 0xbd, 0x37, 0x8a, + 0x00, 0x89, 0xd2, 0x05, 0xaf, 0x00, 0x8a, 0x0a, + 0x36, 0x24, 0x00, 0x8a, 0x12, 0x37, 0xd7, 0x00, + 0x8a, 0x1d, 0x35, 0x21, 0x00, 0x8a, 0x1f, 0x34, + 0x96, 0x00, 0x8a, 0x3b, 0x1e, 0x3c, 0x00, 0x8a, + 0x55, 0x36, 0xaf, 0x00, 0x8a, 0x6e, 0x1e, 0x28, + 0x00, 0x8a, 0x8d, 0x36, 0x92, 0x00, 0x8a, 0x95, + 0x34, 0xa3, 0x00, 0x8a, 0xa0, 0x36, 0x2f, 0x00, + 0x8a, 0xa4, 0x35, 0xc2, 0x00, 0x8a, 0xb9, 0x34, + 0xb7, 0x00, 0x8a, 0xbf, 0x36, 0x6d, 0x00, 0x8a, + 0xcb, 0x36, 0x30, 0x00, 0x8a, 0xdb, 0x37, 0x8b, + 0x00, 0x8a, 0xde, 0x1e, 0xba, 0x00, 0x8a, 0xed, + 0x0f, 0x0b, 0x00, 0x8a, 0xee, 0x35, 0xe3, 0x00, + 0x8a, 0xf8, 0x09, 0x7e, 0x00, 0x8a, 0xfa, 0x1d, + 0xfe, 0x00, 0x8b, 0x01, 0x04, 0xfc, 0x00, 0x8b, + 0x04, 0x36, 0x86, 0x00, 0x8b, 0x0e, 0x1e, 0x56, + 0x00, 0x8b, 0x19, 0x35, 0xb9, 0x00, 0x8b, 0x1b, + 0x35, 0xcd, 0x00, 0x8b, 0x1d, 0x34, 0x8d, 0x00, + 0x8b, 0x2c, 0x1e, 0x69, 0x00, 0x8b, 0x39, 0x06, + 0xd8, 0x00, 0x8b, 0x3e, 0x37, 0x8c, 0x00, 0x8b, + 0x41, 0x1e, 0xbb, 0x00, 0x8b, 0x56, 0x4e, 0xf8, + 0x00, 0x8b, 0x5a, 0x37, 0x8d, 0x00, 0x8b, 0x5c, + 0x4e, 0xfa, 0x00, 0x8b, 0x7f, 0x52, 0x52, 0x00, + 0x8c, 0x6a, 0x4e, 0xfd, 0x00, 0x8c, 0x79, 0x4e, + 0xfe, 0x00, 0x8c, 0x9b, 0x58, 0x37, 0x00, 0x8c, + 0xa0, 0x36, 0xb5, 0x00, 0x8c, 0xa7, 0x34, 0xb8, + 0x00, 0x8c, 0xa8, 0x35, 0x64, 0x00, 0x8c, 0xab, + 0x34, 0x72, 0x00, 0x8c, 0xc7, 0x35, 0xe5, 0x00, + 0x8c, 0xca, 0x36, 0x4c, 0x00, 0x8c, 0xd3, 0x0d, + 0xc2, 0x00, 0x8c, 0xed, 0x1e, 0x4c, 0x00, 0x8c, + 0xfc, 0x34, 0x86, 0x00, 0x8d, 0x05, 0x35, 0x22, + 0x00, 0x8d, 0x08, 0x34, 0x34, 0x00, 0x8d, 0x0f, + 0x35, 0x23, 0x00, 0x8d, 0x67, 0x4f, 0x00, 0x00, + 0x8d, 0x70, 0x36, 0x46, 0x00, 0x8d, 0x73, 0x37, + 0x8e, 0x00, 0x8d, 0x77, 0x35, 0x88, 0x00, 0x8d, + 0x99, 0x37, 0x8f, 0x00, 0x8d, 0xda, 0x1e, 0xbc, + 0x00, 0x8d, 0xdd, 0x35, 0x94, 0x00, 0x8d, 0xf3, + 0x34, 0xa8, 0x00, 0x8e, 0x09, 0x1e, 0xbd, 0x00, + 0x8e, 0x34, 0x37, 0x91, 0x00, 0x8e, 0x4a, 0x37, + 0x92, 0x00, 0x8e, 0x8d, 0x36, 0xef, 0x00, 0x8e, + 0x91, 0x35, 0x25, 0x00, 0x8e, 0xa1, 0x35, 0x26, + 0x00, 0x8e, 0xcc, 0x34, 0x76, 0x00, 0x8e, 0xd4, + 0x3b, 0x4a, 0x00, 0x8f, 0x03, 0x4f, 0x02, 0x00, + 0x8f, 0x13, 0x1e, 0xbe, 0x00, 0x8f, 0x29, 0x34, + 0xb0, 0x00, 0x8f, 0x2f, 0x34, 0x90, 0x00, 0x8f, + 0x38, 0x36, 0xf5, 0x00, 0x8f, 0x44, 0x35, 0x75, + 0x00, 0x8f, 0xb6, 0x3c, 0x2b, 0x00, 0x8f, 0xbb, + 0x20, 0x4b, 0x00, 0x8f, 0xbc, 0x35, 0xd3, 0x00, + 0x8f, 0xbf, 0x1e, 0x37, 0x00, 0x8f, 0xc2, 0x1d, + 0xd6, 0x00, 0x8f, 0xc4, 0x1f, 0x2c, 0x00, 0x8f, + 0xc5, 0x36, 0x26, 0x00, 0x8f, 0xc6, 0x3b, 0x51, + 0x00, 0x8f, 0xce, 0x35, 0xae, 0x00, 0x8f, 0xd1, + 0x35, 0xa2, 0x00, 0x8f, 0xd4, 0x36, 0xc0, 0x00, + 0x8f, 0xe6, 0x1d, 0xdf, 0x00, 0x8f, 0xe9, 0x1e, + 0xc0, 0x00, 0x8f, 0xea, 0x1e, 0xbf, 0x00, 0x8f, + 0xeb, 0x36, 0x9a, 0x00, 0x8f, 0xed, 0x36, 0x7b, + 0x00, 0x8f, 0xef, 0x37, 0x93, 0x00, 0x8f, 0xf0, + 0x35, 0xfe, 0x00, 0x8f, 0xf6, 0x4f, 0x06, 0x00, + 0x8f, 0xf7, 0x36, 0xe6, 0x00, 0x8f, 0xfa, 0x37, + 0x95, 0x00, 0x8f, 0xfd, 0x36, 0x72, 0x00, 0x90, + 0x00, 0x36, 0x51, 0x00, 0x90, 0x01, 0x36, 0x47, + 0x00, 0x90, 0x03, 0x34, 0xad, 0x00, 0x90, 0x06, + 0x35, 0x8d, 0x00, 0x90, 0x0e, 0x35, 0x28, 0x00, + 0x90, 0x0f, 0x36, 0x88, 0x00, 0x90, 0x10, 0x36, + 0x64, 0x00, 0x90, 0x14, 0x36, 0x7e, 0x00, 0x90, + 0x17, 0x1e, 0x1f, 0x00, 0x90, 0x19, 0x1e, 0x5c, + 0x00, 0x90, 0x1a, 0x36, 0x73, 0x00, 0x90, 0x1d, + 0x1e, 0x22, 0x00, 0x90, 0x1e, 0x37, 0x96, 0x00, + 0x90, 0x1f, 0x36, 0x4b, 0x00, 0x90, 0x20, 0x36, + 0x49, 0x00, 0x90, 0x22, 0x20, 0x4a, 0x00, 0x90, + 0x23, 0x0f, 0xc8, 0x00, 0x90, 0x2e, 0x36, 0x52, + 0x00, 0x90, 0x31, 0x35, 0xfb, 0x00, 0x90, 0x32, + 0x36, 0x1f, 0x00, 0x90, 0x35, 0x37, 0x97, 0x00, + 0x90, 0x38, 0x34, 0x08, 0x00, 0x90, 0x39, 0x36, + 0x58, 0x00, 0x90, 0x3c, 0x1e, 0x67, 0x00, 0x90, + 0x41, 0x1e, 0x53, 0x00, 0x90, 0x42, 0x34, 0x9c, + 0x00, 0x90, 0x47, 0x35, 0xa8, 0x00, 0x90, 0x4a, + 0x36, 0xfc, 0x00, 0x90, 0x4b, 0x35, 0x51, 0x00, + 0x90, 0x4d, 0x36, 0xc1, 0x00, 0x90, 0x4e, 0x35, + 0x65, 0x00, 0x90, 0x50, 0x37, 0x98, 0x00, 0x90, + 0x52, 0x35, 0x27, 0x00, 0x90, 0x53, 0x36, 0x8b, + 0x00, 0x90, 0x54, 0x36, 0x58, 0x00, 0x90, 0x55, + 0x34, 0x63, 0x00, 0x90, 0x58, 0x1e, 0xc1, 0x00, + 0x90, 0x5c, 0x1e, 0x2e, 0x00, 0x90, 0x60, 0x35, + 0x5a, 0x00, 0x90, 0x61, 0x1e, 0x2a, 0x00, 0x90, + 0x63, 0x35, 0xba, 0x00, 0x90, 0x69, 0x36, 0x7a, + 0x00, 0x90, 0x6d, 0x36, 0x48, 0x00, 0x90, 0x6e, + 0x1e, 0x0e, 0x00, 0x90, 0x75, 0x36, 0x00, 0x00, + 0x90, 0x77, 0x36, 0x40, 0x00, 0x90, 0x78, 0x36, + 0x3f, 0x00, 0x90, 0x7a, 0x35, 0x4a, 0x00, 0x90, + 0x7c, 0x1e, 0x80, 0x00, 0x90, 0x7f, 0x36, 0xa7, + 0x00, 0x90, 0x81, 0x37, 0x9a, 0x00, 0x90, 0x83, + 0x37, 0x5c, 0x00, 0x90, 0x84, 0x35, 0x7c, 0x00, + 0x90, 0x87, 0x37, 0x94, 0x00, 0x90, 0x89, 0x34, + 0x5f, 0x00, 0x90, 0x8a, 0x37, 0x9b, 0x00, 0x90, + 0xa3, 0x1e, 0x55, 0x00, 0x90, 0xa6, 0x36, 0xcb, + 0x00, 0x90, 0xa8, 0x4f, 0x0b, 0x00, 0x90, 0xaa, + 0x34, 0x8e, 0x00, 0x90, 0xf7, 0x35, 0x9d, 0x00, + 0x90, 0xfd, 0x0c, 0x4e, 0x00, 0x91, 0x2d, 0x1e, + 0x44, 0x00, 0x91, 0x30, 0x35, 0x29, 0x00, 0x91, + 0x4b, 0x1e, 0x12, 0x00, 0x91, 0x4c, 0x35, 0xf2, + 0x00, 0x91, 0x4d, 0x4f, 0x0c, 0x00, 0x91, 0x56, + 0x35, 0x2a, 0x00, 0x91, 0x58, 0x35, 0x2b, 0x00, + 0x91, 0x65, 0x35, 0x2c, 0x00, 0x91, 0x72, 0x35, + 0x2e, 0x00, 0x91, 0x73, 0x35, 0x2d, 0x00, 0x91, + 0x77, 0x35, 0xd0, 0x00, 0x91, 0xa2, 0x35, 0x2f, + 0x00, 0x91, 0xaa, 0x35, 0x31, 0x00, 0x91, 0xaf, + 0x35, 0x30, 0x00, 0x91, 0xb1, 0x36, 0x9f, 0x00, + 0x91, 0xb4, 0x35, 0x32, 0x00, 0x91, 0xba, 0x35, + 0x33, 0x00, 0x91, 0xc1, 0x1e, 0xc3, 0x00, 0x91, + 0xc7, 0x1e, 0x05, 0x00, 0x91, 0xdc, 0x4f, 0x42, + 0x00, 0x91, 0xe3, 0x36, 0x75, 0x00, 0x91, 0xfc, + 0x3c, 0x2c, 0x00, 0x92, 0x37, 0x34, 0x7d, 0x00, + 0x92, 0x5b, 0x34, 0x69, 0x00, 0x92, 0xe9, 0x4f, + 0x0d, 0x00, 0x93, 0x06, 0x1e, 0x0a, 0x00, 0x93, + 0x35, 0x4f, 0x0e, 0x00, 0x93, 0x65, 0x3b, 0x86, + 0x00, 0x93, 0x75, 0x4f, 0x34, 0x00, 0x93, 0x8b, + 0x4f, 0x0f, 0x00, 0x93, 0x8c, 0x35, 0x76, 0x00, + 0x93, 0x96, 0x35, 0xd5, 0x00, 0x93, 0x9a, 0x1e, + 0x41, 0x00, 0x93, 0xa1, 0x59, 0x04, 0x00, 0x93, + 0xae, 0x34, 0x3a, 0x00, 0x93, 0xdd, 0x37, 0xae, + 0x00, 0x94, 0x3a, 0x4f, 0x10, 0x00, 0x94, 0x53, + 0x1e, 0x79, 0x00, 0x94, 0x77, 0x35, 0x34, 0x00, + 0x95, 0x92, 0x35, 0x7d, 0x00, 0x95, 0xab, 0x3b, + 0x9a, 0x00, 0x95, 0xbb, 0x1e, 0xc4, 0x00, 0x95, + 0xbc, 0x37, 0xaf, 0x00, 0x95, 0xcd, 0x4f, 0x11, + 0x00, 0x96, 0x2a, 0x4f, 0x12, 0x00, 0x96, 0x4d, + 0x34, 0x87, 0x00, 0x96, 0x86, 0x34, 0x51, 0x00, + 0x96, 0x8a, 0x36, 0x53, 0x00, 0x96, 0x94, 0x35, + 0x73, 0x00, 0x96, 0x98, 0x35, 0x35, 0x00, 0x96, + 0x99, 0x4f, 0x31, 0x00, 0x96, 0xa3, 0x34, 0xca, + 0x00, 0x96, 0xa7, 0x4f, 0x14, 0x00, 0x96, 0xb2, + 0x37, 0xb1, 0x00, 0x96, 0xbb, 0x36, 0x35, 0x00, + 0x96, 0xc5, 0x34, 0x6c, 0x00, 0x96, 0xc7, 0x35, + 0xbe, 0x00, 0x96, 0xd9, 0x34, 0xd5, 0x00, 0x96, + 0xda, 0x59, 0x3b, 0x00, 0x96, 0xe3, 0x0c, 0xc9, + 0x00, 0x96, 0xe8, 0x35, 0x4d, 0x00, 0x96, 0xea, + 0x36, 0x39, 0x00, 0x96, 0xf0, 0x34, 0xc0, 0x00, + 0x97, 0x21, 0x59, 0x41, 0x00, 0x97, 0x24, 0x1e, + 0xc6, 0x00, 0x97, 0x3d, 0x35, 0x36, 0x00, 0x97, + 0x55, 0x21, 0xf8, 0x00, 0x97, 0x56, 0x21, 0x8b, + 0x00, 0x97, 0x59, 0x37, 0xb2, 0x00, 0x97, 0x5c, + 0x36, 0x31, 0x00, 0x97, 0x60, 0x1e, 0xc7, 0x00, + 0x97, 0x6d, 0x1e, 0xc8, 0x00, 0x97, 0x71, 0x1e, + 0x1e, 0x00, 0x97, 0x74, 0x1d, 0xf3, 0x00, 0x97, + 0x84, 0x1d, 0xe5, 0x00, 0x97, 0x98, 0x1e, 0x1c, + 0x00, 0x97, 0xad, 0x4f, 0x43, 0x00, 0x97, 0xd3, + 0x35, 0x7e, 0x00, 0x97, 0xde, 0x3c, 0x2e, 0x00, + 0x97, 0xf3, 0x35, 0x60, 0x00, 0x97, 0xff, 0x34, + 0x19, 0x00, 0x98, 0x0c, 0x35, 0x39, 0x00, 0x98, + 0x11, 0x34, 0x74, 0x00, 0x98, 0x12, 0x34, 0xb2, + 0x00, 0x98, 0x13, 0x1e, 0x54, 0x00, 0x98, 0x24, + 0x1e, 0xc9, 0x00, 0x98, 0x3b, 0x0d, 0xc3, 0x00, + 0x98, 0x5e, 0x0f, 0xa8, 0x00, 0x98, 0x67, 0x35, + 0xbf, 0x00, 0x98, 0x73, 0x35, 0x3a, 0x00, 0x98, + 0xc3, 0x35, 0x3b, 0x00, 0x98, 0xdf, 0x36, 0x17, + 0x00, 0x98, 0xe2, 0x35, 0x89, 0x00, 0x98, 0xeb, + 0x37, 0xb4, 0x00, 0x98, 0xef, 0x0d, 0x67, 0x00, + 0x98, 0xf4, 0x1d, 0xd2, 0x00, 0x98, 0xfc, 0x21, + 0xfc, 0x00, 0x98, 0xfd, 0x36, 0xcd, 0x00, 0x98, + 0xfe, 0x36, 0x14, 0x00, 0x99, 0x03, 0x37, 0xb5, + 0x00, 0x99, 0x05, 0x1e, 0x77, 0x00, 0x99, 0x09, + 0x37, 0xb6, 0x00, 0x99, 0x0a, 0x37, 0x00, 0x00, + 0x99, 0x0c, 0x1d, 0xdb, 0x00, 0x99, 0x10, 0x1f, + 0x22, 0x00, 0x99, 0x13, 0x35, 0x68, 0x00, 0x99, + 0x21, 0x4f, 0x18, 0x00, 0x99, 0x28, 0x21, 0xfe, + 0x00, 0x99, 0x45, 0x37, 0xb7, 0x00, 0x99, 0x4b, + 0x37, 0xb9, 0x00, 0x99, 0x57, 0x1f, 0x20, 0x00, + 0x99, 0xc1, 0x4f, 0x40, 0x00, 0x99, 0xd0, 0x36, + 0x67, 0x00, 0x9a, 0x19, 0x1f, 0x43, 0x00, 0x9a, + 0x30, 0x36, 0x89, 0x00, 0x9a, 0x45, 0x35, 0x3c, + 0x00, 0x9a, 0x4a, 0x59, 0x88, 0x00, 0x9a, 0x5f, + 0x37, 0xbb, 0x00, 0x9a, 0x65, 0x37, 0xbc, 0x00, + 0x9a, 0xef, 0x37, 0xbd, 0x00, 0x9b, 0x18, 0x37, + 0xbe, 0x00, 0x9b, 0x2d, 0x34, 0x3c, 0x00, 0x9b, + 0x2e, 0x1e, 0xca, 0x00, 0x9b, 0x35, 0x59, 0xa4, + 0x00, 0x9b, 0x4d, 0x35, 0x3d, 0x00, 0x9b, 0x54, + 0x36, 0xdb, 0x00, 0x9b, 0x58, 0x35, 0x3e, 0x00, + 0x9b, 0x97, 0x1e, 0xcb, 0x00, 0x9b, 0xa8, 0x4f, + 0x1a, 0x00, 0x9b, 0xab, 0x4f, 0x38, 0x00, 0x9b, + 0xae, 0x4f, 0x1b, 0x00, 0x9b, 0xb9, 0x4f, 0x1c, + 0x00, 0x9b, 0xc6, 0x35, 0x3f, 0x00, 0x9b, 0xd6, + 0x1e, 0x09, 0x00, 0x9b, 0xdb, 0x36, 0x54, 0x00, + 0x9b, 0xe1, 0x35, 0x40, 0x00, 0x9b, 0xf1, 0x35, + 0x41, 0x00, 0x9b, 0xf2, 0x1e, 0xcc, 0x00, 0x9c, + 0x08, 0x4f, 0x1d, 0x00, 0x9c, 0x24, 0x4f, 0x1e, + 0x00, 0x9c, 0x2f, 0x1d, 0xd4, 0x00, 0x9c, 0x3b, + 0x4f, 0x1f, 0x00, 0x9c, 0x48, 0x1e, 0x39, 0x00, + 0x9c, 0x52, 0x1e, 0x74, 0x00, 0x9c, 0x57, 0x37, + 0x0c, 0x00, 0x9c, 0xe6, 0x4f, 0x21, 0x00, 0x9d, + 0x07, 0x1e, 0x4f, 0x00, 0x9d, 0x08, 0x37, 0xc1, + 0x00, 0x9d, 0x09, 0x37, 0xc0, 0x00, 0x9d, 0x48, + 0x35, 0x42, 0x00, 0x9d, 0x60, 0x1e, 0x03, 0x00, + 0x9d, 0x6c, 0x36, 0xce, 0x00, 0x9d, 0xb4, 0x0b, + 0xfd, 0x00, 0x9d, 0xbf, 0x59, 0xde, 0x00, 0x9d, + 0xc0, 0x4f, 0x22, 0x00, 0x9d, 0xc2, 0x4f, 0x23, + 0x00, 0x9d, 0xcf, 0x35, 0x43, 0x00, 0x9e, 0x97, + 0x34, 0xcc, 0x00, 0x9e, 0x9f, 0x34, 0xcb, 0x00, + 0x9e, 0xa5, 0x37, 0xc2, 0x00, 0x9e, 0xaa, 0x1e, + 0xcd, 0x00, 0x9e, 0xad, 0x1f, 0x44, 0x00, 0x9e, + 0xbb, 0x36, 0xdc, 0x00, 0x9e, 0xbf, 0x36, 0xe2, + 0x00, 0x9e, 0xcc, 0x37, 0xc3, 0x00, 0x9e, 0xdb, + 0x1e, 0x31, 0x00, 0x9f, 0x08, 0x35, 0x44, 0x00, + 0x9f, 0x3b, 0x36, 0xa9, 0x00, 0x9f, 0x4a, 0x37, + 0xc5, 0x00, 0x9f, 0x4b, 0x37, 0x5a, 0x00, 0x9f, + 0x4e, 0x35, 0x24, 0x00, 0x9f, 0x67, 0x37, 0xc7, + 0x00, 0x9f, 0x8d, 0x37, 0x06, 0x00, 0x9f, 0x9c, + 0x1e, 0xce, 0x00, 0x9f, 0x9d, 0x1e, 0xa7, 0x00, + 0xfa, 0x11, 0x20, 0xfb, 0x00, 0xfa, 0x24, 0x21, + 0xb8, 0x02, 0x35, 0xc4, 0x3c, 0x44, 0x02, 0x36, + 0x3a, 0x35, 0x9b, 0x02, 0x38, 0x3d, 0x4f, 0x26, + 0x02, 0x42, 0xee, 0x37, 0xc9, 0x02, 0x62, 0x70, + 0x37, 0x6e, 0x02, 0x9d, 0x4b, 0x35, 0x96, 0x02, + 0x9e, 0x3d, 0x3c, 0x4d, 0x02, 0xa6, 0x1a, 0x37, + 0xc8, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x34, 0x02, + 0x35, 0x83, 0x00, 0x50, 0x91, 0x35, 0xaf, 0x00, + 0x50, 0xca, 0x37, 0x15, 0x00, 0x51, 0x54, 0x37, + 0x17, 0x00, 0x51, 0x95, 0x37, 0x18, 0x00, 0x51, + 0xb4, 0x35, 0xdb, 0x00, 0x51, 0xde, 0x38, 0x10, + 0x00, 0x52, 0x72, 0x4e, 0x76, 0x00, 0x53, 0x7f, + 0x1d, 0xed, 0x00, 0x53, 0xa9, 0x1f, 0x1c, 0x00, + 0x55, 0x33, 0x37, 0x21, 0x00, 0x55, 0xa9, 0x34, + 0xd6, 0x00, 0x55, 0xab, 0x4e, 0x7c, 0x00, 0x55, + 0xe4, 0x37, 0x22, 0x00, 0x56, 0xae, 0x4e, 0x7e, + 0x00, 0x57, 0xf4, 0x36, 0x13, 0x00, 0x58, 0x5a, + 0x20, 0xe6, 0x00, 0x59, 0x51, 0x4e, 0x88, 0x00, + 0x59, 0xff, 0x35, 0xe1, 0x00, 0x5a, 0xbe, 0x34, + 0xdc, 0x00, 0x5b, 0xb3, 0x35, 0x6b, 0x00, 0x5c, + 0x0a, 0x36, 0x4e, 0x00, 0x5c, 0x0f, 0x36, 0x0a, + 0x00, 0x5e, 0xca, 0x34, 0x59, 0x00, 0x5e, 0xe3, + 0x4e, 0x93, 0x00, 0x5e, 0xf6, 0x35, 0x56, 0x00, + 0x60, 0x62, 0x4f, 0x2d, 0x00, 0x60, 0x97, 0x37, + 0x30, 0x00, 0x61, 0x67, 0x35, 0xad, 0x00, 0x61, + 0x68, 0x34, 0x6e, 0x00, 0x61, 0xb2, 0x4e, 0x98, + 0x00, 0x61, 0xf2, 0x36, 0x6a, 0x00, 0x62, 0x49, + 0x34, 0xb4, 0x00, 0x66, 0x5f, 0x37, 0x38, 0x00, + 0x66, 0xc1, 0x4e, 0xac, 0x00, 0x67, 0x15, 0x36, + 0x70, 0x00, 0x67, 0x17, 0x21, 0x29, 0x00, 0x67, + 0x1b, 0x36, 0xd5, 0x00, 0x68, 0x5d, 0x36, 0xde, + 0x00, 0x68, 0x7a, 0x36, 0xf1, 0x00, 0x69, 0x0d, + 0x36, 0x15, 0x00, 0x69, 0x82, 0x34, 0x6f, 0x00, + 0x6a, 0xdb, 0x35, 0xa9, 0x00, 0x6b, 0x21, 0x35, + 0xe8, 0x00, 0x6c, 0x08, 0x34, 0xf4, 0x00, 0x6c, + 0xaa, 0x4e, 0xbb, 0x00, 0x6c, 0xbf, 0x34, 0x68, + 0x00, 0x6c, 0xe8, 0x32, 0x45, 0x00, 0x6d, 0x3e, + 0x36, 0x96, 0x00, 0x6e, 0x23, 0x34, 0xf6, 0x00, + 0x6e, 0xa2, 0x52, 0x4f, 0x00, 0x6e, 0xcb, 0x4e, + 0xc1, 0x00, 0x6f, 0x11, 0x37, 0x45, 0x00, 0x6f, + 0x5b, 0x4e, 0xc5, 0x00, 0x71, 0x7d, 0x1f, 0x24, + 0x00, 0x72, 0x35, 0x35, 0xf0, 0x00, 0x73, 0x36, + 0x36, 0xf9, 0x00, 0x73, 0x37, 0x36, 0xfa, 0x00, + 0x73, 0xca, 0x4e, 0xcc, 0x00, 0x75, 0x11, 0x35, + 0xd2, 0x00, 0x75, 0x15, 0x4f, 0x2b, 0x00, 0x79, + 0x53, 0x37, 0x59, 0x00, 0x7a, 0x74, 0x35, 0xb1, + 0x00, 0x7b, 0x08, 0x4f, 0x27, 0x00, 0x7b, 0xc0, + 0x36, 0x37, 0x00, 0x7c, 0x3e, 0x4f, 0x29, 0x00, + 0x7c, 0x50, 0x4e, 0xdb, 0x00, 0x7c, 0x7e, 0x4f, + 0x45, 0x00, 0x7d, 0xb2, 0x4e, 0xde, 0x00, 0x7e, + 0x22, 0x37, 0x66, 0x00, 0x7e, 0x35, 0x37, 0x68, + 0x00, 0x7f, 0xc1, 0x35, 0x5e, 0x00, 0x7f, 0xe1, + 0x4e, 0xe0, 0x00, 0x7f, 0xe9, 0x37, 0x71, 0x00, + 0x7f, 0xfc, 0x37, 0x02, 0x00, 0x81, 0x08, 0x36, + 0xe3, 0x00, 0x82, 0x39, 0x36, 0x3e, 0x00, 0x82, + 0x79, 0x37, 0x76, 0x00, 0x82, 0xbd, 0x34, 0x6b, + 0x00, 0x83, 0xdf, 0x1f, 0x28, 0x00, 0x85, 0x3d, + 0x34, 0xc1, 0x00, 0x86, 0x12, 0x52, 0x51, 0x00, + 0x87, 0xd2, 0x1f, 0x42, 0x00, 0x88, 0x05, 0x4f, + 0x47, 0x00, 0x88, 0x36, 0x37, 0x87, 0x00, 0x8a, + 0x0a, 0x36, 0x25, 0x00, 0x8a, 0x1d, 0x4f, 0x2c, + 0x00, 0x8a, 0x95, 0x36, 0x5d, 0x00, 0x8a, 0xee, + 0x35, 0xe4, 0x00, 0x8b, 0x56, 0x4e, 0xf9, 0x00, + 0x8c, 0xa0, 0x36, 0xb6, 0x00, 0x8c, 0xc7, 0x35, + 0xe6, 0x00, 0x8c, 0xca, 0x4e, 0xff, 0x00, 0x8c, + 0xfc, 0x35, 0xce, 0x00, 0x8f, 0x44, 0x4f, 0x03, + 0x00, 0x8f, 0xc5, 0x4f, 0x04, 0x00, 0x8f, 0xd4, + 0x4f, 0x05, 0x00, 0x90, 0x03, 0x36, 0x87, 0x00, + 0x90, 0x22, 0x34, 0x60, 0x00, 0x90, 0x38, 0x21, + 0xb9, 0x00, 0x90, 0x41, 0x4f, 0x3f, 0x00, 0x90, + 0x42, 0x36, 0x28, 0x00, 0x90, 0x55, 0x35, 0x49, + 0x00, 0x90, 0x75, 0x36, 0x01, 0x00, 0x90, 0x77, + 0x4f, 0x07, 0x00, 0x90, 0x89, 0x37, 0xa1, 0x00, + 0x90, 0x8a, 0x37, 0x9c, 0x00, 0x90, 0xa6, 0x36, + 0xcc, 0x00, 0x90, 0xaa, 0x35, 0xee, 0x00, 0x92, + 0x5b, 0x35, 0x5b, 0x00, 0x96, 0x86, 0x21, 0xee, + 0x00, 0x96, 0x98, 0x4f, 0x13, 0x00, 0x96, 0xa3, + 0x37, 0x0b, 0x00, 0x96, 0xc5, 0x35, 0x67, 0x00, + 0x97, 0x5c, 0x36, 0x32, 0x00, 0x97, 0x60, 0x35, + 0x37, 0x00, 0x97, 0x6d, 0x1f, 0x23, 0x00, 0x97, + 0x71, 0x35, 0x38, 0x00, 0x97, 0xff, 0x35, 0x9e, + 0x00, 0x98, 0xef, 0x4f, 0x25, 0x00, 0x99, 0x0c, + 0x34, 0x65, 0x00, 0x99, 0x45, 0x37, 0xb8, 0x00, + 0x99, 0x57, 0x35, 0x9f, 0x00, 0x9e, 0x9f, 0x37, + 0x0d, 0x00, 0x9f, 0x08, 0x37, 0xc4, 0x00, 0x9f, + 0x8d, 0x37, 0x07, 0x02, 0x36, 0x3a, 0x35, 0x9c, + 0x00, 0x00, 0x00, 0x11, 0x00, 0x51, 0xde, 0x4e, + 0x71, 0x00, 0x53, 0xa9, 0x34, 0x64, 0x00, 0x56, + 0xae, 0x4e, 0x7f, 0x00, 0x5b, 0xb3, 0x4e, 0x8f, + 0x00, 0x61, 0x68, 0x35, 0x6c, 0x00, 0x61, 0xf2, + 0x52, 0x50, 0x00, 0x66, 0x5f, 0x37, 0x39, 0x00, + 0x67, 0x17, 0x37, 0x12, 0x00, 0x69, 0x82, 0x35, + 0x70, 0x00, 0x75, 0x11, 0x4f, 0x3c, 0x00, 0x83, + 0xdf, 0x4e, 0xe9, 0x00, 0x90, 0x77, 0x4f, 0x08, + 0x00, 0x90, 0x89, 0x37, 0xa2, 0x00, 0x90, 0x8a, + 0x37, 0x9d, 0x00, 0x97, 0xff, 0x4f, 0x15, 0x00, + 0x99, 0x0c, 0x35, 0x52, 0x00, 0x99, 0x57, 0x4f, + 0x19, 0x00, 0x00, 0x00, 0x06, 0x00, 0x51, 0xde, + 0x21, 0x5e, 0x00, 0x53, 0xa9, 0x35, 0x4f, 0x00, + 0x61, 0x68, 0x35, 0x6d, 0x00, 0x90, 0x89, 0x37, + 0xa3, 0x00, 0x90, 0x8a, 0x37, 0x9e, 0x00, 0x97, + 0xff, 0x4f, 0x16, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x53, 0xa9, 0x4f, 0x2f, 0x00, 0x61, 0x68, 0x35, + 0x6e, 0x00, 0x90, 0x89, 0x37, 0xa4, 0x00, 0x90, + 0x8a, 0x37, 0x9f, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x90, 0x89, 0x37, 0xa5, 0x00, 0x90, 0x8a, 0x37, + 0xa0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x90, 0x89, + 0x37, 0xa6, 0x00, 0x90, 0x8a, 0x4f, 0x0a, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x90, 0x89, 0x37, 0xa7, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x89, 0x37, + 0xa8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x89, + 0x37, 0xa9, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, + 0x89, 0x37, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x90, 0x89, 0x37, 0xab, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x90, 0x89, 0x37, 0xac, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x90, 0x89, 0x4f, 0x09 + }; diff --git a/src/menu.c b/src/menu.c index bbd0e70fe04..5ca687f3d8a 100644 --- a/src/menu.c +++ b/src/menu.c @@ -1317,7 +1317,7 @@ no quit occurs and `x-popup-menu' returns nil. */) if (current_popup_menu && FRAME_W32_P (f)) { discard_menu_items (); - FRAME_X_DISPLAY_INFO (f)->grabbed = 0; + FRAME_DISPLAY_INFO (f)->grabbed = 0; UNGCPRO; return Qnil; } @@ -1365,7 +1365,7 @@ no quit occurs and `x-popup-menu' returns nil. */) #ifdef HAVE_NTGUI /* FIXME: Is it really w32-specific? --Stef */ if (FRAME_W32_P (f)) - FRAME_X_DISPLAY_INFO (f)->grabbed = 0; + FRAME_DISPLAY_INFO (f)->grabbed = 0; #endif #endif /* HAVE_MENUS */ diff --git a/src/minibuf.c b/src/minibuf.c index 7403fc6c32d..cc6f234f7da 100644 --- a/src/minibuf.c +++ b/src/minibuf.c @@ -672,12 +672,7 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt, XWINDOW (minibuf_window)->cursor.x = 0; XWINDOW (minibuf_window)->must_be_updated_p = 1; update_frame (XFRAME (selected_frame), 1, 1); - { - struct frame *f = XFRAME (XWINDOW (minibuf_window)->frame); - struct redisplay_interface *rif = FRAME_RIF (f); - if (rif && rif->flush_display) - rif->flush_display (f); - } + flush_frame (XFRAME (XWINDOW (minibuf_window)->frame)); } /* Make minibuffer contents into a string. */ diff --git a/src/msdos.c b/src/msdos.c index 5ad227bd67c..2ba7a16a443 100644 --- a/src/msdos.c +++ b/src/msdos.c @@ -408,7 +408,7 @@ static int term_setup_done; static unsigned short outside_cursor; -/* Similar to the_only_frame. */ +/* The only display since MS-DOS does not support multiple ones. */ struct tty_display_info the_only_display_info; /* Support for DOS/V (allows Japanese characters to be displayed on @@ -1222,7 +1222,7 @@ IT_cmgoto (struct frame *f) static void IT_update_begin (struct frame *f) { - struct tty_display_info *display_info = FRAME_X_DISPLAY_INFO (f); + struct tty_display_info *display_info = FRAME_DISPLAY_INFO (f); Mouse_HLInfo *hlinfo = &display_info->mouse_highlight; struct frame *mouse_face_frame = hlinfo->mouse_face_mouse_frame; @@ -1279,7 +1279,7 @@ IT_update_begin (struct frame *f) static void IT_update_end (struct frame *f) { - struct tty_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct tty_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); if (dpyinfo->termscript) fprintf (dpyinfo->termscript, "\n<UPDATE_END\n"); @@ -2387,7 +2387,7 @@ Each input key receives two values in this vector: first the ASCII code, and then the scan code. */) (void) { - Lisp_Object val, *keys = XVECTOR (recent_doskeys)->contents; + Lisp_Object val, *keys = XVECTOR (recent_doskeys)->u.contents; if (total_doskeys < NUM_RECENT_DOSKEYS) return Fvector (total_doskeys, keys); diff --git a/src/msdos.h b/src/msdos.h index 6a6fe349131..27090324b44 100644 --- a/src/msdos.h +++ b/src/msdos.h @@ -63,7 +63,7 @@ extern struct tty_display_info the_only_display_info; #define FRAME_X_DISPLAY(f) ((Display *) 0) #define FRAME_FONT(f) ((f)->output_data.tty->font) -#define FRAME_X_DISPLAY_INFO(f) (&the_only_display_info) +#define FRAME_DISPLAY_INFO(f) (&the_only_display_info) /* Prototypes. */ diff --git a/src/nsfns.m b/src/nsfns.m index fc276c2b12d..93b7d12becb 100644 --- a/src/nsfns.m +++ b/src/nsfns.m @@ -46,6 +46,9 @@ GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu) #ifdef NS_IMPL_COCOA #include <IOKit/graphics/IOGraphicsLib.h> +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 +#include "macfont.h" +#endif #endif #if 0 @@ -124,7 +127,7 @@ check_ns_display_info (Lisp_Object object) struct frame *sf = XFRAME (selected_frame); if (FRAME_NS_P (sf) && FRAME_LIVE_P (sf)) - dpyinfo = FRAME_NS_DISPLAY_INFO (sf); + dpyinfo = FRAME_DISPLAY_INFO (sf); else if (x_display_list != 0) dpyinfo = x_display_list; else @@ -144,7 +147,7 @@ check_ns_display_info (Lisp_Object object) else { struct frame *f = decode_window_system_frame (object); - dpyinfo = FRAME_NS_DISPLAY_INFO (f); + dpyinfo = FRAME_DISPLAY_INFO (f); } return dpyinfo; @@ -992,7 +995,7 @@ unwind_create_frame (Lisp_Object frame) if (NILP (Fmemq (frame, Vframe_list))) { #if defined GLYPH_DEBUG && defined ENABLE_CHECKING - struct ns_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); #endif x_free_frame_resources (f); @@ -1139,9 +1142,9 @@ This function is an internal primitive--use `make-frame' instead. */) if (! STRINGP (f->icon_name)) fset_icon_name (f, Qnil); - FRAME_NS_DISPLAY_INFO (f) = dpyinfo; + FRAME_DISPLAY_INFO (f) = dpyinfo; - /* With FRAME_NS_DISPLAY_INFO set up, this unwind-protect is safe. */ + /* With FRAME_DISPLAY_INFO set up, this unwind-protect is safe. */ record_unwind_protect (unwind_create_frame, frame); f->output_data.ns->window_desc = desc_ctr++; @@ -1152,7 +1155,7 @@ This function is an internal primitive--use `make-frame' instead. */) } else { - f->output_data.ns->parent_desc = FRAME_NS_DISPLAY_INFO (f)->root_window; + f->output_data.ns->parent_desc = FRAME_DISPLAY_INFO (f)->root_window; f->output_data.ns->explicit_parent = 0; } @@ -1171,7 +1174,16 @@ This function is an internal primitive--use `make-frame' instead. */) } block_input (); + +#ifdef NS_IMPL_COCOA +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 + if (CTGetCoreTextVersion != NULL + && CTGetCoreTextVersion () >= kCTVersionNumber10_5) + mac_register_font_driver (f); +#endif +#endif register_font_driver (&nsfont_driver, f); + x_default_parameter (f, parms, Qfont_backend, Qnil, "fontBackend", "FontBackend", RES_TYPE_STRING); @@ -1181,8 +1193,13 @@ This function is an internal primitive--use `make-frame' instead. */) x_default_parameter (f, parms, Qfontsize, make_number (0 /*(int)[font pointSize]*/), "fontSize", "FontSize", RES_TYPE_NUMBER); + // Remove ' Regular', not handled by backends. + char *fontname = xstrdup ([[font displayName] UTF8String]); + int len = strlen (fontname); + if (len > 8 && strcmp (fontname + len - 8, " Regular") == 0) + fontname[len-8] = '\0'; x_default_parameter (f, parms, Qfont, - build_string ([[font fontName] UTF8String]), + build_string (fontname), "font", "Font", RES_TYPE_STRING); } unblock_input (); @@ -1255,7 +1272,7 @@ This function is an internal primitive--use `make-frame' instead. */) f->output_data.ns->hand_cursor = [NSCursor pointingHandCursor]; f->output_data.ns->hourglass_cursor = [NSCursor disappearingItemCursor]; f->output_data.ns->horizontal_drag_cursor = [NSCursor resizeLeftRightCursor]; - FRAME_NS_DISPLAY_INFO (f)->vertical_scroll_bar_cursor + FRAME_DISPLAY_INFO (f)->vertical_scroll_bar_cursor = [NSCursor arrowCursor]; f->output_data.ns->current_pointer = f->output_data.ns->text_cursor; @@ -1339,14 +1356,10 @@ This function is an internal primitive--use `make-frame' instead. */) return unbind_to (count, frame); } - -DEFUN ("x-focus-frame", Fx_focus_frame, Sx_focus_frame, 1, 1, 0, - doc: /* Set the input focus to FRAME. -FRAME nil means use the selected frame. */) - (Lisp_Object frame) +void +x_focus_frame (struct frame *f) { - struct frame *f = decode_window_system_frame (frame); - struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (f); + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); if (dpyinfo->x_focus_frame != f) { @@ -1356,8 +1369,6 @@ FRAME nil means use the selected frame. */) [[view window] makeKeyAndOrderFront: view]; unblock_input (); } - - return Qnil; } @@ -1368,9 +1379,15 @@ DEFUN ("ns-popup-font-panel", Fns_popup_font_panel, Sns_popup_font_panel, { struct frame *f = decode_window_system_frame (frame); id fm = [NSFontManager sharedFontManager]; - - [fm setSelectedFont: ((struct nsfont_info *)f->output_data.ns->font)->nsfont - isMultiple: NO]; + struct font *font = f->output_data.ns->font; + NSFont *nsfont; + if (EQ (font->driver->type, Qns)) + nsfont = ((struct nsfont_info *)font)->nsfont; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 + else + nsfont = (NSFont *) macfont_get_nsctfont (font); +#endif + [fm setSelectedFont: nsfont isMultiple: NO]; [fm orderFrontFontPanel: NSApp]; return Qnil; } @@ -2194,17 +2211,13 @@ x_set_scroll_bar_default_width (struct frame *f) wid - 1) / wid; } - -extern const char *x_get_string_resource (XrmDatabase, char *, char *); - - /* terms impl this instead of x-get-resource directly */ -const char * -x_get_string_resource (XrmDatabase rdb, char *name, char *class) +char * +x_get_string_resource (XrmDatabase rdb, const char *name, const char *class) { /* remove appname prefix; TODO: allow for !="Emacs" */ - char *toCheck = class + (!strncmp (class, "Emacs.", 6) ? 6 : 0); - const char *res; + const char *res, *toCheck = class + (!strncmp (class, "Emacs.", 6) ? 6 : 0); + check_window_system (NULL); if (inhibit_x_resources) @@ -2212,16 +2225,16 @@ x_get_string_resource (XrmDatabase rdb, char *name, char *class) return NULL; res = ns_get_defaults_value (toCheck); - return !res ? NULL : - (!c_strncasecmp (res, "YES", 3) ? "true" : - (!c_strncasecmp (res, "NO", 2) ? "false" : res)); + return (!res ? NULL : + (!c_strncasecmp (res, "YES", 3) ? "true" : + (!c_strncasecmp (res, "NO", 2) ? "false" : (char *) res))); } Lisp_Object x_get_focus_frame (struct frame *frame) { - struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (frame); + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (frame); Lisp_Object nsfocus; if (!dpyinfo->x_focus_frame) @@ -2231,15 +2244,6 @@ x_get_focus_frame (struct frame *frame) return nsfocus; } -void -x_sync (struct frame *f) -{ - /* XXX Not implemented XXX */ - return; -} - - - /* ========================================================================== Lisp definitions that, for whatever reason, we can't alias as 'ns-XXX'. @@ -2560,6 +2564,7 @@ compute_tip_xy (struct frame *f, { Lisp_Object left, top; EmacsView *view = FRAME_NS_VIEW (f); + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); NSPoint pt; /* Start with user-specified or mouse position. */ @@ -2568,7 +2573,8 @@ compute_tip_xy (struct frame *f, if (!INTEGERP (left) || !INTEGERP (top)) { - pt = last_mouse_motion_position; + pt.x = dpyinfo->last_mouse_motion_x; + pt.y = dpyinfo->last_mouse_motion_y; /* Convert to screen coordinates */ pt = [view convertPoint: pt toView: nil]; pt = [[view window] convertBaseToScreen: pt]; @@ -2577,7 +2583,7 @@ compute_tip_xy (struct frame *f, { /* Absolute coordinates. */ pt.x = XINT (left); - pt.y = x_display_pixel_height (FRAME_NS_DISPLAY_INFO (f)) - XINT (top) + pt.y = x_display_pixel_height (FRAME_DISPLAY_INFO (f)) - XINT (top) - height; } @@ -2587,7 +2593,7 @@ compute_tip_xy (struct frame *f, else if (pt.x + XINT (dx) <= 0) *root_x = 0; /* Can happen for negative dx */ else if (pt.x + XINT (dx) + width - <= x_display_pixel_width (FRAME_NS_DISPLAY_INFO (f))) + <= x_display_pixel_width (FRAME_DISPLAY_INFO (f))) /* It fits to the right of the pointer. */ *root_x = pt.x + XINT (dx); else if (width + XINT (dx) <= pt.x) @@ -2603,12 +2609,12 @@ compute_tip_xy (struct frame *f, /* It fits below the pointer. */ *root_y = pt.y - height - XINT (dy); else if (pt.y + XINT (dy) + height - <= x_display_pixel_height (FRAME_NS_DISPLAY_INFO (f))) + <= x_display_pixel_height (FRAME_DISPLAY_INFO (f))) /* It fits above the pointer */ *root_y = pt.y + XINT (dy); else /* Put it on the top. */ - *root_y = x_display_pixel_height (FRAME_NS_DISPLAY_INFO (f)) - height; + *root_y = x_display_pixel_height (FRAME_DISPLAY_INFO (f)) - height; } @@ -2903,7 +2909,6 @@ be used as the image of the icon representing the frame. */); defsubr (&Sns_list_services); defsubr (&Sns_perform_service); defsubr (&Sns_convert_utf8_nfd_to_nfc); - defsubr (&Sx_focus_frame); defsubr (&Sns_popup_font_panel); defsubr (&Sns_popup_color_panel); diff --git a/src/nsfont.m b/src/nsfont.m index e1c7d32dde0..bd9a2acc983 100644 --- a/src/nsfont.m +++ b/src/nsfont.m @@ -51,8 +51,6 @@ static Lisp_Object Qapple, Qroman, Qmedium; static Lisp_Object Qcondensed, Qexpanded; extern Lisp_Object Qappend; extern float ns_antialias_threshold; -extern int ns_tmp_flags; -extern struct nsfont_info *ns_tmp_font; /* font glyph and metrics caching functions, implemented at end */ @@ -528,7 +526,7 @@ static NSSet } if (NSFONT_TRACE) - NSLog(@" returning %d families", [families count]); + NSLog(@" returning %lu families", (unsigned long)[families count]); return families; } @@ -566,8 +564,8 @@ ns_findfonts (Lisp_Object font_spec, BOOL isMatch) matchingDescs = [fdesc matchingFontDescriptorsWithMandatoryKeys: fkeys]; if (NSFONT_TRACE) - NSLog(@"Got desc %@ and found %d matching fonts from it: ", fdesc, - [matchingDescs count]); + NSLog(@"Got desc %@ and found %lu matching fonts from it: ", fdesc, + (unsigned long)[matchingDescs count]); for (dEnum = [matchingDescs objectEnumerator]; (desc = [dEnum nextObject]);) { @@ -662,7 +660,7 @@ struct font_driver nsfont_driver = static Lisp_Object nsfont_get_cache (struct frame *frame) { - Display_Info *dpyinfo = FRAME_NS_DISPLAY_INFO (frame); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (frame); return (dpyinfo->name_list_element); } @@ -798,6 +796,7 @@ nsfont_open (struct frame *f, Lisp_Object font_entity, int pixel_size) font_object = font_make_object (VECSIZE (struct nsfont_info), font_entity, pixel_size); + ASET (font_object, FONT_TYPE_INDEX, nsfont_driver.type); font_info = (struct nsfont_info *) XFONT_OBJECT (font_object); font = (struct font *) font_info; if (!font) @@ -871,10 +870,11 @@ nsfont_open (struct frame *f, Lisp_Object font_entity, int pixel_size) font_info->size = font->pixel_size; /* max bounds */ - font_info->max_bounds.ascent = lrint ([sfont ascender]); + font->ascent = font_info->max_bounds.ascent = lrint ([sfont ascender]); /* Descender is usually negative. Use floor to avoid clipping descenders. */ - font_info->max_bounds.descent = -lrint (floor(adjusted_descender)); + font->descent = + font_info->max_bounds.descent = -lrint (floor(adjusted_descender)); font_info->height = font_info->max_bounds.ascent + font_info->max_bounds.descent; font_info->max_bounds.width = lrint (font_info->width); @@ -1051,16 +1051,26 @@ nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, #endif struct face *face; NSRect r; - struct nsfont_info *font = ns_tmp_font; + struct nsfont_info *font; NSColor *col, *bgCol; unsigned short *t = s->char2b; - int i, len; + int i, len, flags; char isComposite = s->first_glyph->type == COMPOSITE_GLYPH; int end = isComposite ? s->cmp_to : s->nchars; block_input (); + + font = (struct nsfont_info *)s->face->font; + if (font == NULL) + font = (struct nsfont_info *)FRAME_FONT (s->f); + /* Select face based on input flags */ - switch (ns_tmp_flags) + flags = s->hl == DRAW_CURSOR ? NS_DUMPGLYPH_CURSOR : + (s->hl == DRAW_MOUSE_FACE ? NS_DUMPGLYPH_MOUSEFACE : + (s->for_overlaps ? NS_DUMPGLYPH_FOREGROUND : + NS_DUMPGLYPH_NORMAL)); + + switch (flags) { case NS_DUMPGLYPH_CURSOR: face = s->face; @@ -1175,7 +1185,7 @@ nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, : FRAME_BACKGROUND_COLOR (s->f)) set]; else { - struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (s->f); + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (s->f); [[dpyinfo->bitmaps[face->stipple-1].img stippleMask] set]; } NSRectFill (br); @@ -1188,8 +1198,8 @@ nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, col = (NS_FACE_FOREGROUND (face) != 0 ? ns_lookup_indexed_color (NS_FACE_FOREGROUND (face), s->f) : FRAME_FOREGROUND_COLOR (s->f)); - /* FIXME: find another way to pass this */ - bgCol = (ns_tmp_flags != NS_DUMPGLYPH_FOREGROUND ? nil + + bgCol = (flags != NS_DUMPGLYPH_FOREGROUND ? nil : (NS_FACE_BACKGROUND (face) != 0 ? ns_lookup_indexed_color (NS_FACE_BACKGROUND (face), s->f) : FRAME_BACKGROUND_COLOR (s->f))); @@ -1239,7 +1249,9 @@ nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, CGContextSaveGState (gcontext); - fliptf.c = font->synthItal ? Fix2X (kATSItalicQDSkew) : 0.0; + // Used to be Fix2X (kATSItalicQDSkew), but Fix2X is deprecated + // and kATSItalicQDSkew is 0.25. + fliptf.c = font->synthItal ? 0.25 : 0.0; CGContextSetFont (gcontext, font->cgfont); CGContextSetFontSize (gcontext, font->size); @@ -1264,22 +1276,19 @@ nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, CGContextSetTextPosition (gcontext, r.origin.x, r.origin.y); CGContextShowGlyphsWithAdvances (gcontext, s->char2b + s->cmp_from, - advances, len); + advances, len); if (face->overstrike) { CGContextSetTextPosition (gcontext, r.origin.x+0.5, r.origin.y); CGContextShowGlyphsWithAdvances (gcontext, s->char2b + s->cmp_from, - advances, len); + advances, len); } CGContextRestoreGState (gcontext); } #endif /* NS_IMPL_COCOA */ - /* Draw underline, overline, strike-through. */ - ns_draw_text_decoration (s, face, col, r.size.width, r.origin.x); - unblock_input (); return to-from; } diff --git a/src/nsmenu.m b/src/nsmenu.m index 697329df675..3ed1734d222 100644 --- a/src/nsmenu.m +++ b/src/nsmenu.m @@ -1242,7 +1242,7 @@ update_frame_tool_bar (struct frame *f) { /* 1) come up w/identifier */ NSString *identifier - = [NSString stringWithFormat: @"%u", [img hash]]; + = [NSString stringWithFormat: @"%lu", (unsigned long)[img hash]]; [activeIdentifiers addObject: identifier]; /* 2) create / reuse item */ diff --git a/src/nsterm.h b/src/nsterm.h index 4e07d796250..9f7767b312e 100644 --- a/src/nsterm.h +++ b/src/nsterm.h @@ -597,6 +597,30 @@ struct ns_display_info struct frame *x_highlight_frame; struct frame *x_focus_frame; + + /* The frame where the mouse was last time we reported a mouse event. */ + struct frame *last_mouse_frame; + + /* The frame where the mouse was last time we reported a mouse motion. */ + struct frame *last_mouse_motion_frame; + + /* Position where the mouse was last time we reported a motion. + This is a position on last_mouse_motion_frame. */ + int last_mouse_motion_x; + int last_mouse_motion_y; + + /* Where the mouse was last time we reported a mouse position. */ + NSRect last_mouse_glyph; + + /* Time of last mouse movement. */ + Time last_mouse_movement_time; + + /* The scroll bar in which the last motion event occurred. */ +#ifdef __OBJC__ + EmacsScroller *last_mouse_scroll_bar; +#else + void *last_mouse_scroll_bar; +#endif }; /* This is a chain of structures for all the NS displays currently in use. */ @@ -605,8 +629,6 @@ extern struct ns_display_info *x_display_list; extern Lisp_Object ns_display_name_list; extern struct ns_display_info *ns_display_info_for_name (Lisp_Object name); -struct ns_display_info *check_x_display_info (Lisp_Object frame); - struct ns_output { #ifdef __OBJC__ @@ -678,9 +700,7 @@ struct x_output /* This gives the ns_display_info structure for the display F is on. */ -#define FRAME_NS_DISPLAY_INFO(f) ((f)->output_data.ns->display_info) -/* the primacy of X must be constantly worked with... */ -#define FRAME_X_DISPLAY_INFO(f) ((f)->output_data.ns->display_info) +#define FRAME_DISPLAY_INFO(f) ((f)->output_data.ns->display_info) #define FRAME_X_OUTPUT(f) ((f)->output_data.ns) #define FRAME_NS_WINDOW(f) ((f)->output_data.ns->window_desc) #define FRAME_X_WINDOW(f) ((f)->output_data.ns->window_desc) @@ -689,12 +709,12 @@ struct x_output #define FRAME_NS_DISPLAY(f) (0) #define FRAME_X_DISPLAY(f) (0) #define FRAME_X_SCREEN(f) (0) -#define FRAME_X_VISUAL(f) FRAME_NS_DISPLAY_INFO(f)->visual +#define FRAME_X_VISUAL(f) FRAME_DISPLAY_INFO(f)->visual #define FRAME_FOREGROUND_COLOR(f) ((f)->output_data.ns->foreground_color) #define FRAME_BACKGROUND_COLOR(f) ((f)->output_data.ns->background_color) -#define FRAME_X_IMAGE_CACHE(F) FRAME_NS_DISPLAY_INFO ((F))->image_cache +#define FRAME_X_IMAGE_CACHE(F) FRAME_DISPLAY_INFO ((F))->image_cache #define NS_FACE_FOREGROUND(f) ((f)->foreground) #define NS_FACE_BACKGROUND(f) ((f)->background) @@ -703,10 +723,8 @@ struct x_output #define FONT_WIDTH(f) ((f)->max_width) #define FONT_HEIGHT(f) ((f)->height) -/*#define FONT_BASE(f) ((f)->ascent) */ -#define FONT_BASE(f) (((struct nsfont_info *)f)->max_bounds.ascent) -/*#define FONT_DESCENT(f) ((f)->descent) */ -#define FONT_DESCENT(f) (((struct nsfont_info *)f)->max_bounds.descent) +#define FONT_BASE(f) ((f)->ascent) +#define FONT_DESCENT(f) ((f)->descent) #define FRAME_DEFAULT_FACE(f) FACE_FROM_ID (f, DEFAULT_FACE_ID) @@ -744,14 +762,10 @@ struct x_output #define NS_TOP_POS(f) ((f)->top_pos) #endif -#define FRAME_NS_FONT_TABLE(f) (FRAME_NS_DISPLAY_INFO (f)->font_table) +#define FRAME_NS_FONT_TABLE(f) (FRAME_DISPLAY_INFO (f)->font_table) #define FRAME_FONTSET(f) ((f)->output_data.ns->fontset) -#define FRAME_SMALLEST_CHAR_WIDTH(f) \ - (FRAME_NS_DISPLAY_INFO (f)->smallest_char_width) -#define FRAME_SMALLEST_FONT_HEIGHT(f) \ - (FRAME_NS_DISPLAY_INFO (f)->smallest_font_height) #define FRAME_BASELINE_OFFSET(f) ((f)->output_data.ns->baseline_offset) #define BLACK_PIX_DEFAULT(f) 0x000000 #define WHITE_PIX_DEFAULT(f) 0xFFFFFF @@ -876,7 +890,6 @@ extern int ns_select (int nfds, fd_set *readfds, fd_set *writefds, sigset_t const *sigmask); extern unsigned long ns_get_rgb_color (struct frame *f, float r, float g, float b, float a); -extern NSPoint last_mouse_motion_position; /* From nsterm.m, needed in nsfont.m. */ #ifdef __OBJC__ @@ -906,8 +919,4 @@ extern char gnustep_base_version[]; /* version tracking */ ? (min) : (((x)>(max)) ? (max) : (x))) #define SCREENMAXBOUND(x) (IN_BOUND (-SCREENMAX, x, SCREENMAX)) -/* needed somewhere... */ -#define VERTICAL_SCROLL_BAR_WIDTH_TRIM (0) - - #endif /* HAVE_NS */ diff --git a/src/nsterm.m b/src/nsterm.m index 31053ca7a0d..65c67eb9b56 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -64,6 +64,12 @@ GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu) #include "process.h" #endif +#ifdef NS_IMPL_COCOA +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 +#include "macfont.h" +#endif +#endif + /* call tracing */ #if 0 int term_trace_num = 0; @@ -185,11 +191,6 @@ Lisp_Object ns_display_name_list; long context_menu_value = 0; /* display update */ -NSPoint last_mouse_motion_position; -static NSRect last_mouse_glyph; -static Time last_mouse_movement_time = 0; -static Lisp_Object last_mouse_motion_frame; -static EmacsScroller *last_mouse_scroll_bar = nil; static struct frame *ns_updating_frame; static NSView *focus_view = NULL; static int ns_window_num = 0; @@ -198,8 +199,6 @@ static NSRect uRect; #endif static BOOL gsaved = NO; static BOOL ns_fake_keydown = NO; -int ns_tmp_flags; /* FIXME */ -struct nsfont_info *ns_tmp_font; /* FIXME */ #ifdef NS_IMPL_COCOA static BOOL ns_menu_bar_is_hidden = NO; #endif @@ -801,18 +800,6 @@ ns_update_end (struct frame *f) NSTRACE (ns_update_end); } - -static void -ns_flush (struct frame *f) -/* -------------------------------------------------------------------------- - external (RIF) call - NS impl is no-op since currently we flush in ns_update_end and elsewhere - -------------------------------------------------------------------------- */ -{ - NSTRACE (ns_flush); -} - - static void ns_focus (struct frame *f, NSRect *r, int n) /* -------------------------------------------------------------------------- @@ -1019,7 +1006,7 @@ ns_frame_rehighlight (struct frame *frame) External (hook): called on things like window switching within frame -------------------------------------------------------------------------- */ { - struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (frame); + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (frame); struct frame *old_highlight = dpyinfo->x_highlight_frame; NSTRACE (ns_frame_rehighlight); @@ -1116,7 +1103,7 @@ x_iconify_frame (struct frame *f) NSTRACE (x_iconify_frame); check_window_system (f); view = FRAME_NS_VIEW (f); - dpyinfo = FRAME_NS_DISPLAY_INFO (f); + dpyinfo = FRAME_DISPLAY_INFO (f); if (dpyinfo->x_highlight_frame == f) dpyinfo->x_highlight_frame = 0; @@ -1148,7 +1135,7 @@ x_free_frame_resources (struct frame *f) NSTRACE (x_free_frame_resources); check_window_system (f); view = FRAME_NS_VIEW (f); - dpyinfo = FRAME_NS_DISPLAY_INFO (f); + dpyinfo = FRAME_DISPLAY_INFO (f); hlinfo = MOUSE_HL_INFO (f); [(EmacsView *)view setWindowClosing: YES]; /* may not have been informed */ @@ -1368,7 +1355,7 @@ ns_fullscreen_hook (struct frame *f) NSColor * ns_lookup_indexed_color (unsigned long idx, struct frame *f) { - struct ns_color_table *color_table = FRAME_NS_DISPLAY_INFO (f)->color_table; + struct ns_color_table *color_table = FRAME_DISPLAY_INFO (f)->color_table; if (idx < 1 || idx >= color_table->avail) return nil; return color_table->colors[idx]; @@ -1378,7 +1365,7 @@ ns_lookup_indexed_color (unsigned long idx, struct frame *f) unsigned long ns_index_color (NSColor *color, struct frame *f) { - struct ns_color_table *color_table = FRAME_NS_DISPLAY_INFO (f)->color_table; + struct ns_color_table *color_table = FRAME_DISPLAY_INFO (f)->color_table; ptrdiff_t idx; ptrdiff_t i; @@ -1428,7 +1415,7 @@ ns_free_indexed_color (unsigned long idx, struct frame *f) if (!f) return; - color_table = FRAME_NS_DISPLAY_INFO (f)->color_table; + color_table = FRAME_DISPLAY_INFO (f)->color_table; if (idx <= 0 || idx >= color_table->size) { message1 ("ns_free_indexed_color: Color index out of range.\n"); @@ -1663,7 +1650,7 @@ x_set_frame_alpha (struct frame *f) change the entire-frame transparency -------------------------------------------------------------------------- */ { - struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (f); + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); double alpha = 1.0; double alpha_min = 1.0; @@ -1748,24 +1735,26 @@ note_mouse_movement (struct frame *frame, CGFloat x, CGFloat y) known as last_mouse_glyph. ------------------------------------------------------------------------ */ { + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (frame); + NSRect *r; + // NSTRACE (note_mouse_movement); - XSETFRAME (last_mouse_motion_frame, frame); + dpyinfo->last_mouse_motion_frame = frame; + r = &dpyinfo->last_mouse_glyph; /* Note, this doesn't get called for enter/leave, since we don't have a position. Those are taken care of in the corresponding NSView methods. */ /* has movement gone beyond last rect we were tracking? */ - if (x < last_mouse_glyph.origin.x || - x >= (last_mouse_glyph.origin.x + last_mouse_glyph.size.width) || - y < last_mouse_glyph.origin.y || - y >= (last_mouse_glyph.origin.y + last_mouse_glyph.size.height)) + if (x < r->origin.x || x >= r->origin.x + r->size.width + || y < r->origin.y || y >= r->origin.y + r->size.height) { - ns_update_begin(frame); + ns_update_begin (frame); frame->mouse_moved = 1; note_mouse_highlight (frame, x, y); - remember_mouse_glyph (frame, x, y, &last_mouse_glyph); - ns_update_end(frame); + remember_mouse_glyph (frame, x, y, r); + ns_update_end (frame); return 1; } @@ -1798,18 +1787,19 @@ ns_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, return; } - dpyinfo = FRAME_NS_DISPLAY_INFO (*fp); + dpyinfo = FRAME_DISPLAY_INFO (*fp); block_input (); - if (last_mouse_scroll_bar != nil && insist == 0) + if (dpyinfo->last_mouse_scroll_bar != nil && insist == 0) { /* TODO: we do not use this path at the moment because drag events will go directly to the EmacsScroller. Leaving code in for now. */ - [last_mouse_scroll_bar getMouseMotionPart: (int *)part window: bar_window - x: x y: y]; - if (time) *time = last_mouse_movement_time; - last_mouse_scroll_bar = nil; + [dpyinfo->last_mouse_scroll_bar + getMouseMotionPart: (int *)part window: bar_window x: x y: y]; + if (time) + *time = dpyinfo->last_mouse_movement_time; + dpyinfo->last_mouse_scroll_bar = nil; } else { @@ -1819,9 +1809,10 @@ ns_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, && FRAME_NS_DISPLAY (XFRAME (frame)) == FRAME_NS_DISPLAY (*fp)) XFRAME (frame)->mouse_moved = 0; - last_mouse_scroll_bar = nil; - if (last_mouse_frame && FRAME_LIVE_P (last_mouse_frame)) - f = last_mouse_frame; + dpyinfo->last_mouse_scroll_bar = nil; + if (dpyinfo->last_mouse_frame + && FRAME_LIVE_P (dpyinfo->last_mouse_frame)) + f = dpyinfo->last_mouse_frame; else f = dpyinfo->x_focus_frame ? dpyinfo->x_focus_frame : SELECTED_FRAME (); @@ -1832,7 +1823,8 @@ ns_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, position = [[view window] mouseLocationOutsideOfEventStream]; position = [view convertPoint: position fromView: nil]; - remember_mouse_glyph (f, position.x, position.y, &last_mouse_glyph); + remember_mouse_glyph (f, position.x, position.y, + &dpyinfo->last_mouse_glyph); /*fprintf (stderr, "ns_mouse_position: %.0f, %.0f\n", position.x, position.y); */ if (bar_window) *bar_window = Qnil; @@ -1840,7 +1832,8 @@ ns_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, if (x) XSETINT (*x, lrint (position.x)); if (y) XSETINT (*y, lrint (position.y)); - if (time) *time = last_mouse_movement_time; + if (time) + *time = dpyinfo->last_mouse_movement_time; *fp = f; } } @@ -2170,8 +2163,11 @@ ns_compute_glyph_string_overhangs (struct glyph_string *s) else { s->left_overhang = 0; - s->right_overhang = ((struct nsfont_info *)font)->ital ? - FONT_HEIGHT (font) * 0.2 : 0; + if (EQ (font->driver->type, Qns)) + s->right_overhang = ((struct nsfont_info *)font)->ital ? + FONT_HEIGHT (font) * 0.2 : 0; + else + s->right_overhang = 0; } } @@ -2889,7 +2885,7 @@ ns_maybe_dumpglyphs_background (struct glyph_string *s, char force_p) : FRAME_BACKGROUND_COLOR (s->f)) set]; else { - struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (s->f); + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (s->f); [[dpyinfo->bitmaps[face->stipple-1].img stippleMask] set]; } @@ -3145,8 +3141,10 @@ ns_draw_glyph_string (struct glyph_string *s) { /* TODO (optimize): focus for box and contents draw */ NSRect r[2]; - int n; + int n, flags; char box_drawn_p = 0; + struct font *font = s->face->font; + if (! font) font = FRAME_FONT (s->f); NSTRACE (ns_draw_glyph_string); @@ -3213,13 +3211,10 @@ ns_draw_glyph_string (struct glyph_string *s) ns_maybe_dumpglyphs_background (s, s->first_glyph->type == COMPOSITE_GLYPH); - ns_tmp_flags = s->hl == DRAW_CURSOR ? NS_DUMPGLYPH_CURSOR : - (s->hl == DRAW_MOUSE_FACE ? NS_DUMPGLYPH_MOUSEFACE : - (s->for_overlaps ? NS_DUMPGLYPH_FOREGROUND : - NS_DUMPGLYPH_NORMAL)); - ns_tmp_font = (struct nsfont_info *)s->face->font; - if (ns_tmp_font == NULL) - ns_tmp_font = (struct nsfont_info *)FRAME_FONT (s->f); + flags = s->hl == DRAW_CURSOR ? NS_DUMPGLYPH_CURSOR : + (s->hl == DRAW_MOUSE_FACE ? NS_DUMPGLYPH_MOUSEFACE : + (s->for_overlaps ? NS_DUMPGLYPH_FOREGROUND : + NS_DUMPGLYPH_NORMAL)); if (s->hl == DRAW_CURSOR && s->w->phys_cursor_type == FILLED_BOX_CURSOR) { @@ -3228,10 +3223,21 @@ ns_draw_glyph_string (struct glyph_string *s) NS_FACE_FOREGROUND (s->face) = tmp; } - ns_tmp_font->font.driver->draw + font->driver->draw (s, 0, s->nchars, s->x, s->y, - (ns_tmp_flags == NS_DUMPGLYPH_NORMAL && !s->background_filled_p) - || ns_tmp_flags == NS_DUMPGLYPH_MOUSEFACE); + (flags == NS_DUMPGLYPH_NORMAL && !s->background_filled_p) + || flags == NS_DUMPGLYPH_MOUSEFACE); + + { + NSColor *col = (NS_FACE_FOREGROUND (s->face) != 0 + ? ns_lookup_indexed_color (NS_FACE_FOREGROUND (s->face), + s->f) + : FRAME_FOREGROUND_COLOR (s->f)); + [col set]; + + /* Draw underline, overline, strike-through. */ + ns_draw_text_decoration (s, s->face, col, s->width, s->x); + } if (s->hl == DRAW_CURSOR && s->w->phys_cursor_type == FILLED_BOX_CURSOR) { @@ -3963,8 +3969,7 @@ static struct redisplay_interface ns_redisplay_interface = ns_after_update_window_line, ns_update_window_begin, ns_update_window_end, - ns_flush, - 0, /* flush_display_optional */ + 0, /* flush_display */ x_clear_window_mouse_face, x_get_glyph_overhangs, x_fix_overlapping_area, @@ -3972,7 +3977,7 @@ static struct redisplay_interface ns_redisplay_interface = 0, /* define_fringe_bitmap */ /* FIXME: simplify ns_draw_fringe_bitmap */ 0, /* destroy_fringe_bitmap */ ns_compute_glyph_string_overhangs, - ns_draw_glyph_string, /* interface to nsfont.m */ + ns_draw_glyph_string, ns_define_frame_cursor, ns_clear_frame_area, ns_draw_window_cursor, @@ -4822,17 +4827,26 @@ not_in_argv (NSString *arg) /* called on font panel selection */ - (void)changeFont: (id)sender { - NSEvent *e =[[self window] currentEvent]; - struct face *face =FRAME_DEFAULT_FACE (emacsframe); + NSEvent *e = [[self window] currentEvent]; + struct face *face = FRAME_DEFAULT_FACE (emacsframe); + struct font *font = face->font; id newFont; CGFloat size; + NSFont *nsfont; NSTRACE (changeFont); + if (!emacs_event) return; - if ((newFont = [sender convertFont: - ((struct nsfont_info *)face->font)->nsfont])) + if (EQ (font->driver->type, Qns)) + nsfont = ((struct nsfont_info *)font)->nsfont; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 + else + nsfont = (NSFont *) macfont_get_nsctfont (font); +#endif + + if ((newFont = [sender convertFont: nsfont])) { SET_FRAME_GARBAGED (emacsframe); /* now needed as of 2008/10 */ @@ -5194,8 +5208,10 @@ not_in_argv (NSString *arg) NSString *str = [aString respondsToSelector: @selector (string)] ? [aString string] : aString; if (NS_KEYLOG) - NSLog (@"setMarkedText '%@' len =%d range %d from %d", str, [str length], - selRange.length, selRange.location); + NSLog (@"setMarkedText '%@' len =%lu range %lu from %lu", + str, (unsigned long)[str length], + (unsigned long)selRange.length, + (unsigned long)selRange.location); if (workingText != nil) [self deleteWorkingText]; @@ -5221,7 +5237,7 @@ not_in_argv (NSString *arg) if (workingText == nil) return; if (NS_KEYLOG) - NSLog(@"deleteWorkingText len =%d\n", [workingText length]); + NSLog(@"deleteWorkingText len =%lu\n", (unsigned long)[workingText length]); [workingText release]; workingText = nil; processingCompose = NO; @@ -5349,6 +5365,7 @@ not_in_argv (NSString *arg) /* This is what happens when the user presses a mouse button. */ - (void)mouseDown: (NSEvent *)theEvent { + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (emacsframe); NSPoint p = [self convertPoint: [theEvent locationInWindow] fromView: nil]; NSTRACE (mouseDown); @@ -5358,10 +5375,10 @@ not_in_argv (NSString *arg) if (!emacs_event) return; - last_mouse_frame = emacsframe; + dpyinfo->last_mouse_frame = emacsframe; /* appears to be needed to prevent spurious movement events generated on button clicks */ - last_mouse_frame->mouse_moved = 0; + emacsframe->mouse_moved = 0; if ([theEvent type] == NSScrollWheel) { @@ -5433,13 +5450,16 @@ not_in_argv (NSString *arg) - (void)mouseMoved: (NSEvent *)e { Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (emacsframe); + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (emacsframe); Lisp_Object frame; + NSPoint pt; // NSTRACE (mouseMoved); - last_mouse_movement_time = EV_TIMESTAMP (e); - last_mouse_motion_position - = [self convertPoint: [e locationInWindow] fromView: nil]; + dpyinfo->last_mouse_movement_time = EV_TIMESTAMP (e); + pt = [self convertPoint: [e locationInWindow] fromView: nil]; + dpyinfo->last_mouse_motion_x = pt.x; + dpyinfo->last_mouse_motion_y = pt.y; /* update any mouse face */ if (hlinfo->mouse_face_hidden) @@ -5456,9 +5476,8 @@ not_in_argv (NSString *arg) { NSTRACE (mouse_autoselect_window); static Lisp_Object last_mouse_window; - Lisp_Object window = window_from_coordinates - (emacsframe, last_mouse_motion_position.x, - last_mouse_motion_position.y, 0, 0); + Lisp_Object window + = window_from_coordinates (emacsframe, pt.x, pt.y, 0, 0); if (WINDOWP (window) && !EQ (window, last_mouse_window) @@ -5476,8 +5495,7 @@ not_in_argv (NSString *arg) last_mouse_window = window; } - if (!note_mouse_movement (emacsframe, last_mouse_motion_position.x, - last_mouse_motion_position.y)) + if (!note_mouse_movement (emacsframe, pt.x, pt.y)) help_echo_string = previous_help_echo_string; XSETFRAME (frame, emacsframe); @@ -5718,7 +5736,7 @@ if (cols > 0 && rows > 0) - (void)windowDidBecomeKey: (NSNotification *)notification /* cf. x_detect_focus_change(), x_focus_changed(), x_new_focus_frame() */ { - struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (emacsframe); + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (emacsframe); struct frame *old_focus = dpyinfo->x_focus_frame; NSTRACE (windowDidBecomeKey); @@ -5739,7 +5757,7 @@ if (cols > 0 && rows > 0) - (void)windowDidResignKey: (NSNotification *)notification /* cf. x_detect_focus_change(), x_focus_changed(), x_new_focus_frame() */ { - struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (emacsframe); + struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (emacsframe); BOOL is_focus_frame = dpyinfo->x_focus_frame == emacsframe; NSTRACE (windowDidResignKey); @@ -6322,7 +6340,9 @@ if (cols > 0 && rows > 0) - (void)mouseEntered: (NSEvent *)theEvent { NSTRACE (mouseEntered); - last_mouse_movement_time = EV_TIMESTAMP (theEvent); + if (emacsframe) + FRAME_DISPLAY_INFO (emacsframe)->last_mouse_movement_time + = EV_TIMESTAMP (theEvent); } @@ -6335,7 +6355,8 @@ if (cols > 0 && rows > 0) if (!hlinfo) return; - last_mouse_movement_time = EV_TIMESTAMP (theEvent); + FRAME_DISPLAY_INFO (emacsframe)->last_mouse_movement_time + = EV_TIMESTAMP (theEvent); if (emacsframe == hlinfo->mouse_face_mouse_frame) { @@ -7401,9 +7422,6 @@ allowing it to be used at a lower level for accented character entry."); staticpro (&ns_display_name_list); ns_display_name_list = Qnil; - staticpro (&last_mouse_motion_frame); - last_mouse_motion_frame = Qnil; - DEFVAR_LISP ("ns-auto-hide-menu-bar", ns_auto_hide_menu_bar, doc: /* Non-nil means that the menu bar is hidden, but appears when the mouse is near. Only works on OSX 10.6 or later. */); @@ -7446,6 +7464,14 @@ variable `x-use-underline-position-properties', which is usually at the baseline level. The default value is nil. */); x_underline_at_descent_line = 0; - /* Tell emacs about this window system. */ - Fprovide (intern ("ns"), Qnil); + /* Tell Emacs about this window system. */ + Fprovide (Qns, Qnil); + + syms_of_nsfont (); +#ifdef NS_IMPL_COCOA +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1050 + syms_of_macfont (); +#endif +#endif + } diff --git a/src/process.c b/src/process.c index 20f84990d6f..2ed8a690193 100644 --- a/src/process.c +++ b/src/process.c @@ -21,8 +21,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> -#define PROCESS_INLINE EXTERN_INLINE - #include <stdio.h> #include <errno.h> #include <sys/types.h> /* Some typedefs are used in sys/file.h. */ @@ -1335,15 +1333,15 @@ Returns nil if format of ADDRESS is invalid. */) for (i = 0; i < nargs; i++) { - if (! RANGED_INTEGERP (0, p->contents[i], 65535)) + if (! RANGED_INTEGERP (0, p->u.contents[i], 65535)) return Qnil; if (nargs <= 5 /* IPv4 */ && i < 4 /* host, not port */ - && XINT (p->contents[i]) > 255) + && XINT (p->u.contents[i]) > 255) return Qnil; - args[i+1] = p->contents[i]; + args[i+1] = p->u.contents[i]; } return Fformat (nargs+1, args); @@ -1982,7 +1980,7 @@ conv_sockaddr_to_lisp (struct sockaddr *sa, int len) len = sizeof (sin->sin_addr) + 1; address = Fmake_vector (make_number (len), Qnil); p = XVECTOR (address); - p->contents[--len] = make_number (ntohs (sin->sin_port)); + p->u.contents[--len] = make_number (ntohs (sin->sin_port)); cp = (unsigned char *) &sin->sin_addr; break; } @@ -1994,9 +1992,9 @@ conv_sockaddr_to_lisp (struct sockaddr *sa, int len) len = sizeof (sin6->sin6_addr)/2 + 1; address = Fmake_vector (make_number (len), Qnil); p = XVECTOR (address); - p->contents[--len] = make_number (ntohs (sin6->sin6_port)); + p->u.contents[--len] = make_number (ntohs (sin6->sin6_port)); for (i = 0; i < len; i++) - p->contents[i] = make_number (ntohs (ip6[i])); + p->u.contents[i] = make_number (ntohs (ip6[i])); return address; } #endif @@ -2021,7 +2019,7 @@ conv_sockaddr_to_lisp (struct sockaddr *sa, int len) i = 0; while (i < len) - p->contents[i++] = make_number (*cp++); + p->u.contents[i++] = make_number (*cp++); return address; } @@ -2092,7 +2090,7 @@ conv_lisp_to_sockaddr (int family, Lisp_Object address, struct sockaddr *sa, int { struct sockaddr_in *sin = (struct sockaddr_in *) sa; len = sizeof (sin->sin_addr) + 1; - hostport = XINT (p->contents[--len]); + hostport = XINT (p->u.contents[--len]); sin->sin_port = htons (hostport); cp = (unsigned char *)&sin->sin_addr; sa->sa_family = family; @@ -2103,12 +2101,12 @@ conv_lisp_to_sockaddr (int family, Lisp_Object address, struct sockaddr *sa, int struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa; uint16_t *ip6 = (uint16_t *)&sin6->sin6_addr; len = sizeof (sin6->sin6_addr) + 1; - hostport = XINT (p->contents[--len]); + hostport = XINT (p->u.contents[--len]); sin6->sin6_port = htons (hostport); for (i = 0; i < len; i++) - if (INTEGERP (p->contents[i])) + if (INTEGERP (p->u.contents[i])) { - int j = XFASTINT (p->contents[i]) & 0xffff; + int j = XFASTINT (p->u.contents[i]) & 0xffff; ip6[i] = ntohs (j); } sa->sa_family = family; @@ -2139,8 +2137,8 @@ conv_lisp_to_sockaddr (int family, Lisp_Object address, struct sockaddr *sa, int } for (i = 0; i < len; i++) - if (INTEGERP (p->contents[i])) - *cp++ = XFASTINT (p->contents[i]) & 0xff; + if (INTEGERP (p->u.contents[i])) + *cp++ = XFASTINT (p->u.contents[i]) & 0xff; } #ifdef DATAGRAM_SOCKETS @@ -3731,7 +3729,7 @@ FLAGS is the current flags of the interface. */) any = 1; for (n = 0; n < 6; n++) - p->contents[n] = make_number (((unsigned char *)&rq.ifr_hwaddr.sa_data[0])[n]); + p->u.contents[n] = make_number (((unsigned char *)&rq.ifr_hwaddr.sa_data[0])[n]); elt = Fcons (make_number (rq.ifr_hwaddr.sa_family), hwaddr); } #elif defined (HAVE_GETIFADDRS) && defined (LLADDR) @@ -3754,7 +3752,7 @@ FLAGS is the current flags of the interface. */) memcpy (linkaddr, LLADDR (sdl), sdl->sdl_alen); for (n = 0; n < 6; n++) - p->contents[n] = make_number (linkaddr[n]); + p->u.contents[n] = make_number (linkaddr[n]); elt = Fcons (make_number (it->ifa_addr->sa_family), hwaddr); break; @@ -4849,7 +4847,7 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd, #else { struct sockaddr pname; - int pnamelen = sizeof (pname); + socklen_t pnamelen = sizeof (pname); /* If connection failed, getpeername will fail. */ xerrno = 0; diff --git a/src/process.h b/src/process.h index 6aff95686a2..a9b15f03da4 100644 --- a/src/process.h +++ b/src/process.h @@ -27,9 +27,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #endif INLINE_HEADER_BEGIN -#ifndef PROCESS_INLINE -# define PROCESS_INLINE INLINE -#endif /* Bound on number of file descriptors opened on behalf of a process, that need to be closed. */ @@ -179,14 +176,14 @@ struct Lisp_Process /* Most code should use these functions to set Lisp fields in struct process. */ -PROCESS_INLINE void +INLINE void pset_childp (struct Lisp_Process *p, Lisp_Object val) { p->childp = val; } #ifdef HAVE_GNUTLS -PROCESS_INLINE void +INLINE void pset_gnutls_cred_type (struct Lisp_Process *p, Lisp_Object val) { p->gnutls_cred_type = val; diff --git a/src/ralloc.c b/src/ralloc.c index 5f25ef2c320..5b7d6a512d7 100644 --- a/src/ralloc.c +++ b/src/ralloc.c @@ -85,7 +85,7 @@ static int extra_bytes; /* Macros for rounding. Note that rounding to any value is possible by changing the definition of PAGE. */ #define PAGE (getpagesize ()) -#define ROUNDUP(size) (((size_t) (size) + page_size - 1) \ +#define PAGE_ROUNDUP(size) (((size_t) (size) + page_size - 1) \ & ~((size_t) (page_size - 1))) #define MEM_ALIGN sizeof (double) @@ -281,7 +281,7 @@ obtain (void *address, size_t size) Get some extra, so we can come here less often. */ get = size + extra_bytes - already_available; - get = (char *) ROUNDUP ((char *) last_heap->end + get) + get = (char *) PAGE_ROUNDUP ((char *) last_heap->end + get) - (char *) last_heap->end; if (real_morecore (get) != last_heap->end) @@ -344,7 +344,7 @@ relinquish (void) else { excess = ((char *) last_heap->end - - (char *) ROUNDUP ((char *) last_heap->end - excess)); + - (char *) PAGE_ROUNDUP ((char *) last_heap->end - excess)); /* If the system doesn't want that much memory back, leave the end of the last heap unchanged to reflect that. This can occur if break_value is still within the original @@ -768,9 +768,9 @@ r_alloc_sbrk (ptrdiff_t size) not always find a space which is contiguous to the previous. */ void *new_bloc_start; heap_ptr h = first_heap; - size_t get = ROUNDUP (size); + size_t get = PAGE_ROUNDUP (size); - address = (void *) ROUNDUP (virtual_break_value); + address = (void *) PAGE_ROUNDUP (virtual_break_value); /* Search the list upward for a heap which is large enough. */ while ((char *) h->end < (char *) MEM_ROUNDUP ((char *) address + get)) @@ -778,7 +778,7 @@ r_alloc_sbrk (ptrdiff_t size) h = h->next; if (h == NIL_HEAP) break; - address = (void *) ROUNDUP (h->start); + address = (void *) PAGE_ROUNDUP (h->start); } /* If not found, obtain more space. */ @@ -790,9 +790,9 @@ r_alloc_sbrk (ptrdiff_t size) return 0; if (first_heap == last_heap) - address = (void *) ROUNDUP (virtual_break_value); + address = (void *) PAGE_ROUNDUP (virtual_break_value); else - address = (void *) ROUNDUP (last_heap->start); + address = (void *) PAGE_ROUNDUP (last_heap->start); h = last_heap; } @@ -1054,7 +1054,7 @@ r_alloc_check (void) for (h = first_heap; h; h = h->next) { assert (h->prev == ph); - assert ((void *) ROUNDUP (h->end) == h->end); + assert ((void *) PAGE_ROUNDUP (h->end) == h->end); #if 0 /* ??? The code in ralloc.c does not really try to ensure the heap start has any sort of alignment. Perhaps it should. */ @@ -1190,7 +1190,7 @@ r_alloc_init (void) if (break_value == NULL) emacs_abort (); - extra_bytes = ROUNDUP (50000); + extra_bytes = PAGE_ROUNDUP (50000); #endif #ifdef DOUG_LEA_MALLOC @@ -1212,7 +1212,7 @@ r_alloc_init (void) #endif #ifndef SYSTEM_MALLOC - first_heap->end = (void *) ROUNDUP (first_heap->start); + first_heap->end = (void *) PAGE_ROUNDUP (first_heap->start); /* The extra call to real_morecore guarantees that the end of the address space is a multiple of page_size, even if page_size is diff --git a/src/regex.c b/src/regex.c index 1befececd22..4ab98bbf098 100644 --- a/src/regex.c +++ b/src/regex.c @@ -131,12 +131,12 @@ # include "character.h" # include "buffer.h" -/* Make syntax table lookup grant data in gl_state. */ -# define SYNTAX_ENTRY_VIA_PROPERTY - # include "syntax.h" # include "category.h" +/* Make syntax table lookup grant data in gl_state. */ +# define SYNTAX(c) syntax_property (c, 1) + # ifdef malloc # undef malloc # endif diff --git a/src/syntax.c b/src/syntax.c index 31eb86faed8..e18db029309 100644 --- a/src/syntax.c +++ b/src/syntax.c @@ -20,8 +20,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> -#define SYNTAX_INLINE EXTERN_INLINE - #include <sys/types.h> #include "lisp.h" @@ -31,13 +29,15 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "keymap.h" #include "regex.h" -/* Make syntax table lookup grant data in gl_state. */ -#define SYNTAX_ENTRY_VIA_PROPERTY - #include "syntax.h" #include "intervals.h" #include "category.h" +/* Make syntax table lookup grant data in gl_state. */ +#define SYNTAX(c) syntax_property (c, 1) +#define SYNTAX_ENTRY(c) syntax_property_entry (c, 1) +#define SYNTAX_WITH_FLAGS(c) syntax_property_with_flags (c, 1) + /* Eight single-bit flags have the following meanings: 1. This character is the first of a two-character comment-start sequence. 2. This character is the second of a two-character comment-start sequence. diff --git a/src/syntax.h b/src/syntax.h index 1b96284af42..73fbb153338 100644 --- a/src/syntax.h +++ b/src/syntax.h @@ -19,9 +19,6 @@ You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ INLINE_HEADER_BEGIN -#ifndef SYNTAX_INLINE -# define SYNTAX_INLINE INLINE -#endif extern void update_syntax_table (ptrdiff_t, EMACS_INT, bool, Lisp_Object); @@ -86,35 +83,49 @@ struct gl_state_s extern struct gl_state_s gl_state; /* Fetch the information from the entry for character C - in syntax table TABLE, or from globally kept data (gl_state). + in the current buffer's syntax table, + or (if VIA_PROPERTY) from globally kept data (gl_state). Does inheritance. */ -SYNTAX_INLINE Lisp_Object -SYNTAX_ENTRY (int c) +INLINE Lisp_Object +syntax_property_entry (int c, bool via_property) { -#ifdef SYNTAX_ENTRY_VIA_PROPERTY - return (gl_state.use_global - ? gl_state.global_code - : CHAR_TABLE_REF (gl_state.current_syntax_table, c)); -#else + if (via_property) + return (gl_state.use_global + ? gl_state.global_code + : CHAR_TABLE_REF (gl_state.current_syntax_table, c)); return CHAR_TABLE_REF (BVAR (current_buffer, syntax_table), c); -#endif +} +INLINE Lisp_Object +SYNTAX_ENTRY (int c) +{ + return syntax_property_entry (c, 0); } /* Extract the information from the entry for character C in the current syntax table. */ -SYNTAX_INLINE int -SYNTAX_WITH_FLAGS (int c) +INLINE int +syntax_property_with_flags (int c, bool via_property) { - Lisp_Object ent = SYNTAX_ENTRY (c); + Lisp_Object ent = syntax_property_entry (c, via_property); return CONSP (ent) ? XINT (XCAR (ent)) : Swhitespace; } +INLINE int +SYNTAX_WITH_FLAGS (int c) +{ + return syntax_property_with_flags (c, 0); +} -SYNTAX_INLINE enum syntaxcode +INLINE enum syntaxcode +syntax_property (int c, bool via_property) +{ + return syntax_property_with_flags (c, via_property) & 0xff; +} +INLINE enum syntaxcode SYNTAX (int c) { - return SYNTAX_WITH_FLAGS (c) & 0xff; + return syntax_property (c, 0); } @@ -137,7 +148,7 @@ extern char const syntax_code_spec[16]; The value is meant for use in code that does nothing when parse_sexp_lookup_properties is 0, so return 0 in that case, for speed. */ -SYNTAX_INLINE ptrdiff_t +INLINE ptrdiff_t SYNTAX_TABLE_BYTE_TO_CHAR (ptrdiff_t bytepos) { return (! parse_sexp_lookup_properties @@ -157,7 +168,7 @@ SYNTAX_TABLE_BYTE_TO_CHAR (ptrdiff_t bytepos) /* Make syntax table state (gl_state) good for CHARPOS, assuming it is currently good for a position before CHARPOS. */ -SYNTAX_INLINE void +INLINE void UPDATE_SYNTAX_TABLE_FORWARD (ptrdiff_t charpos) { if (parse_sexp_lookup_properties && charpos >= gl_state.e_property) @@ -167,7 +178,7 @@ UPDATE_SYNTAX_TABLE_FORWARD (ptrdiff_t charpos) /* Make syntax table state (gl_state) good for CHARPOS, assuming it is currently good for a position after CHARPOS. */ -SYNTAX_INLINE void +INLINE void UPDATE_SYNTAX_TABLE_BACKWARD (ptrdiff_t charpos) { if (parse_sexp_lookup_properties && charpos < gl_state.b_property) @@ -176,7 +187,7 @@ UPDATE_SYNTAX_TABLE_BACKWARD (ptrdiff_t charpos) /* Make syntax table good for CHARPOS. */ -SYNTAX_INLINE void +INLINE void UPDATE_SYNTAX_TABLE (ptrdiff_t charpos) { UPDATE_SYNTAX_TABLE_BACKWARD (charpos); @@ -185,7 +196,7 @@ UPDATE_SYNTAX_TABLE (ptrdiff_t charpos) /* Set up the buffer-global syntax table. */ -SYNTAX_INLINE void +INLINE void SETUP_BUFFER_SYNTAX_TABLE (void) { gl_state.use_global = 0; diff --git a/src/sysdep.c b/src/sysdep.c index 6439697501e..84859813249 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -19,8 +19,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> -#define SYSTIME_INLINE EXTERN_INLINE - #include <execinfo.h> #include "sysstdio.h" #ifdef HAVE_PWD_H diff --git a/src/systime.h b/src/systime.h index b1c3d940b0e..a9bdf53b09f 100644 --- a/src/systime.h +++ b/src/systime.h @@ -22,9 +22,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <timespec.h> INLINE_HEADER_BEGIN -#ifndef SYSTIME_INLINE -# define SYSTIME_INLINE INLINE -#endif #ifdef emacs # ifdef HAVE_X_WINDOWS @@ -54,7 +51,7 @@ typedef unsigned long Time; should be an absolute time since the epoch and B a nonnegative offset. */ /* Return an invalid timespec. */ -SYSTIME_INLINE struct timespec +INLINE struct timespec invalid_timespec (void) { return make_timespec (0, -1); @@ -63,14 +60,14 @@ invalid_timespec (void) /* Return 1 if TIME is a valid timespec. This currently doesn't worry about whether tv_nsec is less than TIMESPEC_RESOLUTION; leap seconds might cause a problem if it did. */ -SYSTIME_INLINE int +INLINE int timespec_valid_p (struct timespec t) { return t.tv_nsec >= 0; } /* Return current system time. */ -SYSTIME_INLINE struct timespec +INLINE struct timespec current_timespec (void) { struct timespec r; diff --git a/src/term.c b/src/term.c index 830ecf10dcb..116a2e6bba1 100644 --- a/src/term.c +++ b/src/term.c @@ -1810,27 +1810,10 @@ append_glyphless_glyph (struct it *it, int face_id, const char *str) static void produce_glyphless_glyph (struct it *it, Lisp_Object acronym) { - int face_id; - int len; + int len, face_id = merge_glyphless_glyph_face (it); char buf[sizeof "\\x" + max (6, (sizeof it->c * CHAR_BIT + 3) / 4)]; char const *str = " "; - /* Get a face ID for the glyph by utilizing a cache (the same way as - done for `escape-glyph' in get_next_display_element). */ - if (it->f == last_glyphless_glyph_frame - && it->face_id == last_glyphless_glyph_face_id) - { - face_id = last_glyphless_glyph_merged_face_id; - } - else - { - /* Merge the `glyphless-char' face into the current face. */ - face_id = merge_faces (it->f, Qglyphless_char, 0, it->face_id); - last_glyphless_glyph_frame = it->f; - last_glyphless_glyph_face_id = it->face_id; - last_glyphless_glyph_merged_face_id = face_id; - } - if (it->glyphless_method == GLYPHLESS_DISPLAY_THIN_SPACE) { /* As there's no way to produce a thin space, we produce a space @@ -4061,12 +4044,8 @@ dissociate_if_controlling_tty (int fd) struct terminal * init_tty (const char *name, const char *terminal_type, bool must_succeed) { -#ifdef TERMINFO - char **address = 0; -#else char *area; char **address = &area; -#endif int status; struct tty_display_info *tty = NULL; struct terminal *terminal = NULL; @@ -4157,13 +4136,9 @@ init_tty (const char *name, const char *terminal_type, bool must_succeed) /* On some systems, tgetent tries to access the controlling terminal. */ block_tty_out_signal (); -#ifdef TERMINFO - status = tgetent (0, terminal_type); -#else status = tgetent (tty->termcap_term_buffer, terminal_type); if (tty->termcap_term_buffer[TERMCAP_BUFFER_SIZE - 1]) emacs_abort (); -#endif unblock_tty_out_signal (); if (status < 0) @@ -4194,9 +4169,7 @@ use the Bourne shell command `TERM=... export TERM' (C-shell:\n\ terminal_type); } -#ifndef TERMINFO area = tty->termcap_strings_buffer; -#endif tty->TS_ins_line = tgetstr ("al", address); tty->TS_ins_multi_lines = tgetstr ("AL", address); tty->TS_bell = tgetstr ("bl", address); diff --git a/src/termchar.h b/src/termchar.h index 9dea46f0b76..031f4e4034b 100644 --- a/src/termchar.h +++ b/src/termchar.h @@ -30,9 +30,7 @@ struct tty_output /* There is nothing else here at the moment... */ }; -#ifndef TERMINFO enum { TERMCAP_BUFFER_SIZE = 4096 }; -#endif /* Parameters that are shared between frames on the same tty device. */ @@ -78,7 +76,6 @@ struct tty_display_info mouse-face. */ Mouse_HLInfo mouse_highlight; -#ifndef TERMINFO /* Buffer used internally by termcap (see tgetent in the Termcap manual). Only init_tty should use this. */ char termcap_term_buffer[TERMCAP_BUFFER_SIZE]; @@ -86,7 +83,6 @@ struct tty_display_info /* Buffer storing terminal description strings (see tgetstr in the Termcap manual). Only init_tty should use this. */ char termcap_strings_buffer[TERMCAP_BUFFER_SIZE]; -#endif /* Strings, numbers and flags taken from the termcap entry. */ diff --git a/src/termhooks.h b/src/termhooks.h index 3e4ec1d7e6d..9cea0c188ec 100644 --- a/src/termhooks.h +++ b/src/termhooks.h @@ -26,11 +26,9 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "systime.h" /* for Time */ INLINE_HEADER_BEGIN -#ifndef TERMHOOKS_INLINE -# define TERMHOOKS_INLINE INLINE -#endif enum scroll_bar_part { + scroll_bar_nowhere = -1, scroll_bar_above_handle, scroll_bar_handle, scroll_bar_below_handle, @@ -42,11 +40,6 @@ enum scroll_bar_part { scroll_bar_move_ratio }; -/* If the value of the frame parameter changed, whis hook is called. - For example, if going from fullscreen to not fullscreen this hook - may do something OS dependent, like extended window manager hints on X11. */ -extern void (*fullscreen_hook) (struct frame *f); - /* Output method of a terminal (and frames on this terminal, respectively). */ enum output_method @@ -498,7 +491,7 @@ struct terminal windows. */ void (*frame_raise_lower_hook) (struct frame *f, int raise_flag); - /* If the value of the frame parameter changed, whis hook is called. + /* If the value of the frame parameter changed, this hook is called. For example, if going from fullscreen to not fullscreen this hook may do something OS dependent, like extended window manager hints on X11. */ void (*fullscreen_hook) (struct frame *f); @@ -612,12 +605,12 @@ struct terminal /* Most code should use these functions to set Lisp fields in struct terminal. */ -TERMHOOKS_INLINE void +INLINE void tset_charset_list (struct terminal *t, Lisp_Object val) { t->charset_list = val; } -TERMHOOKS_INLINE void +INLINE void tset_selection_alist (struct terminal *t, Lisp_Object val) { t->Vselection_alist = val; diff --git a/src/terminal.c b/src/terminal.c index 4b5532e3a44..61c5d050945 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -18,8 +18,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> -#define TERMHOOKS_INLINE EXTERN_INLINE - #include <stdio.h> #include "lisp.h" diff --git a/src/w32console.c b/src/w32console.c index 94bb5df07a4..285abb310fe 100644 --- a/src/w32console.c +++ b/src/w32console.c @@ -630,7 +630,6 @@ void initialize_w32_display (struct terminal *term, int *width, int *height) { CONSOLE_SCREEN_BUFFER_INFO info; - Mouse_HLInfo *hlinfo; term->rif = 0; /* No window based redisplay on the console. */ term->cursor_to_hook = w32con_move_cursor; diff --git a/src/w32fns.c b/src/w32fns.c index 8ec911280a0..6e52453caea 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -277,7 +277,7 @@ check_x_display_info (Lisp_Object frame) struct frame *sf = XFRAME (selected_frame); if (FRAME_W32_P (sf) && FRAME_LIVE_P (sf)) - return FRAME_W32_DISPLAY_INFO (sf); + return FRAME_DISPLAY_INFO (sf); else return &one_w32_display_info; } @@ -291,7 +291,7 @@ check_x_display_info (Lisp_Object frame) f = XFRAME (frame); if (! FRAME_W32_P (f)) error ("Non-W32 frame used"); - return FRAME_W32_DISPLAY_INFO (f); + return FRAME_DISPLAY_INFO (f); } } @@ -307,7 +307,7 @@ x_window_to_frame (struct w32_display_info *dpyinfo, HWND wdesc) FOR_EACH_FRAME (tail, frame) { f = XFRAME (frame); - if (!FRAME_W32_P (f) || FRAME_W32_DISPLAY_INFO (f) != dpyinfo) + if (!FRAME_W32_P (f) || FRAME_DISPLAY_INFO (f) != dpyinfo) continue; if (FRAME_W32_WINDOW (f) == wdesc) @@ -1027,18 +1027,18 @@ w32_regenerate_palette (struct frame *f) int i; /* don't bother trying to create palette if not supported */ - if (! FRAME_W32_DISPLAY_INFO (f)->has_palette) + if (! FRAME_DISPLAY_INFO (f)->has_palette) return; log_palette = (LOGPALETTE *) alloca (sizeof (LOGPALETTE) + - FRAME_W32_DISPLAY_INFO (f)->num_colors * sizeof (PALETTEENTRY)); + FRAME_DISPLAY_INFO (f)->num_colors * sizeof (PALETTEENTRY)); log_palette->palVersion = 0x300; - log_palette->palNumEntries = FRAME_W32_DISPLAY_INFO (f)->num_colors; + log_palette->palNumEntries = FRAME_DISPLAY_INFO (f)->num_colors; - list = FRAME_W32_DISPLAY_INFO (f)->color_list; + list = FRAME_DISPLAY_INFO (f)->color_list; for (i = 0; - i < FRAME_W32_DISPLAY_INFO (f)->num_colors; + i < FRAME_DISPLAY_INFO (f)->num_colors; i++, list = list->next) log_palette->palPalEntry[i] = list->entry; @@ -1046,9 +1046,9 @@ w32_regenerate_palette (struct frame *f) enter_crit (); - if (FRAME_W32_DISPLAY_INFO (f)->palette) - DeleteObject (FRAME_W32_DISPLAY_INFO (f)->palette); - FRAME_W32_DISPLAY_INFO (f)->palette = new_palette; + if (FRAME_DISPLAY_INFO (f)->palette) + DeleteObject (FRAME_DISPLAY_INFO (f)->palette); + FRAME_DISPLAY_INFO (f)->palette = new_palette; /* Realize display palette and garbage all frames. */ release_frame_dc (f, get_frame_dc (f)); @@ -1071,7 +1071,7 @@ w32_regenerate_palette (struct frame *f) void w32_map_color (struct frame *f, COLORREF color) { - struct w32_palette_entry * list = FRAME_W32_DISPLAY_INFO (f)->color_list; + struct w32_palette_entry * list = FRAME_DISPLAY_INFO (f)->color_list; if (NILP (Vw32_enable_palette)) return; @@ -1091,19 +1091,19 @@ w32_map_color (struct frame *f, COLORREF color) list = xmalloc (sizeof (struct w32_palette_entry)); SET_W32_COLOR (list->entry, color); list->refcount = 1; - list->next = FRAME_W32_DISPLAY_INFO (f)->color_list; - FRAME_W32_DISPLAY_INFO (f)->color_list = list; - FRAME_W32_DISPLAY_INFO (f)->num_colors++; + list->next = FRAME_DISPLAY_INFO (f)->color_list; + FRAME_DISPLAY_INFO (f)->color_list = list; + FRAME_DISPLAY_INFO (f)->num_colors++; /* set flag that palette must be regenerated */ - FRAME_W32_DISPLAY_INFO (f)->regen_palette = TRUE; + FRAME_DISPLAY_INFO (f)->regen_palette = TRUE; } void w32_unmap_color (struct frame *f, COLORREF color) { - struct w32_palette_entry * list = FRAME_W32_DISPLAY_INFO (f)->color_list; - struct w32_palette_entry **prev = &FRAME_W32_DISPLAY_INFO (f)->color_list; + struct w32_palette_entry * list = FRAME_DISPLAY_INFO (f)->color_list; + struct w32_palette_entry **prev = &FRAME_DISPLAY_INFO (f)->color_list; if (NILP (Vw32_enable_palette)) return; @@ -1117,7 +1117,7 @@ w32_unmap_color (struct frame *f, COLORREF color) { *prev = list->next; xfree (list); - FRAME_W32_DISPLAY_INFO (f)->num_colors--; + FRAME_DISPLAY_INFO (f)->num_colors--; break; } else @@ -1128,7 +1128,7 @@ w32_unmap_color (struct frame *f, COLORREF color) } /* set flag that palette must be regenerated */ - FRAME_W32_DISPLAY_INFO (f)->regen_palette = TRUE; + FRAME_DISPLAY_INFO (f)->regen_palette = TRUE; } #endif @@ -1235,7 +1235,7 @@ x_decode_color (struct frame *f, Lisp_Object arg, int def) else if (strcmp (SDATA (arg), "white") == 0) return WHITE_PIX_DEFAULT (f); - if ((FRAME_W32_DISPLAY_INFO (f)->n_planes * FRAME_W32_DISPLAY_INFO (f)->n_cbits) == 1) + if ((FRAME_DISPLAY_INFO (f)->n_planes * FRAME_DISPLAY_INFO (f)->n_cbits) == 1) return def; /* w32_defined_color is responsible for coping with failures @@ -1637,7 +1637,7 @@ x_set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) x_set_window_size (f, 0, FRAME_COLS (f), FRAME_LINES (f)); do_pending_window_change (0); } - adjust_glyphs (f); + adjust_frame_glyphs (f); } @@ -1679,7 +1679,7 @@ x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) FRAME_TOOL_BAR_LINES (f) = nlines; resize_frame_windows (f, FRAME_LINES (f), 0); - adjust_glyphs (f); + adjust_frame_glyphs (f); /* We also have to make sure that the internal border at the top of the frame, below the menu bar or tool bar, is redrawn when the @@ -1752,10 +1752,10 @@ x_set_name (struct frame *f, Lisp_Object name, int explicit) { /* Check for no change needed in this very common case before we do any consing. */ - if (!strcmp (FRAME_W32_DISPLAY_INFO (f)->w32_id_name, + if (!strcmp (FRAME_DISPLAY_INFO (f)->w32_id_name, SDATA (f->name))) return; - name = build_string (FRAME_W32_DISPLAY_INFO (f)->w32_id_name); + name = build_string (FRAME_DISPLAY_INFO (f)->w32_id_name); } else CHECK_STRING (name); @@ -1890,16 +1890,11 @@ w32_init_class (HINSTANCE hinst) static HWND w32_createscrollbar (struct frame *f, struct scroll_bar * bar) { - return (CreateWindow ("SCROLLBAR", "", SBS_VERT | WS_CHILD | WS_VISIBLE, - /* Position and size of scroll bar. */ - XINT (bar->left) + VERTICAL_SCROLL_BAR_WIDTH_TRIM, - XINT (bar->top), - XINT (bar->width) - VERTICAL_SCROLL_BAR_WIDTH_TRIM * 2, - XINT (bar->height), - FRAME_W32_WINDOW (f), - NULL, - hinst, - NULL)); + return CreateWindow ("SCROLLBAR", "", SBS_VERT | WS_CHILD | WS_VISIBLE, + /* Position and size of scroll bar. */ + XINT (bar->left), XINT (bar->top), + XINT (bar->width), XINT (bar->height), + FRAME_W32_WINDOW (f), NULL, hinst, NULL); } static void @@ -4232,7 +4227,7 @@ unwind_create_frame (Lisp_Object frame) if (NILP (Fmemq (frame, Vframe_list))) { #ifdef GLYPH_DEBUG - struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f); + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); #endif x_free_frame_resources (f); @@ -4258,7 +4253,7 @@ do_unwind_create_frame (Lisp_Object frame) static void x_default_font_parameter (struct frame *f, Lisp_Object parms) { - struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f); + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); Lisp_Object font_param = x_get_arg (dpyinfo, parms, Qfont, NULL, NULL, RES_TYPE_STRING); Lisp_Object font; @@ -4392,9 +4387,9 @@ This function is an internal primitive--use `make-frame' instead. */) if (! STRINGP (f->icon_name)) fset_icon_name (f, Qnil); -/* FRAME_W32_DISPLAY_INFO (f) = dpyinfo; */ +/* FRAME_DISPLAY_INFO (f) = dpyinfo; */ - /* With FRAME_X_DISPLAY_INFO set up, this unwind-protect is safe. */ + /* With FRAME_DISPLAY_INFO set up, this unwind-protect is safe. */ record_unwind_protect (do_unwind_create_frame, frame); #ifdef GLYPH_DEBUG image_cache_refcount = @@ -4411,7 +4406,7 @@ This function is an internal primitive--use `make-frame' instead. */) } else { - f->output_data.w32->parent_desc = FRAME_W32_DISPLAY_INFO (f)->root_window; + f->output_data.w32->parent_desc = FRAME_DISPLAY_INFO (f)->root_window; f->output_data.w32->explicit_parent = 0; } @@ -4506,7 +4501,7 @@ This function is an internal primitive--use `make-frame' instead. */) "fullscreen", "Fullscreen", RES_TYPE_SYMBOL); f->output_data.w32->dwStyle = WS_OVERLAPPEDWINDOW; - f->output_data.w32->parent_desc = FRAME_W32_DISPLAY_INFO (f)->root_window; + f->output_data.w32->parent_desc = FRAME_DISPLAY_INFO (f)->root_window; f->output_data.w32->text_cursor = w32_load_cursor (IDC_IBEAM); f->output_data.w32->nontext_cursor = w32_load_cursor (IDC_ARROW); @@ -4529,7 +4524,7 @@ This function is an internal primitive--use `make-frame' instead. */) /* Now consider the frame official. */ f->terminal->reference_count++; - FRAME_W32_DISPLAY_INFO (f)->reference_count++; + FRAME_DISPLAY_INFO (f)->reference_count++; Vframe_list = Fcons (frame, Vframe_list); /* We need to do this after creating the window, so that the @@ -4613,7 +4608,7 @@ This function is an internal primitive--use `make-frame' instead. */) Lisp_Object x_get_focus_frame (struct frame *frame) { - struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (frame); + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (frame); Lisp_Object xfocus; if (! dpyinfo->w32_focus_frame) return Qnil; @@ -4622,15 +4617,6 @@ x_get_focus_frame (struct frame *frame) return xfocus; } -DEFUN ("x-focus-frame", Fx_focus_frame, Sx_focus_frame, 1, 1, 0, - doc: /* Give FRAME input focus, raising to foreground if necessary. */) - (Lisp_Object frame) -{ - x_focus_on_frame (decode_window_system_frame (frame)); - return Qnil; -} - - DEFUN ("xw-color-defined-p", Fxw_color_defined_p, Sxw_color_defined_p, 1, 2, 0, doc: /* Internal function called by `color-defined-p', which see. \(Note that the Nextstep version of this function ignores FRAME.) */) @@ -5131,7 +5117,7 @@ SOUND is nil to use the normal beep. */) int x_screen_planes (register struct frame *f) { - return FRAME_W32_DISPLAY_INFO (f)->n_planes; + return FRAME_DISPLAY_INFO (f)->n_planes; } /* Return the display structure for the display named NAME. @@ -5201,11 +5187,6 @@ terminate Emacs if we can't open the connection. if (! NILP (xrm_string)) CHECK_STRING (xrm_string); -#if 0 - if (! EQ (Vwindow_system, intern ("w32"))) - error ("Not using Microsoft Windows"); -#endif - /* Allow color mapping to be defined externally; first look in user's HOME directory, then in Emacs etc dir for a file called rgb.txt. */ { @@ -5668,7 +5649,7 @@ x_create_tip_frame (struct w32_display_info *dpyinfo, dpyinfo_refcount = dpyinfo->reference_count; #endif /* GLYPH_DEBUG */ FRAME_KBOARD (f) = kb; - f->output_data.w32->parent_desc = FRAME_W32_DISPLAY_INFO (f)->root_window; + f->output_data.w32->parent_desc = FRAME_DISPLAY_INFO (f)->root_window; f->output_data.w32->explicit_parent = 0; /* Set the name; the functions to which we pass f expect the name to @@ -5737,7 +5718,7 @@ x_create_tip_frame (struct w32_display_info *dpyinfo, init_frame_faces (f); f->output_data.w32->dwStyle = WS_BORDER | WS_POPUP | WS_DISABLED; - f->output_data.w32->parent_desc = FRAME_W32_DISPLAY_INFO (f)->root_window; + f->output_data.w32->parent_desc = FRAME_DISPLAY_INFO (f)->root_window; window_prompting = x_figure_window_size (f, parms, 0); @@ -5804,7 +5785,7 @@ x_create_tip_frame (struct w32_display_info *dpyinfo, /* Now that the frame is official, it counts as a reference to its display. */ - FRAME_W32_DISPLAY_INFO (f)->reference_count++; + FRAME_DISPLAY_INFO (f)->reference_count++; f->terminal->reference_count++; /* It is now ok to make the frame official even if we get an error @@ -5851,8 +5832,8 @@ compute_tip_xy (struct frame *f, /* Default min and max values. */ min_x = 0; min_y = 0; - max_x = x_display_pixel_width (FRAME_W32_DISPLAY_INFO (f)); - max_y = x_display_pixel_height (FRAME_W32_DISPLAY_INFO (f)); + max_x = x_display_pixel_width (FRAME_DISPLAY_INFO (f)); + max_y = x_display_pixel_height (FRAME_DISPLAY_INFO (f)); block_input (); GetCursorPos (&pt); @@ -6038,7 +6019,7 @@ Text larger than the specified size is clipped. */) /* Create a frame for the tooltip, and record it in the global variable tip_frame. */ - frame = x_create_tip_frame (FRAME_W32_DISPLAY_INFO (f), parms, string); + frame = x_create_tip_frame (FRAME_DISPLAY_INFO (f), parms, string); f = XFRAME (frame); /* Set up the frame's root window. */ @@ -6062,7 +6043,7 @@ Text larger than the specified size is clipped. */) } FRAME_TOTAL_COLS (f) = WINDOW_TOTAL_COLS (w); - adjust_glyphs (f); + adjust_frame_glyphs (f); w->pseudo_window_p = 1; /* Display the tooltip text in a temporary buffer. */ @@ -6131,7 +6112,7 @@ Text larger than the specified size is clipped. */) width /= WINDOW_FRAME_COLUMN_WIDTH (w); w->total_cols = width; FRAME_TOTAL_COLS (f) = width; - adjust_glyphs (f); + adjust_frame_glyphs (f); w->pseudo_window_p = 1; clear_glyph_matrix (w->desired_matrix); clear_glyph_matrix (w->current_matrix); @@ -7865,7 +7846,6 @@ only be necessary if the default setting causes problems. */); defsubr (&Sx_close_connection); defsubr (&Sx_display_list); defsubr (&Sx_synchronize); - defsubr (&Sx_focus_frame); /* W32 specific functions */ diff --git a/src/w32font.c b/src/w32font.c index 4a97fd90a4e..845df68f09d 100644 --- a/src/w32font.c +++ b/src/w32font.c @@ -299,7 +299,7 @@ intern_font_name (char * string) Lisp_Object w32font_get_cache (struct frame *f) { - struct w32_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); return (dpyinfo->name_list_element); } diff --git a/src/w32menu.c b/src/w32menu.c index f804e830ac0..ad2eb96495a 100644 --- a/src/w32menu.c +++ b/src/w32menu.c @@ -231,7 +231,7 @@ otherwise it is "Question". */) unblock_input (); discard_menu_items (); - FRAME_X_DISPLAY_INFO (f)->grabbed = 0; + FRAME_DISPLAY_INFO (f)->grabbed = 0; if (error_name) error (error_name); return selection; @@ -421,7 +421,7 @@ set_frame_menubar (struct frame *f, bool first_time, bool deep_p) /* Save the frame's previous menu bar contents data. */ if (previous_menu_items_used) - memcpy (previous_items, XVECTOR (f->menu_bar_vector)->contents, + memcpy (previous_items, XVECTOR (f->menu_bar_vector)->u.contents, previous_menu_items_used * word_size); /* Fill in menu_items with the current menu bar contents. @@ -885,7 +885,7 @@ w32_menu_show (struct frame *f, int x, int y, int for_click, int keymaps, /* Clean up extraneous mouse events which might have been generated during the call. */ discard_mouse_events (); - FRAME_X_DISPLAY_INFO (f)->grabbed = 0; + FRAME_DISPLAY_INFO (f)->grabbed = 0; /* Free the widget_value objects we used to specify the contents. */ free_menubar_widget_value_tree (first_wv); @@ -1130,7 +1130,7 @@ w32_dialog_show (struct frame *f, int keymaps, lw_pop_up_all_widgets (dialog_id); /* Process events that apply to the menu. */ - popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), dialog_id); + popup_get_selection ((XEvent *) 0, FRAME_DISPLAY_INFO (f), dialog_id); lw_destroy_all_widgets (dialog_id); diff --git a/src/w32proc.c b/src/w32proc.c index dabaa62f71c..221b42fb7b2 100644 --- a/src/w32proc.c +++ b/src/w32proc.c @@ -1144,7 +1144,7 @@ create_child (char *exe, char *cmdline, char *env, int is_gui_app, return FALSE; } -/* create_child doesn't know what emacs' file handle will be for waiting +/* create_child doesn't know what emacs's file handle will be for waiting on output from the child, so we need to make this additional call to register the handle with the process This way the select emulator knows how to match file handles with diff --git a/src/w32reg.c b/src/w32reg.c index e7c4e9ea351..c41675019dd 100644 --- a/src/w32reg.c +++ b/src/w32reg.c @@ -56,7 +56,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ */ static char * -w32_get_rdb_resource (char *rdb, char *resource) +w32_get_rdb_resource (char *rdb, const char *resource) { char *value = rdb; int len = strlen (resource); @@ -74,7 +74,7 @@ w32_get_rdb_resource (char *rdb, char *resource) } static LPBYTE -w32_get_string_resource (char *name, char *class, DWORD dwexptype) +w32_get_string_resource (const char *name, const char *class, DWORD dwexptype) { LPBYTE lpvalue = NULL; HKEY hrootkey = NULL; @@ -92,7 +92,7 @@ w32_get_string_resource (char *name, char *class, DWORD dwexptype) if (RegOpenKeyEx (hive, REG_ROOT, 0, KEY_READ, &hrootkey) == ERROR_SUCCESS) { - char *keyname; + const char *keyname; if (RegQueryValueEx (hrootkey, name, NULL, &dwType, NULL, &cbData) == ERROR_SUCCESS && dwType == dwexptype) @@ -141,7 +141,7 @@ w32_get_string_resource (char *name, char *class, DWORD dwexptype) database RDB. */ char * -x_get_string_resource (XrmDatabase rdb, char *name, char *class) +x_get_string_resource (XrmDatabase rdb, const char *name, const char *class) { if (rdb) { diff --git a/src/w32term.c b/src/w32term.c index 532ded7cdad..be8ebfe6ab6 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -149,9 +149,6 @@ BOOL (WINAPI *pfnSetLayeredWindowAttributes) (HWND, COLORREF, BYTE, DWORD); #define SM_CYVIRTUALSCREEN 79 #endif -/* This is a frame waiting to be autoraised, within w32_read_socket. */ -struct frame *pending_autoraise_frame; - /* The handle of the frame that currently owns the system caret. */ HWND w32_system_caret_hwnd; int w32_system_caret_height; @@ -174,31 +171,6 @@ int last_scroll_bar_drag_pos; /* Keyboard code page - may be changed by language-change events. */ int w32_keyboard_codepage; -/* Mouse movement. */ - -/* Where the mouse was last time we reported a mouse event. */ -static RECT last_mouse_glyph; -static struct frame *last_mouse_glyph_frame; - -/* The scroll bar in which the last motion event occurred. - - If the last motion event occurred in a scroll bar, we set this - so w32_mouse_position can know whether to report a scroll bar motion or - an ordinary motion. - - If the last motion event didn't occur in a scroll bar, we set this - to Qnil, to tell w32_mouse_position to return an ordinary motion event. */ -static Lisp_Object last_mouse_scroll_bar; -static int last_mouse_scroll_bar_pos; - -/* This is a hack. We would really prefer that w32_mouse_position would - return the time associated with the position it returns, but there - doesn't seem to be any way to wrest the time-stamp from the server - along with the position query. So, we just keep track of the time - of the last movement we received, and return that in hopes that - it's somewhat accurate. */ -static Time last_mouse_movement_time; - /* Incremented by w32_read_socket whenever it really tries to read events. */ static int volatile input_signal_count; @@ -477,7 +449,7 @@ w32_clear_window (struct frame *f) void x_set_frame_alpha (struct frame *f) { - struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f); + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); double alpha = 1.0; double alpha_min = 1.0; BYTE opac; @@ -557,7 +529,7 @@ x_display_pixel_width (struct w32_display_info *dpyinfo) static void x_update_begin (struct frame *f) { - struct w32_display_info *display_info = FRAME_W32_DISPLAY_INFO (f); + struct w32_display_info *display_info = FRAME_DISPLAY_INFO (f); if (! FRAME_W32_P (f)) return; @@ -1003,14 +975,14 @@ x_set_cursor_gc (struct glyph_string *s) xgcv.font = s->font; mask = GCForeground | GCBackground | GCFont; - if (FRAME_W32_DISPLAY_INFO (s->f)->scratch_cursor_gc) - XChangeGC (NULL, FRAME_W32_DISPLAY_INFO (s->f)->scratch_cursor_gc, + if (FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc) + XChangeGC (NULL, FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc, mask, &xgcv); else - FRAME_W32_DISPLAY_INFO (s->f)->scratch_cursor_gc + FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc = XCreateGC (NULL, s->window, mask, &xgcv); - s->gc = FRAME_W32_DISPLAY_INFO (s->f)->scratch_cursor_gc; + s->gc = FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc; } } @@ -1052,14 +1024,14 @@ x_set_mouse_face_gc (struct glyph_string *s) xgcv.font = s->font; mask = GCForeground | GCBackground | GCFont; - if (FRAME_W32_DISPLAY_INFO (s->f)->scratch_cursor_gc) - XChangeGC (NULL, FRAME_W32_DISPLAY_INFO (s->f)->scratch_cursor_gc, + if (FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc) + XChangeGC (NULL, FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc, mask, &xgcv); else - FRAME_W32_DISPLAY_INFO (s->f)->scratch_cursor_gc + FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc = XCreateGC (NULL, s->window, mask, &xgcv); - s->gc = FRAME_W32_DISPLAY_INFO (s->f)->scratch_cursor_gc; + s->gc = FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc; } eassert (s->gc != 0); @@ -1623,7 +1595,7 @@ w32_setup_relief_color (struct frame *f, struct relief *relief, double factor, unsigned long mask = GCForeground; COLORREF pixel; COLORREF background = di->relief_background; - struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f); + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); /* TODO: Free colors (if using palette)? */ @@ -2823,9 +2795,9 @@ x_new_focus_frame (struct w32_display_info *dpyinfo, struct frame *frame) x_lower_frame (old_focus); if (dpyinfo->w32_focus_frame && dpyinfo->w32_focus_frame->auto_raise) - pending_autoraise_frame = dpyinfo->w32_focus_frame; + dpyinfo->w32_pending_autoraise_frame = dpyinfo->w32_focus_frame; else - pending_autoraise_frame = 0; + dpyinfo->w32_pending_autoraise_frame = NULL; } x_frame_rehighlight (dpyinfo); @@ -2930,7 +2902,7 @@ w32_frame_rehighlight (struct frame *frame) { if (! FRAME_W32_P (frame)) return; - x_frame_rehighlight (FRAME_W32_DISPLAY_INFO (frame)); + x_frame_rehighlight (FRAME_DISPLAY_INFO (frame)); } static void @@ -3307,47 +3279,47 @@ queue_notifications (struct input_event *event, W32Msg *msg, struct frame *f, the mainstream emacs code by setting mouse_moved. If not, ask for another motion event, so we can check again the next time it moves. */ -static MSG last_mouse_motion_event; -static Lisp_Object last_mouse_motion_frame; - static int note_mouse_movement (struct frame *frame, MSG *msg) { + struct w32_display_info *dpyinfo; int mouse_x = LOWORD (msg->lParam); int mouse_y = HIWORD (msg->lParam); - - last_mouse_movement_time = msg->time; - memcpy (&last_mouse_motion_event, msg, sizeof (last_mouse_motion_event)); - XSETFRAME (last_mouse_motion_frame, frame); + RECT *r; if (!FRAME_X_OUTPUT (frame)) return 0; + dpyinfo = FRAME_DISPLAY_INFO (frame); + dpyinfo->last_mouse_movement_time = msg->time; + dpyinfo->last_mouse_motion_frame = frame; + dpyinfo->last_mouse_motion_x = mouse_x; + dpyinfo->last_mouse_motion_y = mouse_y; + if (msg->hwnd != FRAME_W32_WINDOW (frame)) { frame->mouse_moved = 1; - last_mouse_scroll_bar = Qnil; + dpyinfo->last_mouse_scroll_bar = NULL; note_mouse_highlight (frame, -1, -1); - last_mouse_glyph_frame = 0; + dpyinfo->last_mouse_glyph_frame = NULL; return 1; } /* Has the mouse moved off the glyph it was on at the last sighting? */ - if (frame != last_mouse_glyph_frame - || mouse_x < last_mouse_glyph.left - || mouse_x >= last_mouse_glyph.right - || mouse_y < last_mouse_glyph.top - || mouse_y >= last_mouse_glyph.bottom) + r = &dpyinfo->last_mouse_glyph; + if (frame != dpyinfo->last_mouse_glyph_frame + || mouse_x < r->left || mouse_x >= r->right + || mouse_y < r->top || mouse_y >= r->bottom) { frame->mouse_moved = 1; - last_mouse_scroll_bar = Qnil; + dpyinfo->last_mouse_scroll_bar = NULL; note_mouse_highlight (frame, mouse_x, mouse_y); /* Remember the mouse position here, as w32_mouse_position only gets called when mouse tracking is enabled but we also need to keep track of the mouse for help_echo and highlighting at other times. */ - remember_mouse_glyph (frame, mouse_x, mouse_y, &last_mouse_glyph); - last_mouse_glyph_frame = frame; + remember_mouse_glyph (frame, mouse_x, mouse_y, r); + dpyinfo->last_mouse_glyph_frame = frame; return 1; } @@ -3367,16 +3339,6 @@ static void x_scroll_bar_report_motion (struct frame **, Lisp_Object *, static void x_check_fullscreen (struct frame *); static void -redo_mouse_highlight (void) -{ - if (!NILP (last_mouse_motion_frame) - && FRAME_LIVE_P (XFRAME (last_mouse_motion_frame))) - note_mouse_highlight (XFRAME (last_mouse_motion_frame), - LOWORD (last_mouse_motion_event.lParam), - HIWORD (last_mouse_motion_event.lParam)); -} - -static void w32_define_cursor (Window window, Cursor cursor) { PostMessage (window, WM_EMACS_SETCURSOR, (WPARAM) cursor, 0); @@ -3407,10 +3369,11 @@ w32_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, unsigned long *time) { struct frame *f1; + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (*fp); block_input (); - if (! NILP (last_mouse_scroll_bar) && insist == 0) + if (dpyinfo->last_mouse_scroll_bar && insist == 0) x_scroll_bar_report_motion (fp, bar_window, part, x, y, time); else { @@ -3422,26 +3385,18 @@ w32_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, FOR_EACH_FRAME (tail, frame) XFRAME (frame)->mouse_moved = 0; - last_mouse_scroll_bar = Qnil; + dpyinfo->last_mouse_scroll_bar = NULL; GetCursorPos (&pt); /* Now we have a position on the root; find the innermost window containing the pointer. */ { - if (FRAME_W32_DISPLAY_INFO (*fp)->grabbed && last_mouse_frame - && FRAME_LIVE_P (last_mouse_frame)) - { - /* If mouse was grabbed on a frame, give coords for that frame - even if the mouse is now outside it. */ - f1 = last_mouse_frame; - } - else - { - /* Is window under mouse one of our frames? */ - f1 = x_any_window_to_frame (FRAME_W32_DISPLAY_INFO (*fp), - WindowFromPoint (pt)); - } + /* If mouse was grabbed on a frame, give coords for that + frame even if the mouse is now outside it. Otherwise + check for window under mouse on one of our frames. */ + f1 = (x_mouse_grabbed (dpyinfo) ? dpyinfo->last_mouse_frame + : x_any_window_to_frame (dpyinfo, WindowFromPoint (pt))); /* If not, is it one of our scroll bars? */ if (! f1) @@ -3468,16 +3423,17 @@ w32_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, on it, i.e. into the same rectangles that matrices on the frame are divided into. */ + dpyinfo = FRAME_DISPLAY_INFO (f1); ScreenToClient (FRAME_W32_WINDOW (f1), &pt); - remember_mouse_glyph (f1, pt.x, pt.y, &last_mouse_glyph); - last_mouse_glyph_frame = f1; + remember_mouse_glyph (f1, pt.x, pt.y, &dpyinfo->last_mouse_glyph); + dpyinfo->last_mouse_glyph_frame = f1; *bar_window = Qnil; *part = 0; *fp = f1; XSETINT (*x, pt.x); XSETINT (*y, pt.y); - *time = last_mouse_movement_time; + *time = dpyinfo->last_mouse_movement_time; } } } @@ -3866,8 +3822,7 @@ w32_set_vertical_scroll_bar (struct window *w, /* Make sure scroll bar is "visible" before moving, to ensure the area of the parent window now exposed will be refreshed. */ my_show_window (f, hwnd, SW_HIDE); - MoveWindow (hwnd, sb_left + VERTICAL_SCROLL_BAR_WIDTH_TRIM, - top, sb_width - VERTICAL_SCROLL_BAR_WIDTH_TRIM * 2, + MoveWindow (hwnd, sb_left, top, sb_width, max (height, 1), TRUE); si.cbSize = sizeof (si); @@ -4037,9 +3992,7 @@ w32_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg, y = si.nPos; bar->dragging = Qnil; - - - last_mouse_scroll_bar_pos = msg->msg.wParam; + FRAME_DISPLAY_INFO (f)->last_mouse_scroll_bar_pos = msg->msg.wParam; switch (LOWORD (msg->msg.wParam)) { @@ -4122,7 +4075,8 @@ x_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_window, Lisp_Object *x, Lisp_Object *y, unsigned long *time) { - struct scroll_bar *bar = XSCROLL_BAR (last_mouse_scroll_bar); + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (*fp); + struct scroll_bar *bar = dpyinfo->last_mouse_scroll_bar; Window w = SCROLL_BAR_W32_WINDOW (bar); struct frame *f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window))); int pos; @@ -4141,13 +4095,13 @@ x_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_window, pos = si.nPos; top_range = si.nMax - si.nPage + 1; - switch (LOWORD (last_mouse_scroll_bar_pos)) + switch (LOWORD (dpyinfo->last_mouse_scroll_bar_pos)) { case SB_THUMBPOSITION: case SB_THUMBTRACK: *part = scroll_bar_handle; if (VERTICAL_SCROLL_BAR_TOP_RANGE (f, XINT (bar->height)) <= 0xffff) - pos = HIWORD (last_mouse_scroll_bar_pos); + pos = HIWORD (dpyinfo->last_mouse_scroll_bar_pos); break; case SB_LINEDOWN: *part = scroll_bar_handle; @@ -4162,9 +4116,9 @@ x_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_window, XSETINT (*y, top_range); f->mouse_moved = 0; - last_mouse_scroll_bar = Qnil; + dpyinfo->last_mouse_scroll_bar = NULL; - *time = last_mouse_movement_time; + *time = dpyinfo->last_mouse_movement_time; unblock_input (); } @@ -4483,11 +4437,8 @@ w32_read_socket (struct terminal *terminal, previous_help_echo_string = help_echo_string; help_echo_string = Qnil; - if (dpyinfo->grabbed && last_mouse_frame - && FRAME_LIVE_P (last_mouse_frame)) - f = last_mouse_frame; - else - f = x_window_to_frame (dpyinfo, msg.msg.hwnd); + f = (x_mouse_grabbed (dpyinfo) ? dpyinfo->last_mouse_frame + : x_window_to_frame (dpyinfo, msg.msg.hwnd)); if (hlinfo->mouse_face_hidden) { @@ -4563,11 +4514,8 @@ w32_read_socket (struct terminal *terminal, int button; int up; - if (dpyinfo->grabbed && last_mouse_frame - && FRAME_LIVE_P (last_mouse_frame)) - f = last_mouse_frame; - else - f = x_window_to_frame (dpyinfo, msg.msg.hwnd); + f = (x_mouse_grabbed (dpyinfo) ? dpyinfo->last_mouse_frame + : x_window_to_frame (dpyinfo, msg.msg.hwnd)); if (f) { @@ -4606,7 +4554,7 @@ w32_read_socket (struct terminal *terminal, else { dpyinfo->grabbed |= (1 << button); - last_mouse_frame = f; + dpyinfo->last_mouse_frame = f; /* Ignore any mouse motion that happened before this event; any subsequent mouse-movement Emacs events should reflect only motion after @@ -4623,11 +4571,8 @@ w32_read_socket (struct terminal *terminal, case WM_MOUSEWHEEL: case WM_MOUSEHWHEEL: { - if (dpyinfo->grabbed && last_mouse_frame - && FRAME_LIVE_P (last_mouse_frame)) - f = last_mouse_frame; - else - f = x_window_to_frame (dpyinfo, msg.msg.hwnd); + f = (x_mouse_grabbed (dpyinfo) ? dpyinfo->last_mouse_frame + : x_window_to_frame (dpyinfo, msg.msg.hwnd)); if (f) { @@ -4644,7 +4589,7 @@ w32_read_socket (struct terminal *terminal, ButtonPress. */ f->mouse_moved = 0; } - last_mouse_frame = f; + dpyinfo->last_mouse_frame = f; last_tool_bar_item = -1; } break; @@ -4691,13 +4636,7 @@ w32_read_socket (struct terminal *terminal, f = x_window_to_frame (dpyinfo, msg.msg.hwnd); if (f && !FRAME_ICONIFIED_P (f)) - { - int x, y; - - x_real_positions (f, &x, &y); - f->left_pos = x; - f->top_pos = y; - } + x_real_positions (f, &f->left_pos, &f->top_pos); check_visibility = 1; break; @@ -4709,7 +4648,7 @@ w32_read_socket (struct terminal *terminal, if (!msg.msg.wParam && msg.msg.hwnd == tip_window) { tip_window = NULL; - redo_mouse_highlight (); + x_redo_mouse_highlight (dpyinfo); } /* If window has been obscured or exposed by another window @@ -4760,16 +4699,12 @@ w32_read_socket (struct terminal *terminal, if (iconified) { - int x, y; - /* Reset top and left positions of the Window here since Windows sends a WM_MOVE message BEFORE telling us the Window is minimized when the Window is iconified, with 3000,3000 as the co-ords. */ - x_real_positions (f, &x, &y); - f->left_pos = x; - f->top_pos = y; + x_real_positions (f, &f->left_pos, &f->top_pos); inev.kind = DEICONIFY_EVENT; XSETFRAME (inev.frame_or_window, f); @@ -4982,12 +4917,11 @@ w32_read_socket (struct terminal *terminal, } /* If the focus was just given to an autoraising frame, - raise it now. */ - /* ??? This ought to be able to handle more than one such frame. */ - if (pending_autoraise_frame) + raise it now. FIXME: handle more than one such frame. */ + if (dpyinfo->w32_pending_autoraise_frame) { - x_raise_frame (pending_autoraise_frame); - pending_autoraise_frame = 0; + x_raise_frame (dpyinfo->w32_pending_autoraise_frame); + dpyinfo->w32_pending_autoraise_frame = NULL; } /* Check which frames are still visible, if we have enqueued any user @@ -5539,13 +5473,13 @@ x_calc_absolute_position (struct frame *f) /* Treat negative positions as relative to the rightmost bottommost position that fits on the screen. */ if (flags & XNegative) - f->left_pos = (x_display_pixel_width (FRAME_W32_DISPLAY_INFO (f)) + f->left_pos = (x_display_pixel_width (FRAME_DISPLAY_INFO (f)) - FRAME_PIXEL_WIDTH (f) + f->left_pos - (left_right_borders_width - 1)); if (flags & YNegative) - f->top_pos = (x_display_pixel_height (FRAME_W32_DISPLAY_INFO (f)) + f->top_pos = (x_display_pixel_height (FRAME_DISPLAY_INFO (f)) - FRAME_PIXEL_HEIGHT (f) + f->top_pos - (top_bottom_borders_height - 1)); @@ -5806,7 +5740,7 @@ x_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y) /* focus shifting, raising and lowering. */ void -x_focus_on_frame (struct frame *f) +x_focus_frame (struct frame *f) { struct w32_display_info *dpyinfo = &one_w32_display_info; @@ -5920,13 +5854,9 @@ w32_frame_raise_lower (struct frame *f, int raise_flag) void x_make_frame_visible (struct frame *f) { - Lisp_Object type; - block_input (); - type = x_icon_type (f); - if (!NILP (type)) - x_bitmap_icon (f, type); + x_set_bitmap_icon (f); if (! FRAME_VISIBLE_P (f)) { @@ -6013,8 +5943,8 @@ void x_make_frame_invisible (struct frame *f) { /* Don't keep the highlight on an invisible frame. */ - if (FRAME_W32_DISPLAY_INFO (f)->x_highlight_frame == f) - FRAME_W32_DISPLAY_INFO (f)->x_highlight_frame = 0; + if (FRAME_DISPLAY_INFO (f)->x_highlight_frame == f) + FRAME_DISPLAY_INFO (f)->x_highlight_frame = 0; block_input (); @@ -6036,20 +5966,16 @@ x_make_frame_invisible (struct frame *f) void x_iconify_frame (struct frame *f) { - Lisp_Object type; - /* Don't keep the highlight on an invisible frame. */ - if (FRAME_W32_DISPLAY_INFO (f)->x_highlight_frame == f) - FRAME_W32_DISPLAY_INFO (f)->x_highlight_frame = 0; + if (FRAME_DISPLAY_INFO (f)->x_highlight_frame == f) + FRAME_DISPLAY_INFO (f)->x_highlight_frame = 0; if (FRAME_ICONIFIED_P (f)) return; block_input (); - type = x_icon_type (f); - if (!NILP (type)) - x_bitmap_icon (f, type); + x_set_bitmap_icon (f); /* Simulate the user minimizing the frame. */ SendMessage (FRAME_W32_WINDOW (f), WM_SYSCOMMAND, SC_MINIMIZE, 0); @@ -6066,7 +5992,7 @@ x_iconify_frame (struct frame *f) void x_free_frame_resources (struct frame *f) { - struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f); + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f); block_input (); @@ -6116,7 +6042,7 @@ x_free_frame_resources (struct frame *f) void x_destroy_window (struct frame *f) { - struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f); + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); x_free_frame_resources (f); dpyinfo->reference_count--; @@ -6258,11 +6184,6 @@ w32_make_rdb (char *xrm_option) return buffer; } -void -x_flush (struct frame * f) -{ /* Nothing to do */ } - - extern frame_parm_handler w32_frame_parm_handlers[]; static struct redisplay_interface w32_redisplay_interface = @@ -6276,8 +6197,7 @@ static struct redisplay_interface w32_redisplay_interface = x_after_update_window_line, x_update_window_begin, x_update_window_end, - x_flush, - 0, /* flush_display_optional */ + 0, /* flush_display */ x_clear_window_mouse_face, x_get_glyph_overhangs, x_fix_overlapping_area, @@ -6344,7 +6264,7 @@ w32_create_terminal (struct w32_display_info *dpyinfo) terminal like X does. */ terminal->kboard = xmalloc (sizeof (KBOARD)); init_kboard (terminal->kboard); - kset_window_system (terminal->kboard, intern ("w32")); + kset_window_system (terminal->kboard, Qw32); terminal->kboard->next_kboard = all_kboards; all_kboards = terminal->kboard; /* Don't let the initial kboard remain current longer than necessary. @@ -6608,9 +6528,6 @@ syms_of_w32term (void) staticpro (&w32_display_name_list); w32_display_name_list = Qnil; - staticpro (&last_mouse_scroll_bar); - last_mouse_scroll_bar = Qnil; - DEFSYM (Qvendor_specific_keysyms, "vendor-specific-keysyms"); DEFSYM (Qadded, "added"); @@ -6694,8 +6611,6 @@ X toolkit. Possible values are: gtk, motif, xaw, or xaw3d. With MS Windows or Nextstep, the value is t. */); Vx_toolkit_scroll_bars = Qt; - staticpro (&last_mouse_motion_frame); - last_mouse_motion_frame = Qnil; - - Fprovide (intern_c_string ("w32"), Qnil); + /* Tell Emacs about this window system. */ + Fprovide (Qw32, Qnil); } diff --git a/src/w32term.h b/src/w32term.h index e65c1146294..095ca54e3e8 100644 --- a/src/w32term.h +++ b/src/w32term.h @@ -179,6 +179,37 @@ struct w32_display_info frame. It differs from w32_focus_frame when we're using a global minibuffer. */ struct frame *x_highlight_frame; + + /* The frame waiting to be auto-raised in w32_read_socket. */ + struct frame *w32_pending_autoraise_frame; + + /* The frame where the mouse was last time we reported a mouse event. */ + struct frame *last_mouse_frame; + + /* The frame where the mouse was last time we reported a mouse motion. */ + struct frame *last_mouse_motion_frame; + + /* The frame where the mouse was last time we reported a mouse position. */ + struct frame *last_mouse_glyph_frame; + + /* Position where the mouse was last time we reported a motion. + This is a position on last_mouse_motion_frame. */ + int last_mouse_motion_x; + int last_mouse_motion_y; + + /* Where the mouse was last time we reported a mouse position. + This is a rectangle on last_mouse_glyph_frame. */ + RECT last_mouse_glyph; + + /* The scroll bar in which the last motion event occurred. */ + struct scroll_bar *last_mouse_scroll_bar; + + /* Mouse position on the scroll bar above. + FIXME: shouldn't it be a member of struct scroll_bar? */ + int last_mouse_scroll_bar_pos; + + /* Time of last mouse movement. */ + Time last_mouse_movement_time; }; /* This is a chain of structures for all the displays currently in use. */ @@ -199,8 +230,6 @@ Lisp_Object display_x_get_resource (struct w32_display_info *, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object); -extern void x_focus_on_frame (struct frame *f); - /* also defined in xterm.h XXX: factor out to common header */ extern struct w32_display_info *w32_term_init (Lisp_Object, @@ -211,7 +240,6 @@ extern void x_set_window_size (struct frame *f, int change_grav, int cols, int rows); extern int x_display_pixel_height (struct w32_display_info *); extern int x_display_pixel_width (struct w32_display_info *); -extern void x_sync (struct frame *); extern Lisp_Object x_get_focus_frame (struct frame *); extern void x_set_mouse_position (struct frame *f, int h, int v); extern void x_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y); @@ -384,22 +412,11 @@ extern struct w32_output w32term_display; #define FRAME_BASELINE_OFFSET(f) ((f)->output_data.w32->baseline_offset) /* This gives the w32_display_info structure for the display F is on. */ -#define FRAME_W32_DISPLAY_INFO(f) (&one_w32_display_info) -#define FRAME_X_DISPLAY_INFO(f) (&one_w32_display_info) +#define FRAME_DISPLAY_INFO(f) (&one_w32_display_info) /* This is the `Display *' which frame F is on. */ #define FRAME_X_DISPLAY(f) (0) -/* Value is the smallest width of any character in any font on frame F. */ - -#define FRAME_SMALLEST_CHAR_WIDTH(F) \ - FRAME_W32_DISPLAY_INFO(F)->smallest_char_width - -/* Value is the smallest height of any font on frame F. */ - -#define FRAME_SMALLEST_FONT_HEIGHT(F) \ - FRAME_W32_DISPLAY_INFO(F)->smallest_font_height - #define FRAME_NORMAL_PLACEMENT(F) ((F)->output_data.w32->normal_placement) #define FRAME_PREV_FSMODE(F) ((F)->output_data.w32->prev_fsmode) @@ -491,21 +508,12 @@ struct scroll_bar { #define SET_SCROLL_BAR_W32_WINDOW(ptr, id) \ (SCROLL_BAR_UNPACK ((ptr)->w32_window_low, (ptr)->w32_window_high, (intptr_t) id)) -/* Extract the X widget of the scroll bar from a struct scroll_bar. */ -#define SCROLL_BAR_X_WIDGET(ptr) \ - ((Widget) SCROLL_BAR_PACK ((ptr)->x_widget_low, (ptr)->x_widget_high)) - -/* Store a widget id in a struct scroll_bar. */ -#define SET_SCROLL_BAR_X_WIDGET(ptr, w) \ - (SCROLL_BAR_UNPACK ((ptr)->x_widget_low, (ptr)->x_widget_high, (int) w)) - /* Return the inside width of a vertical scroll bar, given the outside width. */ #define VERTICAL_SCROLL_BAR_INSIDE_WIDTH(f,width) \ ((width) \ - VERTICAL_SCROLL_BAR_LEFT_BORDER \ - - VERTICAL_SCROLL_BAR_RIGHT_BORDER \ - - VERTICAL_SCROLL_BAR_WIDTH_TRIM * 2) + - VERTICAL_SCROLL_BAR_RIGHT_BORDER) /* Return the length of the rectangle within which the top of the handle must stay. This isn't equivalent to the inside height, @@ -542,11 +550,6 @@ struct scroll_bar { /* Minimum lengths for scroll bar handles, in pixels. */ #define VERTICAL_SCROLL_BAR_MIN_HANDLE (vertical_scroll_bar_min_handle) -/* Trimming off a few pixels from each side prevents - text from glomming up against the scroll bar */ -#define VERTICAL_SCROLL_BAR_WIDTH_TRIM (0) - - struct frame; /* from frame.h */ extern void w32_fill_rect (struct frame *, HDC, COLORREF, RECT *); diff --git a/src/w32xfns.c b/src/w32xfns.c index 19c6b72bf89..07f75477863 100644 --- a/src/w32xfns.c +++ b/src/w32xfns.c @@ -92,7 +92,7 @@ signal_quit (void) void select_palette (struct frame *f, HDC hdc) { - struct w32_display_info *display_info = FRAME_W32_DISPLAY_INFO (f); + struct w32_display_info *display_info = FRAME_DISPLAY_INFO (f); if (!display_info->has_palette) return; @@ -333,9 +333,3 @@ drain_message_queue (void) } return retval; } - -/* x_sync is a no-op on W32. */ -void -x_sync (struct frame *f) -{ -} diff --git a/src/widget.c b/src/widget.c index ec0b506046b..d6469d7eec5 100644 --- a/src/widget.c +++ b/src/widget.c @@ -525,7 +525,7 @@ setup_frame_gcs (EmacsFrame ew) font = Ffont_xlfd_name (font, Qnil); if (STRINGP (font)) { - XFontStruct *xfont = XLoadQueryFont (FRAME_X_DISPLAY_INFO (s)->display, + XFontStruct *xfont = XLoadQueryFont (FRAME_DISPLAY_INFO (s)->display, SSDATA (font)); if (xfont) { diff --git a/src/window.c b/src/window.c index 6828f5d0792..670369cd322 100644 --- a/src/window.c +++ b/src/window.c @@ -20,8 +20,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> -#define WINDOW_INLINE EXTERN_INLINE - #include <stdio.h> #include "lisp.h" @@ -39,19 +37,12 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "blockinput.h" #include "intervals.h" #include "termhooks.h" /* For FRAME_TERMINAL. */ - -#ifdef HAVE_X_WINDOWS -#include "xterm.h" -#endif /* HAVE_X_WINDOWS */ -#ifdef HAVE_NTGUI -#include "w32term.h" -#endif +#ifdef HAVE_WINDOW_SYSTEM +#include TERM_HEADER +#endif /* HAVE_WINDOW_SYSTEM */ #ifdef MSDOS #include "msdos.h" #endif -#ifdef HAVE_NS -#include "nsterm.h" -#endif Lisp_Object Qwindowp, Qwindow_live_p; static Lisp_Object Qwindow_valid_p; @@ -1386,6 +1377,7 @@ window_from_coordinates (struct frame *f, int x, int y, cw.window = &window, cw.x = x, cw.y = y; cw.part = part; foreach_window (f, check_window_containing, &cw); +#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS) /* If not found above, see if it's in the tool bar window, if a tool bar exists. */ if (NILP (window) @@ -1398,6 +1390,7 @@ window_from_coordinates (struct frame *f, int x, int y, *part = ON_TEXT; window = f->tool_bar_window; } +#endif return window; } @@ -2952,7 +2945,7 @@ window-start value is reasonable when this function is called. */) } } - adjust_glyphs (f); + adjust_frame_glyphs (f); unblock_input (); run_window_configuration_change_hook (f); @@ -3426,6 +3419,7 @@ make_window (void) non-Lisp data, so do it only for slots which should not be zero. */ w->nrows_scale_factor = w->ncols_scale_factor = 1; w->left_fringe_width = w->right_fringe_width = -1; + w->mode_line_height = w->header_line_height = -1; w->phys_cursor_type = -1; w->phys_cursor_width = -1; w->scroll_bar_width = -1; @@ -3651,7 +3645,7 @@ be applied on the Elisp level. */) windows_or_buffers_changed++; FRAME_WINDOW_SIZES_CHANGED (f) = 1; - adjust_glyphs (f); + adjust_frame_glyphs (f); unblock_input (); run_window_configuration_change_hook (f); @@ -3921,7 +3915,7 @@ set correctly. See the code of `split-window' for how this is done. */) block_input (); window_resize_apply (p, horflag); - adjust_glyphs (f); + adjust_frame_glyphs (f); /* Set buffer of NEW to buffer of reference window. Don't run any hooks. */ set_window_buffer (new, r->contents, 0, 1); @@ -4050,7 +4044,7 @@ Signal an error when WINDOW is the only window on its frame. */) recombine_windows (sibling); } - adjust_glyphs (f); + adjust_frame_glyphs (f); if (!WINDOW_LIVE_P (FRAME_SELECTED_WINDOW (f))) /* We deleted the frame's selected window. */ @@ -4137,7 +4131,7 @@ grow_mini_window (struct window *w, int delta) w->total_lines -= XINT (value); /* Enforce full redisplay. FIXME: make it more selective. */ windows_or_buffers_changed++; - adjust_glyphs (f); + adjust_frame_glyphs (f); unblock_input (); } } @@ -4171,7 +4165,7 @@ shrink_mini_window (struct window *w) w->total_lines = 1; /* Enforce full redisplay. FIXME: make it more selective. */ windows_or_buffers_changed++; - adjust_glyphs (f); + adjust_frame_glyphs (f); unblock_input (); } /* If the above failed for whatever strange reason we must make a @@ -4212,7 +4206,7 @@ DEFUN ("resize-mini-window-internal", Fresize_mini_window_internal, Sresize_mini windows_or_buffers_changed++; FRAME_WINDOW_SIZES_CHANGED (f) = 1; - adjust_glyphs (f); + adjust_frame_glyphs (f); unblock_input (); run_window_configuration_change_hook (f); @@ -4483,7 +4477,7 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, int noerror) visible. */ w->vscroll = (it.last_visible_y - it.current_y + it.max_ascent + it.max_descent); - adjust_glyphs (it.f); + adjust_frame_glyphs (it.f); } else { @@ -5118,9 +5112,9 @@ and redisplay normally--don't erase and redraw the frame. */) /* Invalidate pixel data calculated for all compositions. */ for (i = 0; i < n_compositions; i++) composition_table[i]->font = NULL; - +#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS) WINDOW_XFRAME (w)->minimize_tool_bar_window_p = 1; - +#endif Fredraw_frame (WINDOW_FRAME (w)); SET_FRAME_GARBAGED (WINDOW_XFRAME (w)); } @@ -5407,7 +5401,7 @@ struct saved_window }; #define SAVED_WINDOW_N(swv,n) \ - ((struct saved_window *) (XVECTOR ((swv)->contents[(n)]))) + ((struct saved_window *) (XVECTOR ((swv)->u.contents[(n)]))) DEFUN ("window-configuration-p", Fwindow_configuration_p, Swindow_configuration_p, 1, 1, 0, doc: /* Return t if OBJECT is a window-configuration object. */) @@ -5773,7 +5767,7 @@ the return value is nil. Otherwise the value is t. */) ++n; } - adjust_glyphs (f); + adjust_frame_glyphs (f); unblock_input (); /* Scan dead buffer windows. */ @@ -6102,7 +6096,7 @@ apply_window_adjustment (struct window *w) clear_glyph_matrix (w->current_matrix); w->window_end_valid = 0; windows_or_buffers_changed++; - adjust_glyphs (XFRAME (WINDOW_FRAME (w))); + adjust_frame_glyphs (XFRAME (WINDOW_FRAME (w))); } @@ -6368,7 +6362,7 @@ If PIXELS-P is non-nil, the return value is VSCROLL. */) /* Adjust glyph matrix of the frame if the virtual display area becomes larger than before. */ if (w->vscroll < 0 && w->vscroll < old_dy) - adjust_glyphs (f); + adjust_frame_glyphs (f); /* Prevent redisplay shortcuts. */ XBUFFER (w->contents)->prevent_redisplay_optimizations_p = 1; @@ -6524,7 +6518,6 @@ init_window_once (void) Vterminal_frame = selected_frame; minibuf_window = f->minibuffer_window; selected_window = f->selected_window; - last_nonminibuf_frame = f; window_initialized = 1; } diff --git a/src/window.h b/src/window.h index efe03737052..6d2478ecaf9 100644 --- a/src/window.h +++ b/src/window.h @@ -23,9 +23,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "dispextern.h" INLINE_HEADER_BEGIN -#ifndef WINDOW_INLINE -# define WINDOW_INLINE INLINE -#endif /* Windows are allocated as if they were vectors, but then the Lisp data type is changed to Lisp_Window. They are garbage @@ -264,6 +261,12 @@ struct window A value of -1 means use frame values. */ int scroll_bar_width; + /* Effective height of the mode line, or -1 if not known. */ + int mode_line_height; + + /* Effective height of the header line, or -1 if not known. */ + int header_line_height; + /* Z - the buffer position of the last glyph in the current matrix of W. Only valid if window_end_valid is nonzero. */ ptrdiff_t window_end_pos; @@ -343,37 +346,37 @@ struct window /* Most code should use these functions to set Lisp fields in struct window. */ -WINDOW_INLINE void +INLINE void wset_frame (struct window *w, Lisp_Object val) { w->frame = val; } -WINDOW_INLINE void +INLINE void wset_next (struct window *w, Lisp_Object val) { w->next = val; } -WINDOW_INLINE void +INLINE void wset_prev (struct window *w, Lisp_Object val) { w->prev = val; } -WINDOW_INLINE void +INLINE void wset_redisplay_end_trigger (struct window *w, Lisp_Object val) { w->redisplay_end_trigger = val; } -WINDOW_INLINE void +INLINE void wset_vertical_scroll_bar (struct window *w, Lisp_Object val) { w->vertical_scroll_bar = val; } -WINDOW_INLINE void +INLINE void wset_prev_buffers (struct window *w, Lisp_Object val) { w->prev_buffers = val; } -WINDOW_INLINE void +INLINE void wset_next_buffers (struct window *w, Lisp_Object val) { w->next_buffers = val; @@ -519,10 +522,13 @@ wset_next_buffers (struct window *w, Lisp_Object val) #endif /* 1 if W is a tool bar window. */ - +#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS) #define WINDOW_TOOL_BAR_P(W) \ (WINDOWP (WINDOW_XFRAME (W)->tool_bar_window) \ && (W) == XWINDOW (WINDOW_XFRAME (W)->tool_bar_window)) +#else +#define WINDOW_TOOL_BAR_P(W) (0) +#endif /* Return the frame y-position at which window W starts. This includes a header line, if any. */ @@ -957,7 +963,7 @@ extern void keys_of_window (void); window update, so the position is the future output cursor position for currently updated window W. */ -WINDOW_INLINE void +INLINE void output_cursor_to (struct window *w, int vpos, int hpos, int y, int x) { eassert (w); diff --git a/src/xdisp.c b/src/xdisp.c index 139218ae1dd..ce6cd8f080e 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -1,7 +1,6 @@ /* Display generation from window structure and buffer text. -Copyright (C) 1985-1988, 1993-1995, 1997-2013 Free Software Foundation, -Inc. +Copyright (C) 1985-1988, 1993-1995, 1997-2013 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -299,19 +298,9 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "font.h" #include "fontset.h" #include "blockinput.h" - -#ifdef HAVE_X_WINDOWS -#include "xterm.h" -#endif -#ifdef HAVE_NTGUI -#include "w32term.h" -#endif -#ifdef HAVE_NS -#include "nsterm.h" -#endif -#ifdef USE_GTK -#include "gtkutil.h" -#endif +#ifdef HAVE_WINDOW_SYSTEM +#include TERM_HEADER +#endif /* HAVE_WINDOW_SYSTEM */ #ifndef FRAME_X_OUTPUT #define FRAME_X_OUTPUT(f) ((f)->output_data.x) @@ -426,11 +415,11 @@ Lisp_Object Qboth, Qboth_horiz, Qtext_image_horiz; /* Non-zero means print newline to stdout before next mini-buffer message. */ -int noninteractive_need_newline; +bool noninteractive_need_newline; /* Non-zero means print newline to message log before next message. */ -static int message_log_need_newline; +static bool message_log_need_newline; /* Three markers that message_dolog uses. It could allocate them itself, but that causes trouble @@ -489,7 +478,7 @@ Lisp_Object Qmenu_bar_update_hook; /* Nonzero if an overlay arrow has been displayed in this window. */ -static int overlay_arrow_seen; +static bool overlay_arrow_seen; /* Vector containing glyphs for an ellipsis `...'. */ @@ -511,7 +500,7 @@ static Lisp_Object Vmessage_stack; /* Nonzero means multibyte characters were enabled when the echo area message was specified. */ -static int message_enable_multibyte; +static bool message_enable_multibyte; /* Nonzero if we should redraw the mode lines on the next redisplay. */ @@ -522,14 +511,10 @@ int update_mode_lines; int windows_or_buffers_changed; -/* Nonzero means a frame's cursor type has been changed. */ - -static int cursor_type_changed; - /* Nonzero after display_mode_line if %l was used and it displayed a line number. */ -static int line_number_displayed; +static bool line_number_displayed; /* The name of the *Messages* buffer, a string. */ @@ -551,12 +536,12 @@ static Lisp_Object Vwith_echo_area_save_vector; /* Non-zero means display_echo_area should display the last echo area message again. Set by redisplay_preserve_echo_area. */ -static int display_last_displayed_message_p; +static bool display_last_displayed_message_p; /* Nonzero if echo area is being used by print; zero if being used by message. */ -static int message_buf_print; +static bool message_buf_print; /* The symbol `inhibit-menubar-update' and its DEFVAR_BOOL variable. */ @@ -566,7 +551,7 @@ static Lisp_Object Qmessage_truncate_lines; /* Set to 1 in clear_message to make redisplay_internal aware of an emptied echo area. */ -static int message_cleared_p; +static bool message_cleared_p; /* A scratch glyph row with contents used for generating truncation glyphs. Also used in direct_output_for_insert. */ @@ -581,13 +566,7 @@ static int last_height; /* Non-zero if there's a help-echo in the echo area. */ -int help_echo_showing_p; - -/* If >= 0, computed, exact values of mode-line and header-line height - to use in the macros CURRENT_MODE_LINE_HEIGHT and - CURRENT_HEADER_LINE_HEIGHT. */ - -int current_mode_line_height, current_header_line_height; +bool help_echo_showing_p; /* The maximum distance to look ahead for text properties. Values that are too small let us call compute_char_face and similar @@ -763,7 +742,7 @@ Lisp_Object previous_help_echo_string; #ifdef HAVE_WINDOW_SYSTEM /* Non-zero means an hourglass cursor is currently shown. */ -int hourglass_shown_p; +bool hourglass_shown_p; /* If non-null, an asynchronous timer that, when it expires, displays an hourglass cursor on all frames. */ @@ -933,11 +912,8 @@ static int in_ellipses_for_invisible_text_p (struct display_pos *, #ifdef HAVE_WINDOW_SYSTEM static void x_consider_frame_title (Lisp_Object); -static int tool_bar_lines_needed (struct frame *, int *); static void update_tool_bar (struct frame *, int); -static void build_desired_tool_bar_string (struct frame *f); static int redisplay_tool_bar (struct frame *); -static void display_tool_bar_line (struct it *, int); static void notice_overwritten_cursor (struct window *, enum glyph_row_area, int, int, int, int); @@ -1359,12 +1335,12 @@ pos_visible_p (struct window *w, ptrdiff_t charpos, int *x, int *y, /* Compute exact mode line heights. */ if (WINDOW_WANTS_MODELINE_P (w)) - current_mode_line_height + w->mode_line_height = display_mode_line (w, CURRENT_MODE_LINE_FACE_ID (w), BVAR (current_buffer, mode_line_format)); if (WINDOW_WANTS_HEADER_LINE_P (w)) - current_header_line_height + w->header_line_height = display_mode_line (w, HEADER_LINE_FACE_ID, BVAR (current_buffer, header_line_format)); @@ -1657,8 +1633,6 @@ pos_visible_p (struct window *w, ptrdiff_t charpos, int *x, int *y, if (old_buffer) set_buffer_internal_1 (old_buffer); - current_header_line_height = current_mode_line_height = -1; - if (visible_p && w->hscroll > 0) *x -= window_hscroll_limited (w, WINDOW_XFRAME (w)) @@ -1908,8 +1882,7 @@ pixel_to_glyph_coords (struct frame *f, register int pix_x, register int pix_y, text, or we can't tell because W's current matrix is not up to date. */ -static -struct glyph * +static struct glyph * x_y_to_hpos_vpos (struct window *w, int x, int y, int *hpos, int *vpos, int *dx, int *dy, int *area) { @@ -4500,8 +4473,8 @@ setup_for_ellipsis (struct it *it, int len) if (it->dp && VECTORP (DISP_INVIS_VECTOR (it->dp))) { struct Lisp_Vector *v = XVECTOR (DISP_INVIS_VECTOR (it->dp)); - it->dpvec = v->contents; - it->dpend = v->contents + v->header.size; + it->dpvec = v->u.contents; + it->dpend = v->u.contents + v->header.size; } else { @@ -6688,17 +6661,59 @@ lookup_glyphless_char_display (int c, struct it *it) return glyphless_method; } -/* Load IT's display element fields with information about the next - display element from the current position of IT. Value is zero if - end of buffer (or C string) is reached. */ +/* Merge escape glyph face and cache the result. */ static struct frame *last_escape_glyph_frame = NULL; static int last_escape_glyph_face_id = (1 << FACE_ID_BITS); static int last_escape_glyph_merged_face_id = 0; -struct frame *last_glyphless_glyph_frame = NULL; -int last_glyphless_glyph_face_id = (1 << FACE_ID_BITS); -int last_glyphless_glyph_merged_face_id = 0; +static int +merge_escape_glyph_face (struct it *it) +{ + int face_id; + + if (it->f == last_escape_glyph_frame + && it->face_id == last_escape_glyph_face_id) + face_id = last_escape_glyph_merged_face_id; + else + { + /* Merge the `escape-glyph' face into the current face. */ + face_id = merge_faces (it->f, Qescape_glyph, 0, it->face_id); + last_escape_glyph_frame = it->f; + last_escape_glyph_face_id = it->face_id; + last_escape_glyph_merged_face_id = face_id; + } + return face_id; +} + +/* Likewise for glyphless glyph face. */ + +static struct frame *last_glyphless_glyph_frame = NULL; +static int last_glyphless_glyph_face_id = (1 << FACE_ID_BITS); +static int last_glyphless_glyph_merged_face_id = 0; + +int +merge_glyphless_glyph_face (struct it *it) +{ + int face_id; + + if (it->f == last_glyphless_glyph_frame + && it->face_id == last_glyphless_glyph_face_id) + face_id = last_glyphless_glyph_merged_face_id; + else + { + /* Merge the `glyphless-char' face into the current face. */ + face_id = merge_faces (it->f, Qglyphless_char, 0, it->face_id); + last_glyphless_glyph_frame = it->f; + last_glyphless_glyph_face_id = it->face_id; + last_glyphless_glyph_merged_face_id = face_id; + } + return face_id; +} + +/* Load IT's display element fields with information about the next + display element from the current position of IT. Value is zero if + end of buffer (or C string) is reached. */ static int get_next_display_element (struct it *it) @@ -6763,8 +6778,8 @@ get_next_display_element (struct it *it) if (v->header.size) { it->dpvec_char_len = it->len; - it->dpvec = v->contents; - it->dpend = v->contents + v->header.size; + it->dpvec = v->u.contents; + it->dpend = v->u.contents + v->header.size; it->current.dpvec_index = 0; it->dpvec_face_id = -1; it->saved_face_id = it->face_id; @@ -6846,24 +6861,10 @@ get_next_display_element (struct it *it) g = GLYPH_CODE_CHAR (gc); lface_id = GLYPH_CODE_FACE (gc); } - if (lface_id) - { - face_id = merge_faces (it->f, Qt, lface_id, it->face_id); - } - else if (it->f == last_escape_glyph_frame - && it->face_id == last_escape_glyph_face_id) - { - face_id = last_escape_glyph_merged_face_id; - } - else - { - /* Merge the escape-glyph face into the current face. */ - face_id = merge_faces (it->f, Qescape_glyph, 0, - it->face_id); - last_escape_glyph_frame = it->f; - last_escape_glyph_face_id = it->face_id; - last_escape_glyph_merged_face_id = face_id; - } + + face_id = (lface_id + ? merge_faces (it->f, Qt, lface_id, it->face_id) + : merge_escape_glyph_face (it)); XSETINT (it->ctl_chars[0], g); XSETINT (it->ctl_chars[1], c ^ 0100); @@ -6895,27 +6896,10 @@ get_next_display_element (struct it *it) escape_glyph = GLYPH_CODE_CHAR (gc); lface_id = GLYPH_CODE_FACE (gc); } - if (lface_id) - { - /* The display table specified a face. - Merge it into face_id and also into escape_glyph. */ - face_id = merge_faces (it->f, Qt, lface_id, - it->face_id); - } - else if (it->f == last_escape_glyph_frame - && it->face_id == last_escape_glyph_face_id) - { - face_id = last_escape_glyph_merged_face_id; - } - else - { - /* Merge the escape-glyph face into the current face. */ - face_id = merge_faces (it->f, Qescape_glyph, 0, - it->face_id); - last_escape_glyph_frame = it->f; - last_escape_glyph_face_id = it->face_id; - last_escape_glyph_merged_face_id = face_id; - } + + face_id = (lface_id + ? merge_faces (it->f, Qt, lface_id, it->face_id) + : merge_escape_glyph_face (it)); /* Draw non-ASCII hyphen with just highlighting: */ @@ -9552,7 +9536,20 @@ message_dolog (const char *m, ptrdiff_t nbytes, bool nlflag, bool multibyte) old_deactivate_mark = Vdeactivate_mark; oldbuf = current_buffer; - Fset_buffer (Fget_buffer_create (Vmessages_buffer_name)); + + /* Ensure the Messages buffer exists, and switch to it. + If we created it, set the major-mode. */ + { + int newbuffer = 0; + if (NILP (Fget_buffer (Vmessages_buffer_name))) newbuffer = 1; + + Fset_buffer (Fget_buffer_create (Vmessages_buffer_name)); + + if (newbuffer && + !NILP (Ffboundp (intern ("messages-buffer-mode")))) + call0 (intern ("messages-buffer-mode")); + } + bset_undo_list (current_buffer, Qt); oldpoint = message_dolog_marker1; @@ -10778,11 +10775,9 @@ clear_garbaged_frames (void) if (FRAME_VISIBLE_P (f) && FRAME_GARBAGED_P (f)) { if (f->resized_p) - { - redraw_frame (f); - f->force_flush_display_p = 1; - } - clear_current_matrices (f); + redraw_frame (f); + else + clear_current_matrices (f); changed_count++; f->garbaged = 0; f->resized_p = 0; @@ -10870,7 +10865,7 @@ echo_area_display (int update_frame_p) Can do with a display update of the echo area, unless we displayed some mode lines. */ update_single_window (w, 1); - FRAME_RIF (f)->flush_display (f); + flush_frame (f); } else update_frame (f, 1, 1); @@ -11458,10 +11453,6 @@ update_menu_bar (struct frame *f, int save_match_data, int hooks_run) #ifdef HAVE_WINDOW_SYSTEM -/* Where the mouse was last time we reported a mouse event. */ - -struct frame *last_mouse_frame; - /* Tool-bar item index of the item on which a mouse button was pressed or -1. */ @@ -11579,6 +11570,7 @@ update_tool_bar (struct frame *f, int save_match_data) } } +#if ! defined (USE_GTK) && ! defined (HAVE_NS) /* Set F->desired_tool_bar_string to a Lisp string representing frame F's desired tool-bar contents. F->tool_bar_items must have @@ -11916,6 +11908,11 @@ tool_bar_lines_needed (struct frame *f, int *n_rows) return (it.current_y + FRAME_LINE_HEIGHT (f) - 1) / FRAME_LINE_HEIGHT (f); } +#endif /* !USE_GTK && !HAVE_NS */ + +#if defined USE_GTK || defined HAVE_NS +EXFUN (Ftool_bar_lines_needed, 1) ATTRIBUTE_CONST; +#endif DEFUN ("tool-bar-lines-needed", Ftool_bar_lines_needed, Stool_bar_lines_needed, 0, 1, 0, @@ -11923,9 +11920,10 @@ DEFUN ("tool-bar-lines-needed", Ftool_bar_lines_needed, Stool_bar_lines_needed, If FRAME is nil or omitted, use the selected frame. */) (Lisp_Object frame) { + int nlines = 0; +#if ! defined (USE_GTK) && ! defined (HAVE_NS) struct frame *f = decode_any_frame (frame); struct window *w; - int nlines = 0; if (WINDOWP (f->tool_bar_window) && (w = XWINDOW (f->tool_bar_window), @@ -11938,7 +11936,7 @@ If FRAME is nil or omitted, use the selected frame. */) nlines = tool_bar_lines_needed (f, NULL); } } - +#endif return make_number (nlines); } @@ -11949,15 +11947,17 @@ If FRAME is nil or omitted, use the selected frame. */) static int redisplay_tool_bar (struct frame *f) { - struct window *w; - struct it it; - struct glyph_row *row; - #if defined (USE_GTK) || defined (HAVE_NS) + if (FRAME_EXTERNAL_TOOL_BAR (f)) update_frame_tool_bar (f); return 0; -#endif + +#else /* !USE_GTK && !HAVE_NS */ + + struct window *w; + struct it it; + struct glyph_row *row; /* If frame hasn't a tool-bar window or if it is zero-height, don't do anything. This means you must start with tool-bar-lines @@ -12003,7 +12003,7 @@ redisplay_tool_bar (struct frame *f) if (WINDOW_TOTAL_LINES (w) != old_height) { clear_glyph_matrix (w->desired_matrix); - fonts_changed_p = 1; + f->fonts_changed = 1; return 1; } } @@ -12104,7 +12104,7 @@ redisplay_tool_bar (struct frame *f) { clear_glyph_matrix (w->desired_matrix); f->n_tool_bar_rows = nrows; - fonts_changed_p = 1; + f->fonts_changed = 1; return 1; } } @@ -12113,8 +12113,11 @@ redisplay_tool_bar (struct frame *f) f->minimize_tool_bar_window_p = 0; return 0; + +#endif /* USE_GTK || HAVE_NS */ } +#if ! defined (USE_GTK) && ! defined (HAVE_NS) /* Get information about the tool-bar item which is displayed in GLYPH on frame F. Return in *PROP_IDX the index where tool-bar item @@ -12279,7 +12282,7 @@ note_tool_bar_highlight (struct frame *f, int x, int y) { Lisp_Object window = f->tool_bar_window; struct window *w = XWINDOW (window); - Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f); int hpos, vpos; struct glyph *glyph; @@ -12312,9 +12315,9 @@ note_tool_bar_highlight (struct frame *f, int x, int y) clear_mouse_face (hlinfo); /* Mouse is down, but on different tool-bar item? */ - mouse_down_p = (dpyinfo->grabbed - && f == last_mouse_frame - && FRAME_LIVE_P (f)); + mouse_down_p = (x_mouse_grabbed (dpyinfo) + && f == dpyinfo->last_mouse_frame); + if (mouse_down_p && last_tool_bar_item != prop_idx) return; @@ -12358,6 +12361,8 @@ note_tool_bar_highlight (struct frame *f, int x, int y) help_echo_string = AREF (f->tool_bar_items, prop_idx + TOOL_BAR_ITEM_CAPTION); } +#endif /* !USE_GTK && !HAVE_NS */ + #endif /* HAVE_WINDOW_SYSTEM */ @@ -12990,15 +12995,6 @@ redisplay_internal (void) last_glyphless_glyph_frame = NULL; last_glyphless_glyph_face_id = (1 << FACE_ID_BITS); - /* If new fonts have been loaded that make a glyph matrix adjustment - necessary, do it. */ - if (fonts_changed_p) - { - adjust_glyphs (NULL); - ++windows_or_buffers_changed; - fonts_changed_p = 0; - } - /* If face_change_count is non-zero, init_iterator will free all realized faces, which includes the faces referenced from current matrices. So, we can't reuse current matrices in this case. */ @@ -13029,7 +13025,19 @@ redisplay_internal (void) struct frame *f = XFRAME (frame); if (FRAME_VISIBLE_P (f)) - ++number_of_visible_frames; + { + ++number_of_visible_frames; + /* Adjust matrices for visible frames only. */ + if (f->fonts_changed) + { + adjust_frame_glyphs (f); + f->fonts_changed = 0; + } + /* If cursor type has been changed on the frame + other than selected, consider all frames. */ + if (f != sf && f->cursor_type_changed) + update_mode_lines++; + } clear_desired_matrices (f); } @@ -13078,8 +13086,7 @@ redisplay_internal (void) } consider_all_windows_p = (update_mode_lines - || buffer_shared_and_changed () - || cursor_type_changed); + || buffer_shared_and_changed ()); /* If specs for an arrow have changed, do thorough redisplay to ensure we remove any arrow that should no longer exist. */ @@ -13113,9 +13120,7 @@ redisplay_internal (void) if (!display_last_displayed_message_p) message_cleared_p = 0; - if (fonts_changed_p) - goto retry; - else if (window_height_changed_p) + if (window_height_changed_p) { consider_all_windows_p = 1; ++update_mode_lines; @@ -13172,6 +13177,7 @@ redisplay_internal (void) && !current_buffer->prevent_redisplay_optimizations_p && FRAME_VISIBLE_P (XFRAME (w->frame)) && !FRAME_OBSCURED_P (XFRAME (w->frame)) + && !XFRAME (w->frame)->cursor_type_changed /* Make sure recorded data applies to current buffer, etc. */ && this_line_buffer == current_buffer && match_p @@ -13390,6 +13396,8 @@ redisplay_internal (void) && !EQ (FRAME_TTY (f)->top_frame, frame)) continue; + retry_frame: + if (FRAME_WINDOW_P (f) || FRAME_TERMCAP_P (f) || f == sf) { /* Mark all the scroll bars to be removed; we'll redeem @@ -13409,20 +13417,22 @@ redisplay_internal (void) if (FRAME_TERMINAL (f)->judge_scroll_bars_hook) FRAME_TERMINAL (f)->judge_scroll_bars_hook (f); - /* If fonts changed, display again. */ - /* ??? rms: I suspect it is a mistake to jump all the way - back to retry here. It should just retry this frame. */ - if (fonts_changed_p) - goto retry; - if (FRAME_VISIBLE_P (f) && !FRAME_OBSCURED_P (f)) { + /* If fonts changed on visible frame, display again. */ + if (f->fonts_changed) + { + adjust_frame_glyphs (f); + f->fonts_changed = 0; + goto retry_frame; + } + /* See if we have to hscroll. */ if (!f->already_hscrolled_p) { f->already_hscrolled_p = 1; if (hscroll_windows (f->root_window)) - goto retry; + goto retry_frame; } /* Prevent various kinds of signals during display @@ -13436,6 +13446,7 @@ redisplay_internal (void) /* Update the display. */ set_window_update_flags (XWINDOW (f->root_window), 1); pending |= update_frame (f, 0, 0); + f->cursor_type_changed = 0; f->updated_p = 1; } } @@ -13480,7 +13491,7 @@ redisplay_internal (void) update: /* If fonts changed, display again. */ - if (fonts_changed_p) + if (sf->fonts_changed) goto retry; /* Prevent various kinds of signals during display update. @@ -13497,6 +13508,7 @@ redisplay_internal (void) XWINDOW (selected_window)->must_be_updated_p = 1; pending = update_frame (sf, 0, 0); + sf->cursor_type_changed = 0; } /* We may have called echo_area_display at the top of this @@ -13511,6 +13523,7 @@ redisplay_internal (void) { XWINDOW (mini_window)->must_be_updated_p = 1; pending |= update_frame (mini_frame, 0, 0); + mini_frame->cursor_type_changed = 0; if (!pending && hscroll_windows (mini_window)) goto retry; } @@ -13551,7 +13564,6 @@ redisplay_internal (void) update_mode_lines = 0; windows_or_buffers_changed = 0; - cursor_type_changed = 0; } /* Start SIGIO interrupts coming again. Having them off during the @@ -13649,9 +13661,7 @@ redisplay_preserve_echo_area (int from_where) else redisplay_internal (); - if (FRAME_RIF (SELECTED_FRAME ()) != NULL - && FRAME_RIF (SELECTED_FRAME ())->flush_display_optional) - FRAME_RIF (SELECTED_FRAME ())->flush_display_optional (NULL); + flush_frame (SELECTED_FRAME ()); } @@ -14993,7 +15003,7 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp, int *scroll_ste cases. */ && !update_mode_lines && !windows_or_buffers_changed - && !cursor_type_changed + && !f->cursor_type_changed /* Can't use this case if highlighting a region. When a region exists, cursor movement has to do more than just set the cursor. */ @@ -15340,9 +15350,8 @@ set_vertical_scroll_bar (struct window *w) /* Redisplay leaf window WINDOW. JUST_THIS_ONE_P non-zero means only selected_window is redisplayed. - We can return without actually redisplaying the window if - fonts_changed_p. In that case, redisplay_internal will - retry. */ + We can return without actually redisplaying the window if fonts has been + changed on window's frame. In that case, redisplay_internal will retry. */ static void redisplay_window (Lisp_Object window, int just_this_one_p) @@ -15727,7 +15736,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p) debug_method_add (w, "try_window_id %d", tem); #endif - if (fonts_changed_p) + if (f->fonts_changed) goto need_larger_matrices; if (tem > 0) goto done; @@ -15797,12 +15806,12 @@ redisplay_window (Lisp_Object window, int just_this_one_p) IF_DEBUG (debug_method_add (w, "1")); if (try_window (window, startp, TRY_WINDOW_CHECK_MARGINS) < 0) /* -1 means we need to scroll. - 0 means we need new matrices, but fonts_changed_p + 0 means we need new matrices, but fonts_changed is set in that case, so we will detect it below. */ goto try_to_scroll; } - if (fonts_changed_p) + if (f->fonts_changed) goto need_larger_matrices; if (w->cursor.vpos >= 0) @@ -15990,7 +15999,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p) /* Redisplay the window. */ if (!current_matrix_up_to_date_p || windows_or_buffers_changed - || cursor_type_changed + || f->cursor_type_changed /* Don't use try_window_reusing_current_matrix in this case because it can have changed the buffer. */ || !NILP (Vwindow_scroll_functions) @@ -16003,7 +16012,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p) /* If new fonts have been loaded (due to fontsets), give up. We have to start a new redisplay since we need to re-adjust glyph matrices. */ - if (fonts_changed_p) + if (f->fonts_changed) goto need_larger_matrices; /* If cursor did not appear assume that the middle of the window is @@ -16116,7 +16125,8 @@ redisplay_window (Lisp_Object window, int just_this_one_p) if (WINDOW_WANTS_MODELINE_P (w) && CURRENT_MODE_LINE_HEIGHT (w) != DESIRED_MODE_LINE_HEIGHT (w)) { - fonts_changed_p = 1; + f->fonts_changed = 1; + w->mode_line_height = -1; MATRIX_MODE_LINE_ROW (w->current_matrix)->height = DESIRED_MODE_LINE_HEIGHT (w); } @@ -16126,12 +16136,13 @@ redisplay_window (Lisp_Object window, int just_this_one_p) if (WINDOW_WANTS_HEADER_LINE_P (w) && CURRENT_HEADER_LINE_HEIGHT (w) != DESIRED_HEADER_LINE_HEIGHT (w)) { - fonts_changed_p = 1; + f->fonts_changed = 1; + w->header_line_height = -1; MATRIX_HEADER_LINE_ROW (w->current_matrix)->height = DESIRED_HEADER_LINE_HEIGHT (w); } - if (fonts_changed_p) + if (f->fonts_changed) goto need_larger_matrices; } @@ -16196,8 +16207,8 @@ redisplay_window (Lisp_Object window, int just_this_one_p) } #endif /* HAVE_WINDOW_SYSTEM */ - /* We go to this label, with fonts_changed_p set, - if it is necessary to try again using larger glyph matrices. + /* We go to this label, with fonts_changed set, if it is + necessary to try again using larger glyph matrices. We have to redeem the scroll bar even in this case, because the loop in redisplay_internal expects that. */ need_larger_matrices: @@ -16269,7 +16280,7 @@ try_window (Lisp_Object window, struct text_pos pos, int flags) { if (display_line (&it)) last_text_row = it.glyph_row - 1; - if (fonts_changed_p && !(flags & TRY_WINDOW_IGNORE_FONTS_CHANGE)) + if (f->fonts_changed && !(flags & TRY_WINDOW_IGNORE_FONTS_CHANGE)) return 0; } @@ -16367,7 +16378,7 @@ try_window_reusing_current_matrix (struct window *w) /* Don't try to reuse the display if windows have been split or such. */ || windows_or_buffers_changed - || cursor_type_changed) + || f->cursor_type_changed) return 0; /* Can't do this if region may have changed. */ @@ -16415,8 +16426,7 @@ try_window_reusing_current_matrix (struct window *w) w->cursor.vpos = -1; last_text_row = last_reused_text_row = NULL; - while (it.current_y < it.last_visible_y - && !fonts_changed_p) + while (it.current_y < it.last_visible_y && !f->fonts_changed) { /* If we have reached into the characters in the START row, that means the line boundaries have changed. So we @@ -16627,7 +16637,7 @@ try_window_reusing_current_matrix (struct window *w) if (pt_row == NULL) w->cursor.vpos = -1; last_text_row = NULL; - while (it.current_y < it.last_visible_y && !fonts_changed_p) + while (it.current_y < it.last_visible_y && !f->fonts_changed) if (display_line (&it)) last_text_row = it.glyph_row - 1; @@ -17139,7 +17149,7 @@ try_window_id (struct window *w) GIVE_UP (1); /* This flag is used to prevent redisplay optimizations. */ - if (windows_or_buffers_changed || cursor_type_changed) + if (windows_or_buffers_changed || f->cursor_type_changed) GIVE_UP (2); /* Verify that narrowing has not changed. @@ -17280,8 +17290,6 @@ try_window_id (struct window *w) row = row_containing_pos (w, PT, r0, NULL, 0); if (row) set_cursor_from_row (w, row, current_matrix, 0, 0, 0, 0); - else - emacs_abort (); return 1; } } @@ -17322,8 +17330,6 @@ try_window_id (struct window *w) row = row_containing_pos (w, PT, r0, NULL, 0); if (row) set_cursor_from_row (w, row, current_matrix, 0, 0, 0, 0); - else - emacs_abort (); return 2; } } @@ -17470,7 +17476,7 @@ try_window_id (struct window *w) last_text_row = NULL; overlay_arrow_seen = 0; while (it.current_y < it.last_visible_y - && !fonts_changed_p + && !f->fonts_changed && (first_unchanged_at_end_row == NULL || IT_CHARPOS (it) < stop_pos)) { @@ -17478,7 +17484,7 @@ try_window_id (struct window *w) last_text_row = it.glyph_row - 1; } - if (fonts_changed_p) + if (f->fonts_changed) return -1; @@ -17725,8 +17731,7 @@ try_window_id (struct window *w) /* Display the rest of the lines at the window end. */ it.glyph_row = MATRIX_ROW (desired_matrix, it.vpos); - while (it.current_y < it.last_visible_y - && !fonts_changed_p) + while (it.current_y < it.last_visible_y && !f->fonts_changed) { /* Is it always sure that the display agrees with lines in the current matrix? I don't think so, so we mark rows @@ -19262,7 +19267,7 @@ display_line (struct it *it) >= it->w->desired_matrix->nrows) { it->w->nrows_scale_factor++; - fonts_changed_p = 1; + it->f->fonts_changed = 1; return 0; } @@ -24111,12 +24116,12 @@ draw_glyphs (struct window *w, int x, struct glyph_row *row, #define IT_EXPAND_MATRIX_WIDTH(it, area) \ { \ - if (!fonts_changed_p \ + if (!it->f->fonts_changed \ && (it->glyph_row->glyphs[area] \ < it->glyph_row->glyphs[area + 1])) \ { \ it->w->ncols_scale_factor++; \ - fonts_changed_p = 1; \ + it->f->fonts_changed = 1; \ } \ } @@ -25032,21 +25037,7 @@ produce_glyphless_glyph (struct it *it, int for_no_font, Lisp_Object acronym) base_height = it->ascent + it->descent; base_width = font->average_width; - /* Get a face ID for the glyph by utilizing a cache (the same way as - done for `escape-glyph' in get_next_display_element). */ - if (it->f == last_glyphless_glyph_frame - && it->face_id == last_glyphless_glyph_face_id) - { - face_id = last_glyphless_glyph_merged_face_id; - } - else - { - /* Merge the `glyphless-char' face into the current face. */ - face_id = merge_faces (it->f, Qglyphless_char, 0, it->face_id); - last_glyphless_glyph_frame = it->f; - last_glyphless_glyph_face_id = it->face_id; - last_glyphless_glyph_merged_face_id = face_id; - } + face_id = merge_glyphless_glyph_face (it); if (it->glyphless_method == GLYPHLESS_DISPLAY_THIN_SPACE) { @@ -26087,7 +26078,7 @@ set_frame_cursor_types (struct frame *f, Lisp_Object arg) FRAME_BLINK_OFF_CURSOR (f) = DEFAULT_CURSOR; /* Make sure the cursor gets redrawn. */ - cursor_type_changed = 1; + f->cursor_type_changed = 1; } @@ -26138,7 +26129,7 @@ get_window_cursor_type (struct window *w, struct glyph *glyph, int *width, /* Detect a nonselected window or nonselected frame. */ else if (w != XWINDOW (f->selected_window) - || f != FRAME_X_DISPLAY_INFO (f)->x_highlight_frame) + || f != FRAME_DISPLAY_INFO (f)->x_highlight_frame) { *active_cursor = 0; @@ -26835,10 +26826,13 @@ show_mouse_face (Mouse_HLInfo *hlinfo, enum draw_glyphs_face draw) /* Change the mouse cursor. */ if (FRAME_WINDOW_P (f)) { +#if ! defined (USE_GTK) && ! defined (HAVE_NS) if (draw == DRAW_NORMAL_TEXT && !EQ (hlinfo->mouse_face_window, f->tool_bar_window)) FRAME_RIF (f)->define_frame_cursor (f, FRAME_X_OUTPUT (f)->text_cursor); - else if (draw == DRAW_MOUSE_FACE) + else +#endif + if (draw == DRAW_MOUSE_FACE) FRAME_RIF (f)->define_frame_cursor (f, FRAME_X_OUTPUT (f)->hand_cursor); else FRAME_RIF (f)->define_frame_cursor (f, FRAME_X_OUTPUT (f)->nontext_cursor); @@ -27507,7 +27501,7 @@ fast_find_string_pos (struct window *w, ptrdiff_t pos, Lisp_Object object, #endif /* not used */ /* Find the positions of the first and the last glyphs in window W's - current matrix that occlude positions [STARTPOS..ENDPOS] in OBJECT + current matrix that occlude positions [STARTPOS..ENDPOS) in OBJECT (assumed to be a string), and return in HLINFO's mouse_face_* members the pixel and column/row coordinates of those glyphs. */ @@ -27523,7 +27517,7 @@ mouse_face_from_string_pos (struct window *w, Mouse_HLInfo *hlinfo, int found = 0; /* Find the glyph row with at least one position in the range - [STARTPOS..ENDPOS], and the first glyph in that row whose + [STARTPOS..ENDPOS), and the first glyph in that row whose position belongs to that range. */ for (r = MATRIX_FIRST_TEXT_ROW (w->current_matrix); r->enabled_p && r->y < yb; @@ -27535,7 +27529,7 @@ mouse_face_from_string_pos (struct window *w, Mouse_HLInfo *hlinfo, e = g + r->used[TEXT_AREA]; for (gx = r->x; g < e; gx += g->pixel_width, ++g) if (EQ (g->object, object) - && startpos <= g->charpos && g->charpos <= endpos) + && startpos <= g->charpos && g->charpos < endpos) { hlinfo->mouse_face_beg_row = MATRIX_ROW_VPOS (r, w->current_matrix); @@ -27553,7 +27547,7 @@ mouse_face_from_string_pos (struct window *w, Mouse_HLInfo *hlinfo, g = e + r->used[TEXT_AREA]; for ( ; g > e; --g) if (EQ ((g-1)->object, object) - && startpos <= (g-1)->charpos && (g-1)->charpos <= endpos) + && startpos <= (g-1)->charpos && (g-1)->charpos < endpos) { hlinfo->mouse_face_beg_row = MATRIX_ROW_VPOS (r, w->current_matrix); @@ -27581,7 +27575,7 @@ mouse_face_from_string_pos (struct window *w, Mouse_HLInfo *hlinfo, found = 0; for ( ; g < e; ++g) if (EQ (g->object, object) - && startpos <= g->charpos && g->charpos <= endpos) + && startpos <= g->charpos && g->charpos < endpos) { found = 1; break; @@ -27604,7 +27598,7 @@ mouse_face_from_string_pos (struct window *w, Mouse_HLInfo *hlinfo, e = g + r->used[TEXT_AREA]; for ( ; e > g; --e) if (EQ ((e-1)->object, object) - && startpos <= (e-1)->charpos && (e-1)->charpos <= endpos) + && startpos <= (e-1)->charpos && (e-1)->charpos < endpos) break; hlinfo->mouse_face_end_col = e - g; @@ -27619,7 +27613,7 @@ mouse_face_from_string_pos (struct window *w, Mouse_HLInfo *hlinfo, for (gx = r->x ; e < g; ++e) { if (EQ (e->object, object) - && startpos <= e->charpos && e->charpos <= endpos) + && startpos <= e->charpos && e->charpos < endpos) break; gx += e->pixel_width; } @@ -27682,7 +27676,7 @@ on_hot_spot_p (Lisp_Object hot_spot, int x, int y) if (VECTORP (XCDR (hot_spot))) { struct Lisp_Vector *v = XVECTOR (XCDR (hot_spot)); - Lisp_Object *poly = v->contents; + Lisp_Object *poly = v->u.contents; ptrdiff_t n = v->header.size; ptrdiff_t i; int inside = 0; @@ -27788,7 +27782,7 @@ define_frame_cursor1 (struct frame *f, Cursor cursor, Lisp_Object pointer) cursor = FRAME_X_OUTPUT (f)->horizontal_drag_cursor; #ifdef HAVE_X_WINDOWS else if (EQ (pointer, intern ("vdrag"))) - cursor = FRAME_X_DISPLAY_INFO (f)->vertical_scroll_bar_cursor; + cursor = FRAME_DISPLAY_INFO (f)->vertical_scroll_bar_cursor; #endif else if (EQ (pointer, intern ("hourglass"))) cursor = FRAME_X_OUTPUT (f)->hourglass_cursor; @@ -27951,7 +27945,7 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y, /* Change the mouse pointer according to what is under it. */ if (FRAME_WINDOW_P (f)) { - dpyinfo = FRAME_X_DISPLAY_INFO (f); + dpyinfo = FRAME_DISPLAY_INFO (f); if (STRINGP (string)) { cursor = FRAME_X_OUTPUT (f)->nontext_cursor; @@ -27973,7 +27967,7 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y, } else /* Default mode-line pointer. */ - cursor = FRAME_X_DISPLAY_INFO (f)->vertical_scroll_bar_cursor; + cursor = FRAME_DISPLAY_INFO (f)->vertical_scroll_bar_cursor; } #endif } @@ -28176,7 +28170,7 @@ note_mouse_highlight (struct frame *f, int x, int y) w = XWINDOW (window); frame_to_window_pixel_xy (w, &x, &y); -#ifdef HAVE_WINDOW_SYSTEM +#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS) /* Handle tool-bar window differently since it doesn't display a buffer. */ if (EQ (window, f->tool_bar_window)) @@ -28393,7 +28387,7 @@ note_mouse_highlight (struct frame *f, int x, int y) if (NILP (s)) s = make_number (0); if (NILP (e)) - e = make_number (SCHARS (object) - 1); + e = make_number (SCHARS (object)); mouse_face_from_string_pos (w, hlinfo, object, XINT (s), XINT (e)); hlinfo->mouse_face_past_end = 0; @@ -29089,9 +29083,11 @@ expose_frame (struct frame *f, int x, int y, int w, int h) TRACE ((stderr, "(%d, %d, %d, %d)\n", r.x, r.y, r.width, r.height)); mouse_face_overwritten_p = expose_window_tree (XWINDOW (f->root_window), &r); +#if ! defined (USE_GTK) && ! defined (HAVE_NS) if (WINDOWP (f->tool_bar_window)) mouse_face_overwritten_p |= expose_window (XWINDOW (f->tool_bar_window), &r); +#endif #ifdef HAVE_X_WINDOWS #ifndef MSDOS @@ -29817,8 +29813,6 @@ Its value should be an ASCII acronym string, `hex-code', `empty-box', or void init_xdisp (void) { - current_header_line_height = current_mode_line_height = -1; - CHARPOS (this_line_start_pos) = 0; if (!noninteractive) diff --git a/src/xfaces.c b/src/xfaces.c index 0a117b83c15..8d78a28eab1 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -211,13 +211,10 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "frame.h" #include "termhooks.h" -#ifdef HAVE_X_WINDOWS -#include "xterm.h" #ifdef USE_MOTIF #include <Xm/Xm.h> #include <Xm/XmStrDefs.h> #endif /* USE_MOTIF */ -#endif /* HAVE_X_WINDOWS */ #ifdef MSDOS #include "dosfns.h" @@ -227,15 +224,11 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include TERM_HEADER #include "fontset.h" #ifdef HAVE_NTGUI -#undef FRAME_X_DISPLAY_INFO -#define FRAME_X_DISPLAY_INFO FRAME_W32_DISPLAY_INFO #define x_display_info w32_display_info #define GCGraphicsExposures 0 #endif /* HAVE_NTGUI */ #ifdef HAVE_NS -#undef FRAME_X_DISPLAY_INFO -#define FRAME_X_DISPLAY_INFO FRAME_NS_DISPLAY_INFO #define GCGraphicsExposures 0 #endif /* HAVE_NS */ @@ -549,7 +542,7 @@ DEFUN ("dump-colors", Fdump_colors, Sdump_colors, 0, 0, 0, void x_free_colors (struct frame *f, long unsigned int *pixels, int npixels) { - int class = FRAME_X_DISPLAY_INFO (f)->visual->class; + int class = FRAME_DISPLAY_INFO (f)->visual->class; /* If display has an immutable color map, freeing colors is not necessary and some servers don't allow it. So don't do it. */ @@ -770,7 +763,7 @@ clear_face_cache (int clear_fonts_p) { struct frame *f = XFRAME (frame); if (FRAME_WINDOW_P (f) - && FRAME_X_DISPLAY_INFO (f)->n_fonts > CLEAR_FONT_TABLE_NFONTS) + && FRAME_DISPLAY_INFO (f)->n_fonts > CLEAR_FONT_TABLE_NFONTS) { clear_font_cache (f); free_all_realized_faces (frame); @@ -1572,7 +1565,7 @@ the face font sort order. */) vec = Fvconcat (ndrivers, drivers); nfonts = ASIZE (vec); - qsort (XVECTOR (vec)->contents, nfonts, word_size, + qsort (XVECTOR (vec)->u.contents, nfonts, word_size, compare_fonts_by_sort_order); result = Qnil; @@ -1837,7 +1830,7 @@ check_lface (Lisp_Object lface) if (!NILP (lface)) { eassert (LFACEP (lface)); - check_lface_attrs (XVECTOR (lface)->contents); + check_lface_attrs (XVECTOR (lface)->u.contents); } } @@ -2014,7 +2007,7 @@ get_lface_attributes_no_remap (struct frame *f, Lisp_Object face_name, lface = lface_from_face_name_no_resolve (f, face_name, signal_p); if (! NILP (lface)) - memcpy (attrs, XVECTOR (lface)->contents, + memcpy (attrs, XVECTOR (lface)->u.contents, LFACE_VECTOR_SIZE * sizeof *attrs); return !NILP (lface); @@ -2697,7 +2690,7 @@ The value is TO. */) copy = Finternal_make_lisp_face (to, new_frame); } - vcopy (copy, 0, XVECTOR (lface)->contents, LFACE_VECTOR_SIZE); + vcopy (copy, 0, XVECTOR (lface)->u.contents, LFACE_VECTOR_SIZE); /* Changing a named face means that all realized faces depending on that face are invalid. Since we cannot tell which realized faces @@ -3100,7 +3093,7 @@ FRAME 0 means change the face on all frames, and change the default f = XFRAME (frame); if (! FONT_OBJECT_P (value)) { - Lisp_Object *attrs = XVECTOR (lface)->contents; + Lisp_Object *attrs = XVECTOR (lface)->u.contents; Lisp_Object font_object; font_object = font_load_for_lface (f, attrs, value); @@ -3168,7 +3161,7 @@ FRAME 0 means change the face on all frames, and change the default the font to nil so that the font selector doesn't think that the attribute is mandatory. Also, clear the average width. */ - font_clear_prop (XVECTOR (lface)->contents, prop_index); + font_clear_prop (XVECTOR (lface)->u.contents, prop_index); } /* Changing a named face means that all realized faces depending on @@ -3198,7 +3191,7 @@ FRAME 0 means change the face on all frames, and change the default reflected in changed `font' frame parameters. */ if (FRAMEP (frame) && (prop_index || EQ (attr, QCfont)) - && lface_fully_specified_p (XVECTOR (lface)->contents)) + && lface_fully_specified_p (XVECTOR (lface)->u.contents)) set_font_frame_param (frame, lface); else #endif /* HAVE_WINDOW_SYSTEM */ @@ -3378,7 +3371,7 @@ set_font_frame_param (Lisp_Object frame, Lisp_Object lface) { if (FONT_SPEC_P (font)) { - font = font_load_for_lface (f, XVECTOR (lface)->contents, font); + font = font_load_for_lface (f, XVECTOR (lface)->u.contents, font); if (NILP (font)) return; ASET (lface, LFACE_FONT_INDEX, font); @@ -3403,7 +3396,7 @@ ordinary `x-get-resource' doesn't take a frame argument. */) CHECK_STRING (class); f = decode_live_frame (frame); block_input (); - value = display_x_get_resource (FRAME_X_DISPLAY_INFO (f), + value = display_x_get_resource (FRAME_DISPLAY_INFO (f), resource, class, Qnil, Qnil); unblock_input (); return value; @@ -3493,7 +3486,7 @@ DEFUN ("internal-set-lisp-face-attribute-from-resource", static void x_update_menu_appearance (struct frame *f) { - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); XrmDatabase rdb; if (dpyinfo @@ -3735,8 +3728,8 @@ Default face attributes override any local face attributes. */) the local frame is defined from default specs in `face-defface-spec' and those should be overridden by global settings. Hence the strange "global before local" priority. */ - lvec = XVECTOR (local_lface)->contents; - gvec = XVECTOR (global_lface)->contents; + lvec = XVECTOR (local_lface)->u.contents; + gvec = XVECTOR (global_lface)->u.contents; for (i = 1; i < LFACE_VECTOR_SIZE; ++i) if (IGNORE_DEFFACE_P (gvec[i])) ASET (local_lface, i, Qunspecified); @@ -3920,8 +3913,8 @@ If FRAME is omitted or nil, use the selected frame. */) lface1 = lface_from_face_name (f, face1, 1); lface2 = lface_from_face_name (f, face2, 1); - equal_p = lface_equal_p (XVECTOR (lface1)->contents, - XVECTOR (lface2)->contents); + equal_p = lface_equal_p (XVECTOR (lface1)->u.contents, + XVECTOR (lface2)->u.contents); return equal_p ? Qt : Qnil; } @@ -4658,7 +4651,7 @@ DEFUN ("face-attributes-as-vector", Fface_attributes_as_vector, Lisp_Object lface; lface = Fmake_vector (make_number (LFACE_VECTOR_SIZE), Qunspecified); - merge_face_ref (XFRAME (selected_frame), plist, XVECTOR (lface)->contents, + merge_face_ref (XFRAME (selected_frame), plist, XVECTOR (lface)->u.contents, 1, 0); return lface; } @@ -5338,9 +5331,9 @@ realize_default_face (struct frame *f) ASET (lface, LFACE_STIPPLE_INDEX, Qnil); /* Realize the face; it must be fully-specified now. */ - eassert (lface_fully_specified_p (XVECTOR (lface)->contents)); + eassert (lface_fully_specified_p (XVECTOR (lface)->u.contents)); check_lface (lface); - memcpy (attrs, XVECTOR (lface)->contents, sizeof attrs); + memcpy (attrs, XVECTOR (lface)->u.contents, sizeof attrs); face = realize_face (c, attrs, DEFAULT_FACE_ID); #ifdef HAVE_WINDOW_SYSTEM diff --git a/src/xfns.c b/src/xfns.c index b08fc76524c..2b895642942 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -42,8 +42,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "termchar.h" #include "font.h" -#ifdef HAVE_X_WINDOWS - #include <sys/types.h> #include <sys/stat.h> @@ -153,7 +151,7 @@ check_x_display_info (Lisp_Object object) struct frame *sf = XFRAME (selected_frame); if (FRAME_X_P (sf) && FRAME_LIVE_P (sf)) - dpyinfo = FRAME_X_DISPLAY_INFO (sf); + dpyinfo = FRAME_DISPLAY_INFO (sf); else if (x_display_list != 0) dpyinfo = x_display_list; else @@ -173,193 +171,12 @@ check_x_display_info (Lisp_Object object) else { struct frame *f = decode_window_system_frame (object); - dpyinfo = FRAME_X_DISPLAY_INFO (f); + dpyinfo = FRAME_DISPLAY_INFO (f); } return dpyinfo; } - -/* Return the Emacs frame-object corresponding to an X window. - It could be the frame's main window or an icon window. */ - -/* This function can be called during GC, so use GC_xxx type test macros. */ - -struct frame * -x_window_to_frame (struct x_display_info *dpyinfo, int wdesc) -{ - Lisp_Object tail, frame; - struct frame *f; - - if (wdesc == None) - return NULL; - - FOR_EACH_FRAME (tail, frame) - { - f = XFRAME (frame); - if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo) - continue; - if (f->output_data.x->hourglass_window == wdesc) - return f; -#ifdef USE_X_TOOLKIT - if ((f->output_data.x->edit_widget - && XtWindow (f->output_data.x->edit_widget) == wdesc) - /* A tooltip frame? */ - || (!f->output_data.x->edit_widget - && FRAME_X_WINDOW (f) == wdesc) - || f->output_data.x->icon_desc == wdesc) - return f; -#else /* not USE_X_TOOLKIT */ -#ifdef USE_GTK - if (f->output_data.x->edit_widget) - { - GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); - struct x_output *x = f->output_data.x; - if (gwdesc != 0 && gwdesc == x->edit_widget) - return f; - } -#endif /* USE_GTK */ - if (FRAME_X_WINDOW (f) == wdesc - || f->output_data.x->icon_desc == wdesc) - return f; -#endif /* not USE_X_TOOLKIT */ - } - return 0; -} - -#if defined (USE_X_TOOLKIT) || defined (USE_GTK) -/* Like x_window_to_frame but also compares the window with the widget's - windows. */ - -struct frame * -x_any_window_to_frame (struct x_display_info *dpyinfo, int wdesc) -{ - Lisp_Object tail, frame; - struct frame *f, *found = NULL; - struct x_output *x; - - if (wdesc == None) - return NULL; - - FOR_EACH_FRAME (tail, frame) - { - if (found) - break; - f = XFRAME (frame); - if (FRAME_X_P (f) && FRAME_X_DISPLAY_INFO (f) == dpyinfo) - { - /* This frame matches if the window is any of its widgets. */ - x = f->output_data.x; - if (x->hourglass_window == wdesc) - found = f; - else if (x->widget) - { -#ifdef USE_GTK - GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); - if (gwdesc != 0 - && gtk_widget_get_toplevel (gwdesc) == x->widget) - found = f; -#else - if (wdesc == XtWindow (x->widget) - || wdesc == XtWindow (x->column_widget) - || wdesc == XtWindow (x->edit_widget)) - found = f; - /* Match if the window is this frame's menubar. */ - else if (lw_window_is_in_menubar (wdesc, x->menubar_widget)) - found = f; -#endif - } - else if (FRAME_X_WINDOW (f) == wdesc) - /* A tooltip frame. */ - found = f; - } - } - - return found; -} - -/* Likewise, but consider only the menu bar widget. */ - -struct frame * -x_menubar_window_to_frame (struct x_display_info *dpyinfo, XEvent *event) -{ - Window wdesc = event->xany.window; - Lisp_Object tail, frame; - struct frame *f; - struct x_output *x; - - if (wdesc == None) - return NULL; - - FOR_EACH_FRAME (tail, frame) - { - f = XFRAME (frame); - if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo) - continue; - x = f->output_data.x; -#ifdef USE_GTK - if (x->menubar_widget && xg_event_is_for_menubar (f, event)) - return f; -#else - /* Match if the window is this frame's menubar. */ - if (x->menubar_widget - && lw_window_is_in_menubar (wdesc, x->menubar_widget)) - return f; -#endif - } - return 0; -} - -/* Return the frame whose principal (outermost) window is WDESC. - If WDESC is some other (smaller) window, we return 0. */ - -struct frame * -x_top_window_to_frame (struct x_display_info *dpyinfo, int wdesc) -{ - Lisp_Object tail, frame; - struct frame *f; - struct x_output *x; - - if (wdesc == None) - return NULL; - - FOR_EACH_FRAME (tail, frame) - { - f = XFRAME (frame); - if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo) - continue; - x = f->output_data.x; - - if (x->widget) - { - /* This frame matches if the window is its topmost widget. */ -#ifdef USE_GTK - GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); - if (gwdesc == x->widget) - return f; -#else - if (wdesc == XtWindow (x->widget)) - return f; -#if 0 /* I don't know why it did this, - but it seems logically wrong, - and it causes trouble for MapNotify events. */ - /* Match if the window is this frame's menubar. */ - if (x->menubar_widget - && wdesc == XtWindow (x->menubar_widget)) - return f; -#endif -#endif - } - else if (FRAME_X_WINDOW (f) == wdesc) - /* Tooltip frame. */ - return f; - } - return 0; -} -#endif /* USE_X_TOOLKIT || USE_GTK */ - - - /* Store the screen positions of frame F into XPTR and YPTR. These are the positions of the containing window manager window, not Emacs's own window. */ @@ -374,7 +191,7 @@ x_real_positions (struct frame *f, int *xptr, int *yptr) Atom actual_type; unsigned long actual_size, bytes_remaining; int rc, actual_format; - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); long max_len = 400; Display *dpy = FRAME_X_DISPLAY (f); unsigned char *tmp_data = NULL; @@ -437,7 +254,7 @@ x_real_positions (struct frame *f, int *xptr, int *yptr) XTranslateCoordinates (FRAME_X_DISPLAY (f), /* From-window, to-window. */ - FRAME_X_DISPLAY_INFO (f)->root_window, + FRAME_DISPLAY_INFO (f)->root_window, FRAME_X_WINDOW (f), /* From-position, to-position. */ @@ -456,7 +273,7 @@ x_real_positions (struct frame *f, int *xptr, int *yptr) XTranslateCoordinates (FRAME_X_DISPLAY (f), /* From-window, to-window. */ - FRAME_X_DISPLAY_INFO (f)->root_window, + FRAME_DISPLAY_INFO (f)->root_window, FRAME_OUTER_WINDOW (f), /* From-position, to-position. */ @@ -577,7 +394,7 @@ x_decode_color (struct frame *f, Lisp_Object color_name, int mono_color) #endif /* Return MONO_COLOR for monochrome frames. */ - if (FRAME_X_DISPLAY_INFO (f)->n_planes == 1) + if (FRAME_DISPLAY_INFO (f)->n_planes == 1) return mono_color; /* x_defined_color is responsible for coping with failures @@ -770,7 +587,7 @@ make_invisible_cursor (struct frame *f) Cursor c = 0; x_catch_errors (dpy); - pix = XCreateBitmapFromData (dpy, FRAME_X_DISPLAY_INFO (f)->root_window, + pix = XCreateBitmapFromData (dpy, FRAME_DISPLAY_INFO (f)->root_window, no_data, 1, 1); if (! x_had_errors_p (dpy) && pix != None) { @@ -895,8 +712,8 @@ x_set_mouse_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) XDefineCursor (dpy, FRAME_X_WINDOW (f), f->output_data.x->current_cursor = cursor); - if (FRAME_X_DISPLAY_INFO (f)->invisible_cursor == 0) - FRAME_X_DISPLAY_INFO (f)->invisible_cursor = make_invisible_cursor (f); + if (FRAME_DISPLAY_INFO (f)->invisible_cursor == 0) + FRAME_DISPLAY_INFO (f)->invisible_cursor = make_invisible_cursor (f); if (cursor != x->text_cursor && x->text_cursor != 0) @@ -1031,7 +848,7 @@ x_set_border_pixel (struct frame *f, int pix) Note: this is done in two routines because of the way X10 works. Note: under X11, this is normally the province of the window manager, - and so emacs' border colors may be overridden. */ + and so emacs's border colors may be overridden. */ static void x_set_border_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) @@ -1201,7 +1018,7 @@ x_set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) clear_glyph_matrix (XWINDOW (f->menu_bar_window)->current_matrix); } #endif /* not USE_X_TOOLKIT && not USE_GTK */ - adjust_glyphs (f); + adjust_frame_glyphs (f); run_window_configuration_change_hook (f); } @@ -1215,8 +1032,11 @@ x_set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) void x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) { - int delta, nlines, root_height; + int nlines; +#if ! defined (USE_GTK) + int delta, root_height; Lisp_Object root_window; +#endif /* Treat tool bars like menu bars. */ if (FRAME_MINIBUF_ONLY_P (f)) @@ -1229,6 +1049,7 @@ x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) nlines = 0; #ifdef USE_GTK + FRAME_TOOL_BAR_LINES (f) = 0; if (nlines) { @@ -1245,8 +1066,7 @@ x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) FRAME_EXTERNAL_TOOL_BAR (f) = 0; } - return; -#endif +#else /* !USE_GTK */ /* Make sure we redisplay all windows in this frame. */ ++windows_or_buffers_changed; @@ -1264,7 +1084,7 @@ x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) FRAME_TOOL_BAR_LINES (f) = nlines; resize_frame_windows (f, FRAME_LINES (f), 0); - adjust_glyphs (f); + adjust_frame_glyphs (f); /* We also have to make sure that the internal border at the top of the frame, below the menu bar or tool bar, is redrawn when the @@ -1301,7 +1121,7 @@ x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) } run_window_configuration_change_hook (f); - +#endif /* USE_GTK */ } @@ -1486,7 +1306,7 @@ x_set_name_internal (struct frame *f, Lisp_Object name) text.value = x_encode_text (name, coding_system, 0, &bytes, &stringp, &do_free_text_value); text.encoding = (stringp ? XA_STRING - : FRAME_X_DISPLAY_INFO (f)->Xatom_COMPOUND_TEXT); + : FRAME_DISPLAY_INFO (f)->Xatom_COMPOUND_TEXT); text.format = 8; text.nitems = bytes; if (text.nitems != bytes) @@ -1503,7 +1323,7 @@ x_set_name_internal (struct frame *f, Lisp_Object name) icon.value = x_encode_text (f->icon_name, coding_system, 0, &bytes, &stringp, &do_free_icon_value); icon.encoding = (stringp ? XA_STRING - : FRAME_X_DISPLAY_INFO (f)->Xatom_COMPOUND_TEXT); + : FRAME_DISPLAY_INFO (f)->Xatom_COMPOUND_TEXT); icon.format = 8; icon.nitems = bytes; if (icon.nitems != bytes) @@ -1518,8 +1338,8 @@ x_set_name_internal (struct frame *f, Lisp_Object name) #else /* not USE_GTK */ XSetWMName (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), &text); XChangeProperty (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), - FRAME_X_DISPLAY_INFO (f)->Xatom_net_wm_name, - FRAME_X_DISPLAY_INFO (f)->Xatom_UTF8_STRING, + FRAME_DISPLAY_INFO (f)->Xatom_net_wm_name, + FRAME_DISPLAY_INFO (f)->Xatom_UTF8_STRING, 8, PropModeReplace, SDATA (encoded_name), SBYTES (encoded_name)); @@ -1527,8 +1347,8 @@ x_set_name_internal (struct frame *f, Lisp_Object name) XSetWMIconName (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), &icon); XChangeProperty (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), - FRAME_X_DISPLAY_INFO (f)->Xatom_net_wm_icon_name, - FRAME_X_DISPLAY_INFO (f)->Xatom_UTF8_STRING, + FRAME_DISPLAY_INFO (f)->Xatom_net_wm_icon_name, + FRAME_DISPLAY_INFO (f)->Xatom_UTF8_STRING, 8, PropModeReplace, SDATA (encoded_icon_name), SBYTES (encoded_icon_name)); @@ -1575,10 +1395,10 @@ x_set_name (struct frame *f, Lisp_Object name, int explicit) { /* Check for no change needed in this very common case before we do any consing. */ - if (!strcmp (FRAME_X_DISPLAY_INFO (f)->x_id_name, + if (!strcmp (FRAME_DISPLAY_INFO (f)->x_id_name, SSDATA (f->name))) return; - name = build_string (FRAME_X_DISPLAY_INFO (f)->x_id_name); + name = build_string (FRAME_DISPLAY_INFO (f)->x_id_name); } else CHECK_STRING (name); @@ -1648,9 +1468,8 @@ x_set_scroll_bar_default_width (struct frame *f) int minw = 16; #endif /* A minimum width of 14 doesn't look good for toolkit scroll bars. */ - int width = minw + 2 * VERTICAL_SCROLL_BAR_WIDTH_TRIM; - FRAME_CONFIG_SCROLL_BAR_COLS (f) = (width + wid - 1) / wid; - FRAME_CONFIG_SCROLL_BAR_WIDTH (f) = width; + FRAME_CONFIG_SCROLL_BAR_COLS (f) = (minw + wid - 1) / wid; + FRAME_CONFIG_SCROLL_BAR_WIDTH (f) = minw; #else /* Make the actual width at least 14 pixels and a multiple of a character width. */ @@ -1674,7 +1493,7 @@ x_default_scroll_bar_color_parameter (struct frame *f, const char *xprop, const char *xclass, int foreground_p) { - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); Lisp_Object tem; tem = x_get_arg (dpyinfo, alist, prop, xprop, xclass, RES_TYPE_STRING); @@ -1740,7 +1559,7 @@ hack_wm_protocols (struct frame *f, Widget widget) unsigned long bytes_after; if ((XGetWindowProperty (dpy, w, - FRAME_X_DISPLAY_INFO (f)->Xatom_wm_protocols, + FRAME_DISPLAY_INFO (f)->Xatom_wm_protocols, (long)0, (long)100, False, XA_ATOM, &type, &format, &nitems, &bytes_after, &catoms) @@ -1752,13 +1571,13 @@ hack_wm_protocols (struct frame *f, Widget widget) { nitems--; if (atoms[nitems] - == FRAME_X_DISPLAY_INFO (f)->Xatom_wm_delete_window) + == FRAME_DISPLAY_INFO (f)->Xatom_wm_delete_window) need_delete = 0; else if (atoms[nitems] - == FRAME_X_DISPLAY_INFO (f)->Xatom_wm_take_focus) + == FRAME_DISPLAY_INFO (f)->Xatom_wm_take_focus) need_focus = 0; else if (atoms[nitems] - == FRAME_X_DISPLAY_INFO (f)->Xatom_wm_save_yourself) + == FRAME_DISPLAY_INFO (f)->Xatom_wm_save_yourself) need_save = 0; } } @@ -1769,13 +1588,13 @@ hack_wm_protocols (struct frame *f, Widget widget) Atom props [10]; int count = 0; if (need_delete) - props[count++] = FRAME_X_DISPLAY_INFO (f)->Xatom_wm_delete_window; + props[count++] = FRAME_DISPLAY_INFO (f)->Xatom_wm_delete_window; if (need_focus) - props[count++] = FRAME_X_DISPLAY_INFO (f)->Xatom_wm_take_focus; + props[count++] = FRAME_DISPLAY_INFO (f)->Xatom_wm_take_focus; if (need_save) - props[count++] = FRAME_X_DISPLAY_INFO (f)->Xatom_wm_save_yourself; + props[count++] = FRAME_DISPLAY_INFO (f)->Xatom_wm_save_yourself; if (count) - XChangeProperty (dpy, w, FRAME_X_DISPLAY_INFO (f)->Xatom_wm_protocols, + XChangeProperty (dpy, w, FRAME_DISPLAY_INFO (f)->Xatom_wm_protocols, XA_ATOM, 32, PropModeAppend, (unsigned char *) props, count); } @@ -1970,7 +1789,7 @@ xic_create_xfontset (struct frame *f) struct frame *cf = XFRAME (frame); if (cf != f && FRAME_LIVE_P (f) && FRAME_X_P (cf) - && FRAME_X_DISPLAY_INFO (cf) == FRAME_X_DISPLAY_INFO (f) + && FRAME_DISPLAY_INFO (cf) == FRAME_DISPLAY_INFO (f) && FRAME_FONT (f) && FRAME_FONT (f)->pixel_size == pixel_size) { @@ -2069,7 +1888,7 @@ xic_free_xfontset (struct frame *f) { struct frame *cf = XFRAME (frame); if (cf != f && FRAME_LIVE_P (f) && FRAME_X_P (cf) - && FRAME_X_DISPLAY_INFO (cf) == FRAME_X_DISPLAY_INFO (f) + && FRAME_DISPLAY_INFO (cf) == FRAME_DISPLAY_INFO (f) && FRAME_XIC_FONTSET (cf) == FRAME_XIC_FONTSET (f)) { shared_p = 1; @@ -2314,7 +2133,7 @@ x_window (struct frame *f, long window_prompting, int minibuffer_only) XtSetArg (al[ac], XtNmappedWhenManaged, 0); ac++; XtSetArg (al[ac], XtNborderWidth, f->border_width); ac++; XtSetArg (al[ac], XtNvisual, FRAME_X_VISUAL (f)); ac++; - XtSetArg (al[ac], XtNdepth, FRAME_X_DISPLAY_INFO (f)->n_planes); ac++; + XtSetArg (al[ac], XtNdepth, FRAME_DISPLAY_INFO (f)->n_planes); ac++; XtSetArg (al[ac], XtNcolormap, FRAME_X_COLORMAP (f)); ac++; shell_widget = XtAppCreateShell (f->namebuf, EMACS_CLASS, applicationShellWidgetClass, @@ -2329,7 +2148,7 @@ x_window (struct frame *f, long window_prompting, int minibuffer_only) ac = 0; XtSetArg (al[ac], XtNvisual, FRAME_X_VISUAL (f)); ac++; - XtSetArg (al[ac], XtNdepth, FRAME_X_DISPLAY_INFO (f)->n_planes); ac++; + XtSetArg (al[ac], XtNdepth, FRAME_DISPLAY_INFO (f)->n_planes); ac++; XtSetArg (al[ac], XtNcolormap, FRAME_X_COLORMAP (f)); ac++; XtSetArg (al[ac], XtNborderWidth, 0); ac++; XtSetValues (pane_widget, al, ac); @@ -2345,7 +2164,7 @@ x_window (struct frame *f, long window_prompting, int minibuffer_only) XtSetArg (al[ac], XtNresizeToPreferred, 1); ac++; XtSetArg (al[ac], XtNemacsFrame, f); ac++; XtSetArg (al[ac], XtNvisual, FRAME_X_VISUAL (f)); ac++; - XtSetArg (al[ac], XtNdepth, FRAME_X_DISPLAY_INFO (f)->n_planes); ac++; + XtSetArg (al[ac], XtNdepth, FRAME_DISPLAY_INFO (f)->n_planes); ac++; XtSetArg (al[ac], XtNcolormap, FRAME_X_COLORMAP (f)); ac++; XtSetArg (al[ac], XtNborderWidth, 0); ac++; frame_widget = XtCreateWidget (f->namebuf, emacsFrameClass, pane_widget, @@ -2471,7 +2290,7 @@ x_window (struct frame *f, long window_prompting, int minibuffer_only) be initialized to something relevant to the time we created the window. */ XChangeProperty (XtDisplay (frame_widget), XtWindow (frame_widget), - FRAME_X_DISPLAY_INFO (f)->Xatom_wm_protocols, + FRAME_DISPLAY_INFO (f)->Xatom_wm_protocols, XA_ATOM, 32, PropModeAppend, NULL, 0); /* Make all the standard events reach the Emacs frame. */ @@ -2631,8 +2450,8 @@ x_window (struct frame *f) /* Request "save yourself" and "delete window" commands from wm. */ { Atom protocols[2]; - protocols[0] = FRAME_X_DISPLAY_INFO (f)->Xatom_wm_delete_window; - protocols[1] = FRAME_X_DISPLAY_INFO (f)->Xatom_wm_save_yourself; + protocols[0] = FRAME_DISPLAY_INFO (f)->Xatom_wm_delete_window; + protocols[1] = FRAME_DISPLAY_INFO (f)->Xatom_wm_save_yourself; XSetWMProtocols (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), protocols, 2); } @@ -2692,7 +2511,7 @@ x_icon (struct frame *f, Lisp_Object parms) { Lisp_Object icon_x, icon_y; #if 0 - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); #endif /* Set the position of the icon. Note that twm groups all @@ -2776,7 +2595,7 @@ x_make_gc (struct frame *f) this must be done on a per-frame basis. */ f->output_data.x->border_tile = (XCreatePixmapFromBitmapData - (FRAME_X_DISPLAY (f), FRAME_X_DISPLAY_INFO (f)->root_window, + (FRAME_X_DISPLAY (f), FRAME_DISPLAY_INFO (f)->root_window, gray_bits, gray_width, gray_height, FRAME_FOREGROUND_PIXEL (f), FRAME_BACKGROUND_PIXEL (f), @@ -2842,7 +2661,7 @@ unwind_create_frame (Lisp_Object frame) if (NILP (Fmemq (frame, Vframe_list))) { #if defined GLYPH_DEBUG && defined ENABLE_CHECKING - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); #endif x_free_frame_resources (f); @@ -2874,7 +2693,7 @@ unwind_create_frame_1 (Lisp_Object val) static void x_default_font_parameter (struct frame *f, Lisp_Object parms) { - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); Lisp_Object font_param = x_get_arg (dpyinfo, parms, Qfont, NULL, NULL, RES_TYPE_STRING); Lisp_Object font = Qnil; @@ -3068,9 +2887,9 @@ This function is an internal primitive--use `make-frame' instead. */) if (! STRINGP (f->icon_name)) fset_icon_name (f, Qnil); - FRAME_X_DISPLAY_INFO (f) = dpyinfo; + FRAME_DISPLAY_INFO (f) = dpyinfo; - /* With FRAME_X_DISPLAY_INFO set up, this unwind-protect is safe. */ + /* With FRAME_DISPLAY_INFO set up, this unwind-protect is safe. */ record_unwind_protect (do_unwind_create_frame, frame); /* These colors will be set anyway later, but it's important @@ -3115,7 +2934,7 @@ This function is an internal primitive--use `make-frame' instead. */) } else { - f->output_data.x->parent_desc = FRAME_X_DISPLAY_INFO (f)->root_window; + f->output_data.x->parent_desc = FRAME_DISPLAY_INFO (f)->root_window; f->output_data.x->explicit_parent = 0; } @@ -3286,7 +3105,7 @@ This function is an internal primitive--use `make-frame' instead. */) /* Now consider the frame official. */ f->terminal->reference_count++; - FRAME_X_DISPLAY_INFO (f)->reference_count++; + FRAME_DISPLAY_INFO (f)->reference_count++; Vframe_list = Fcons (frame, Vframe_list); /* We need to do this after creating the X window, so that the @@ -3411,7 +3230,7 @@ This function is an internal primitive--use `make-frame' instead. */) Lisp_Object x_get_focus_frame (struct frame *frame) { - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (frame); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (frame); Lisp_Object xfocus; if (! dpyinfo->x_focus_frame) return Qnil; @@ -3430,12 +3249,9 @@ x_get_focus_frame (struct frame *frame) policy. But I think it's okay to use when it's clearly done following a user-command. */ -DEFUN ("x-focus-frame", Fx_focus_frame, Sx_focus_frame, 1, 1, 0, - doc: /* Set the input focus to FRAME. -FRAME nil means use the selected frame. */) - (Lisp_Object frame) +void +x_focus_frame (struct frame *f) { - struct frame *f = decode_window_system_frame (frame); Display *dpy = FRAME_X_DISPLAY (f); block_input (); @@ -3457,8 +3273,6 @@ FRAME nil means use the selected frame. */) x_uncatch_errors (); unblock_input (); - - return Qnil; } @@ -3939,7 +3753,7 @@ x_make_monitor_attribute_list (struct MonitorInfo *monitors, { struct frame *f = XFRAME (frame); - if (FRAME_X_P (f) && FRAME_X_DISPLAY_INFO (f) == dpyinfo + if (FRAME_X_P (f) && FRAME_DISPLAY_INFO (f) == dpyinfo && !EQ (frame, tip_frame)) { int i = x_get_monitor_for_frame (f, monitors, n_monitors); @@ -4135,6 +3949,8 @@ x_get_monitor_attributes (struct x_display_info *dpyinfo) Lisp_Object attributes_list = Qnil; Display *dpy = dpyinfo->display; + (void) dpy; /* Suppress unused variable warning. */ + #ifdef HAVE_XRANDR int xrr_event_base, xrr_error_base; bool xrr_ok = false; @@ -4219,7 +4035,7 @@ Internal use only, use `display-monitor-attributes-list' instead. */) { struct frame *f = XFRAME (frame); - if (FRAME_X_P (f) && FRAME_X_DISPLAY_INFO (f) == dpyinfo + if (FRAME_X_P (f) && FRAME_DISPLAY_INFO (f) == dpyinfo && !EQ (frame, tip_frame)) { GdkWindow *gwin = gtk_widget_get_window (FRAME_GTK_WIDGET (f)); @@ -4431,11 +4247,6 @@ x_display_info_for_name (Lisp_Object name) CHECK_STRING (name); -#if 0 - if (! EQ (Vinitial_window_system, intern ("x"))) - error ("Not using X Windows"); /* That doesn't stop us anymore. */ -#endif - for (dpyinfo = x_display_list, names = x_display_name_list; dpyinfo; dpyinfo = dpyinfo->next, names = XCDR (names)) @@ -4479,11 +4290,6 @@ terminate Emacs if we can't open the connection. if (! NILP (xrm_string)) CHECK_STRING (xrm_string); -#if 0 - if (! EQ (Vinitial_window_system, intern ("x"))) - error ("Not using X Windows"); /* That doesn't stop us anymore. */ -#endif - xrm_option = NILP (xrm_string) ? 0 : SSDATA (xrm_string); validate_x_resource_name (); @@ -4730,7 +4536,7 @@ no value of TYPE (always string in the MS Windows case). */) { CONS_TO_INTEGER (source, Window, target_window); if (! target_window) - target_window = FRAME_X_DISPLAY_INFO (f)->root_window; + target_window = FRAME_DISPLAY_INFO (f)->root_window; } block_input (); @@ -5026,8 +4832,8 @@ x_create_tip_frame (struct x_display_info *dpyinfo, f->output_data.x->scroll_bar_bottom_shadow_pixel = -1; #endif /* USE_TOOLKIT_SCROLL_BARS */ fset_icon_name (f, Qnil); - FRAME_X_DISPLAY_INFO (f) = dpyinfo; - f->output_data.x->parent_desc = FRAME_X_DISPLAY_INFO (f)->root_window; + FRAME_DISPLAY_INFO (f) = dpyinfo; + f->output_data.x->parent_desc = FRAME_DISPLAY_INFO (f)->root_window; f->output_data.x->explicit_parent = 0; /* These colors will be set anyway later, but it's important @@ -5141,14 +4947,14 @@ x_create_tip_frame (struct x_display_info *dpyinfo, happen. */ init_frame_faces (f); - f->output_data.x->parent_desc = FRAME_X_DISPLAY_INFO (f)->root_window; + f->output_data.x->parent_desc = FRAME_DISPLAY_INFO (f)->root_window; x_figure_window_size (f, parms, 0); { XSetWindowAttributes attrs; unsigned long mask; - Atom type = FRAME_X_DISPLAY_INFO (f)->Xatom_net_window_type_tooltip; + Atom type = FRAME_DISPLAY_INFO (f)->Xatom_net_window_type_tooltip; block_input (); mask = CWBackPixel | CWOverrideRedirect | CWEventMask; @@ -5166,7 +4972,7 @@ x_create_tip_frame (struct x_display_info *dpyinfo, tip_window = FRAME_X_WINDOW (f) = XCreateWindow (FRAME_X_DISPLAY (f), - FRAME_X_DISPLAY_INFO (f)->root_window, + FRAME_DISPLAY_INFO (f)->root_window, /* x, y, width, height */ 0, 0, 1, 1, /* Border. */ @@ -5174,7 +4980,7 @@ x_create_tip_frame (struct x_display_info *dpyinfo, CopyFromParent, InputOutput, CopyFromParent, mask, &attrs); XChangeProperty (FRAME_X_DISPLAY (f), tip_window, - FRAME_X_DISPLAY_INFO (f)->Xatom_net_window_type, + FRAME_DISPLAY_INFO (f)->Xatom_net_window_type, XA_ATOM, 32, PropModeReplace, (unsigned char *)&type, 1); unblock_input (); @@ -5209,10 +5015,10 @@ x_create_tip_frame (struct x_display_info *dpyinfo, { Lisp_Object disptype; - if (FRAME_X_DISPLAY_INFO (f)->n_planes == 1) + if (FRAME_DISPLAY_INFO (f)->n_planes == 1) disptype = intern ("mono"); - else if (FRAME_X_DISPLAY_INFO (f)->visual->class == GrayScale - || FRAME_X_DISPLAY_INFO (f)->visual->class == StaticGray) + else if (FRAME_DISPLAY_INFO (f)->visual->class == GrayScale + || FRAME_DISPLAY_INFO (f)->visual->class == StaticGray) disptype = intern ("grayscale"); else disptype = intern ("color"); @@ -5246,7 +5052,7 @@ x_create_tip_frame (struct x_display_info *dpyinfo, /* Now that the frame will be official, it counts as a reference to its display and terminal. */ - FRAME_X_DISPLAY_INFO (f)->reference_count++; + FRAME_DISPLAY_INFO (f)->reference_count++; f->terminal->reference_count++; /* It is now ok to make the frame official even if we get an error @@ -5290,7 +5096,7 @@ compute_tip_xy (struct frame *f, Lisp_Object parms, Lisp_Object dx, Lisp_Object if (!INTEGERP (left) || !INTEGERP (top)) { block_input (); - XQueryPointer (FRAME_X_DISPLAY (f), FRAME_X_DISPLAY_INFO (f)->root_window, + XQueryPointer (FRAME_X_DISPLAY (f), FRAME_DISPLAY_INFO (f)->root_window, &root, &child, root_x, root_y, &win_x, &win_y, &pmask); unblock_input (); } @@ -5300,7 +5106,7 @@ compute_tip_xy (struct frame *f, Lisp_Object parms, Lisp_Object dx, Lisp_Object else if (*root_y + XINT (dy) <= 0) *root_y = 0; /* Can happen for negative dy */ else if (*root_y + XINT (dy) + height - <= x_display_pixel_height (FRAME_X_DISPLAY_INFO (f))) + <= x_display_pixel_height (FRAME_DISPLAY_INFO (f))) /* It fits below the pointer */ *root_y += XINT (dy); else if (height + XINT (dy) <= *root_y) @@ -5315,7 +5121,7 @@ compute_tip_xy (struct frame *f, Lisp_Object parms, Lisp_Object dx, Lisp_Object else if (*root_x + XINT (dx) <= 0) *root_x = 0; /* Can happen for negative dx */ else if (*root_x + XINT (dx) + width - <= x_display_pixel_width (FRAME_X_DISPLAY_INFO (f))) + <= x_display_pixel_width (FRAME_DISPLAY_INFO (f))) /* It fits to the right of the pointer. */ *root_x += XINT (dx); else if (width + XINT (dx) <= *root_x) @@ -5464,7 +5270,7 @@ Text larger than the specified size is clipped. */) /* Create a frame for the tooltip, and record it in the global variable tip_frame. */ - frame = x_create_tip_frame (FRAME_X_DISPLAY_INFO (f), parms, string); + frame = x_create_tip_frame (FRAME_DISPLAY_INFO (f), parms, string); f = XFRAME (frame); /* Set up the frame's root window. */ @@ -5486,7 +5292,7 @@ Text larger than the specified size is clipped. */) } FRAME_TOTAL_COLS (f) = w->total_cols; - adjust_glyphs (f); + adjust_frame_glyphs (f); w->pseudo_window_p = 1; /* Display the tooltip text in a temporary buffer. */ @@ -5554,7 +5360,7 @@ Text larger than the specified size is clipped. */) width /= WINDOW_FRAME_COLUMN_WIDTH (w); w->total_cols = width; FRAME_TOTAL_COLS (f) = width; - adjust_glyphs (f); + adjust_frame_glyphs (f); clear_glyph_matrix (w->desired_matrix); clear_glyph_matrix (w->current_matrix); try_window (FRAME_ROOT_WINDOW (f), pos, 0); @@ -5664,7 +5470,7 @@ Value is t if tooltip was open, nil otherwise. */) struct frame *f = SELECTED_FRAME (); w = f->output_data.x->menubar_widget; - if (!DoesSaveUnders (FRAME_X_DISPLAY_INFO (f)->screen) + if (!DoesSaveUnders (FRAME_DISPLAY_INFO (f)->screen) && w != NULL) { block_input (); @@ -6296,7 +6102,8 @@ Otherwise use Emacs own tooltip implementation. When using Gtk+ tooltips, the tooltip face is not used. */); x_gtk_use_system_tooltips = 1; - Fprovide (intern_c_string ("x"), Qnil); + /* Tell Emacs about this window system. */ + Fprovide (Qx, Qnil); #ifdef USE_X_TOOLKIT Fprovide (intern_c_string ("x-toolkit"), Qnil); @@ -6357,7 +6164,6 @@ When using Gtk+ tooltips, the tooltip face is not used. */); defsubr (&Sx_close_connection); defsubr (&Sx_display_list); defsubr (&Sx_synchronize); - defsubr (&Sx_focus_frame); defsubr (&Sx_backspace_delete_keys_p); defsubr (&Sx_show_tip); @@ -6379,5 +6185,3 @@ When using Gtk+ tooltips, the tooltip face is not used. */); defsubr (&Sx_select_font); #endif } - -#endif /* HAVE_X_WINDOWS */ diff --git a/src/xfont.c b/src/xfont.c index 1aface6f972..c5b8db3830c 100644 --- a/src/xfont.c +++ b/src/xfont.c @@ -154,7 +154,7 @@ struct font_driver xfont_driver = static Lisp_Object xfont_get_cache (struct frame *f) { - Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); return (dpyinfo->name_list_element); } @@ -384,7 +384,7 @@ xfont_list_pattern (Display *display, const char *pattern, if (num_fonts > 0) { char **indices = alloca (sizeof (char *) * num_fonts); - Lisp_Object *props = XVECTOR (xfont_scratch_props)->contents; + Lisp_Object *props = XVECTOR (xfont_scratch_props)->u.contents; Lisp_Object scripts = Qnil; for (i = 0; i < ASIZE (xfont_scratch_props); i++) @@ -488,7 +488,7 @@ xfont_list_pattern (Display *display, const char *pattern, static Lisp_Object xfont_list (struct frame *f, Lisp_Object spec) { - Display *display = FRAME_X_DISPLAY_INFO (f)->display; + Display *display = FRAME_DISPLAY_INFO (f)->display; Lisp_Object registry, list, val, extra, script; int len; /* Large enough to contain the longest XLFD (255 bytes) in UTF-8. */ @@ -566,7 +566,7 @@ xfont_list (struct frame *f, Lisp_Object spec) static Lisp_Object xfont_match (struct frame *f, Lisp_Object spec) { - Display *display = FRAME_X_DISPLAY_INFO (f)->display; + Display *display = FRAME_DISPLAY_INFO (f)->display; Lisp_Object extra, val, entity; char name[512]; XFontStruct *xfont; @@ -620,7 +620,7 @@ xfont_match (struct frame *f, Lisp_Object spec) static Lisp_Object xfont_list_family (struct frame *f) { - Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); char **names; int num_fonts, i; Lisp_Object list; @@ -676,7 +676,7 @@ xfont_list_family (struct frame *f) static Lisp_Object xfont_open (struct frame *f, Lisp_Object entity, int pixel_size) { - Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); Display *display = dpyinfo->display; char name[512]; int len; diff --git a/src/xmenu.c b/src/xmenu.c index 5d1f44e0f5a..054a52e7760 100644 --- a/src/xmenu.c +++ b/src/xmenu.c @@ -498,7 +498,7 @@ If FRAME is nil or not given, use the selected frame. */) memset (&ev, 0, sizeof ev); ev.xbutton.display = FRAME_X_DISPLAY (f); ev.xbutton.window = XtWindow (menubar); - ev.xbutton.root = FRAME_X_DISPLAY_INFO (f)->root_window; + ev.xbutton.root = FRAME_DISPLAY_INFO (f)->root_window; ev.xbutton.time = XtLastTimestampProcessed (FRAME_X_DISPLAY (f)); ev.xbutton.button = Button1; ev.xbutton.x = ev.xbutton.y = FRAME_MENUBAR_HEIGHT (f) / 2; @@ -990,7 +990,7 @@ set_frame_menubar (struct frame *f, bool first_time, bool deep_p) /* Save the frame's previous menu bar contents data. */ if (previous_menu_items_used) - memcpy (previous_items, XVECTOR (f->menu_bar_vector)->contents, + memcpy (previous_items, XVECTOR (f->menu_bar_vector)->u.contents, previous_menu_items_used * word_size); /* Fill in menu_items with the current menu bar contents. @@ -1367,7 +1367,7 @@ menu_position_func (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer { struct next_popup_x_y *data = user_data; GtkRequisition req; - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (data->f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (data->f); int disp_width = x_display_pixel_width (dpyinfo); int disp_height = x_display_pixel_height (dpyinfo); @@ -1449,7 +1449,7 @@ create_and_show_popup_menu (struct frame *f, widget_value *first_wv, int x, int if (for_click) { for (i = 0; i < 5; i++) - if (FRAME_X_DISPLAY_INFO (f)->grabbed & (1 << i)) + if (FRAME_DISPLAY_INFO (f)->grabbed & (1 << i)) break; } @@ -1474,7 +1474,7 @@ create_and_show_popup_menu (struct frame *f, widget_value *first_wv, int x, int /* Must reset this manually because the button release event is not passed to Emacs event loop. */ - FRAME_X_DISPLAY_INFO (f)->grabbed = 0; + FRAME_DISPLAY_INFO (f)->grabbed = 0; } #else /* not USE_GTK */ @@ -1543,7 +1543,7 @@ create_and_show_popup_menu (struct frame *f, widget_value *first_wv, event->send_event = 0; event->display = FRAME_X_DISPLAY (f); event->time = CurrentTime; - event->root = FRAME_X_DISPLAY_INFO (f)->root_window; + event->root = FRAME_DISPLAY_INFO (f)->root_window; event->window = event->subwindow = event->root; event->x = x; event->y = y; @@ -1558,7 +1558,7 @@ create_and_show_popup_menu (struct frame *f, widget_value *first_wv, event->state = 0; event->button = 0; for (i = 0; i < 5; i++) - if (FRAME_X_DISPLAY_INFO (f)->grabbed & (1 << i)) + if (FRAME_DISPLAY_INFO (f)->grabbed & (1 << i)) event->button = i; /* Don't allow any geometry request from the user. */ @@ -1578,7 +1578,7 @@ create_and_show_popup_menu (struct frame *f, widget_value *first_wv, make_number (menu_id & ~(-1 << (fact))))); /* Process events that apply to the menu. */ - popup_get_selection (0, FRAME_X_DISPLAY_INFO (f), menu_id, 1); + popup_get_selection (0, FRAME_DISPLAY_INFO (f), menu_id, 1); unbind_to (specpdl_count, Qnil); } @@ -1969,7 +1969,7 @@ create_and_show_dialog (struct frame *f, widget_value *first_wv) Fcons (make_number (dialog_id >> (fact)), make_number (dialog_id & ~(-1 << (fact))))); - popup_get_selection (0, FRAME_X_DISPLAY_INFO (f), dialog_id, 1); + popup_get_selection (0, FRAME_DISPLAY_INFO (f), dialog_id, 1); unbind_to (count, Qnil); } @@ -2194,7 +2194,7 @@ menu_help_callback (char const *help_string, int pane, int item) Lisp_Object pane_name; Lisp_Object menu_object; - first_item = XVECTOR (menu_items)->contents; + first_item = XVECTOR (menu_items)->u.contents; if (EQ (first_item[0], Qt)) pane_name = first_item[MENU_ITEMS_PANE_NAME]; else if (EQ (first_item[0], Qquote)) @@ -2225,13 +2225,13 @@ pop_down_menu (Lisp_Object arg) #ifdef HAVE_X_WINDOWS /* Assume the mouse has moved out of the X window. If it has actually moved in, we will get an EnterNotify. */ - x_mouse_leave (FRAME_X_DISPLAY_INFO (f)); + x_mouse_leave (FRAME_DISPLAY_INFO (f)); /* State that no mouse buttons are now held. (The oldXMenu code doesn't track this info for us.) That is not necessarily true, but the fiction leads to reasonable results, and it is a pain to ask which are actually held now. */ - FRAME_X_DISPLAY_INFO (f)->grabbed = 0; + FRAME_DISPLAY_INFO (f)->grabbed = 0; #endif /* HAVE_X_WINDOWS */ diff --git a/src/xrdb.c b/src/xrdb.c index 60dcdae080d..52988f0818a 100644 --- a/src/xrdb.c +++ b/src/xrdb.c @@ -48,10 +48,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "keyboard.h" #endif -char *x_get_string_resource (XrmDatabase rdb, const char *name, - const char *class); - - /* X file search path processing. */ diff --git a/src/xselect.c b/src/xselect.c index e5f2e214fba..5eb263d8d0c 100644 --- a/src/xselect.c +++ b/src/xselect.c @@ -318,7 +318,7 @@ x_own_selection (Lisp_Object selection_name, Lisp_Object selection_value, { struct frame *f = XFRAME (frame); Window selecting_window = FRAME_X_WINDOW (f); - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); Display *display = dpyinfo->display; Time timestamp = last_event_timestamp; Atom selection_atom = symbol_to_x_atom (dpyinfo, selection_name); @@ -997,7 +997,7 @@ x_clear_frame_selections (struct frame *f) { Lisp_Object frame; Lisp_Object rest; - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); struct terminal *t = dpyinfo->terminal; XSETFRAME (frame, f); @@ -1141,7 +1141,7 @@ wait_for_property_change (struct prop_location *location) /* Called from XTread_socket in response to a PropertyNotify event. */ void -x_handle_property_notify (XPropertyEvent *event) +x_handle_property_notify (const XPropertyEvent *event) { struct prop_location *rest; @@ -1185,7 +1185,7 @@ x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type, Lisp_Object time_stamp, Lisp_Object frame) { struct frame *f = XFRAME (frame); - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); Display *display = dpyinfo->display; Window requestor_window = FRAME_X_WINDOW (f); Time requestor_time = last_event_timestamp; @@ -1888,7 +1888,7 @@ clean_local_selection_data (Lisp_Object obj) We store t there if the reply is successful, lambda if not. */ void -x_handle_selection_notify (XSelectionEvent *event) +x_handle_selection_notify (const XSelectionEvent *event) { if (event->requestor != reading_selection_window) return; @@ -2009,7 +2009,7 @@ On Nextstep, TIME-STAMP and TERMINAL are unused. */) error ("X selection unavailable for this frame"); val = x_get_local_selection (selection_symbol, target_type, 1, - FRAME_X_DISPLAY_INFO (f)); + FRAME_DISPLAY_INFO (f)); if (NILP (val) && FRAME_LIVE_P (f)) { @@ -2056,7 +2056,7 @@ On MS-DOS, all this does is return non-nil if we own the selection. */) if (!f) return Qnil; - dpyinfo = FRAME_X_DISPLAY_INFO (f); + dpyinfo = FRAME_DISPLAY_INFO (f); CHECK_SYMBOL (selection); /* Don't disown the selection when we're not the owner. */ @@ -2108,7 +2108,7 @@ On Nextstep, TERMINAL is unused. */) if (EQ (selection, Qnil)) selection = QPRIMARY; if (EQ (selection, Qt)) selection = QSECONDARY; - if (f && !NILP (LOCAL_SELECTION (selection, FRAME_X_DISPLAY_INFO (f)))) + if (f && !NILP (LOCAL_SELECTION (selection, FRAME_DISPLAY_INFO (f)))) return Qt; else return Qnil; @@ -2141,7 +2141,7 @@ On Nextstep, TERMINAL is unused. */) if (!f) return Qnil; - dpyinfo = FRAME_X_DISPLAY_INFO (f); + dpyinfo = FRAME_DISPLAY_INFO (f); if (!NILP (LOCAL_SELECTION (selection, dpyinfo))) return Qt; @@ -2162,7 +2162,7 @@ static Lisp_Object x_clipboard_manager_save (Lisp_Object frame) { struct frame *f = XFRAME (frame); - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); Atom data = dpyinfo->Xatom_UTF8_STRING; XChangeProperty (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), @@ -2212,7 +2212,7 @@ x_clipboard_manager_save_frame (Lisp_Object frame) && (f = XFRAME (frame), FRAME_X_P (f)) && FRAME_LIVE_P (f)) { - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); Lisp_Object local_selection = LOCAL_SELECTION (QCLIPBOARD, dpyinfo); @@ -2458,7 +2458,7 @@ FRAME is on. If FRAME is nil, the selected frame is used. */) Atom x_atom; struct frame *f = decode_window_system_frame (frame); ptrdiff_t i; - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); if (SYMBOLP (atom)) @@ -2488,7 +2488,7 @@ FRAME is on. If FRAME is nil, the selected frame is used. */) /* Convert an XClientMessageEvent to a Lisp event of type DRAG_N_DROP_EVENT. */ int -x_handle_dnd_message (struct frame *f, XClientMessageEvent *event, +x_handle_dnd_message (struct frame *f, const XClientMessageEvent *event, struct x_display_info *dpyinfo, struct input_event *bufp) { Lisp_Object vec; diff --git a/src/xsettings.c b/src/xsettings.c index b5d5f4db59b..8fe82fec74b 100644 --- a/src/xsettings.c +++ b/src/xsettings.c @@ -336,9 +336,6 @@ get_prop_window (struct x_display_info *dpyinfo) XUngrabServer (dpy); } -#define SWAP32(nr) (((nr) << 24) | (((nr) << 8) & 0xff0000) \ - | (((nr) >> 8) & 0xff00) | ((nr) >> 24)) -#define SWAP16(nr) (((nr) << 8) | ((nr) >> 8)) #define PAD(nr) (((nr) + 3) & ~3) /* Parse xsettings and extract those that deal with Xft. @@ -408,7 +405,7 @@ parse_settings (unsigned char *prop, if (bytes < 12) return BadLength; memcpy (&n_settings, prop+8, 4); - if (my_bo != that_bo) n_settings = SWAP32 (n_settings); + if (my_bo != that_bo) n_settings = swap32 (n_settings); bytes_parsed = 12; memset (settings, 0, sizeof (*settings)); @@ -430,7 +427,7 @@ parse_settings (unsigned char *prop, memcpy (&nlen, prop+bytes_parsed, 2); bytes_parsed += 2; - if (my_bo != that_bo) nlen = SWAP16 (nlen); + if (my_bo != that_bo) nlen = swap16 (nlen); if (bytes_parsed+nlen > bytes) return BadLength; to_cpy = nlen > 127 ? 127 : nlen; memcpy (name, prop+bytes_parsed, to_cpy); @@ -457,7 +454,7 @@ parse_settings (unsigned char *prop, if (want_this) { memcpy (&ival, prop+bytes_parsed, 4); - if (my_bo != that_bo) ival = SWAP32 (ival); + if (my_bo != that_bo) ival = swap32 (ival); } bytes_parsed += 4; break; @@ -466,7 +463,7 @@ parse_settings (unsigned char *prop, if (bytes_parsed+4 > bytes) return BadLength; memcpy (&vlen, prop+bytes_parsed, 4); bytes_parsed += 4; - if (my_bo != that_bo) vlen = SWAP32 (vlen); + if (my_bo != that_bo) vlen = swap32 (vlen); if (want_this) { to_cpy = vlen > 127 ? 127 : vlen; @@ -754,7 +751,7 @@ read_and_apply_settings (struct x_display_info *dpyinfo, int send_event_p) /* Check if EVENT for the display in DPYINFO is XSettings related. */ void -xft_settings_event (struct x_display_info *dpyinfo, XEvent *event) +xft_settings_event (struct x_display_info *dpyinfo, const XEvent *event) { bool check_window_p = 0, apply_settings_p = 0; @@ -803,7 +800,7 @@ init_gsettings (void) const gchar *const *schemas; int schema_found = 0; -#ifdef HAVE_G_TYPE_INIT +#if ! GLIB_CHECK_VERSION (2, 36, 0) g_type_init (); #endif @@ -860,7 +857,7 @@ init_gconf (void) #if defined (HAVE_GCONF) char *s; -#ifdef HAVE_G_TYPE_INIT +#if ! GLIB_CHECK_VERSION (2, 36, 0) g_type_init (); #endif diff --git a/src/xsettings.h b/src/xsettings.h index e3738c593bd..a017c5d92d8 100644 --- a/src/xsettings.h +++ b/src/xsettings.h @@ -20,9 +20,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #ifndef XSETTINGS_H #define XSETTINGS_H -extern void xsettings_initialize (struct x_display_info *dpyinfo); -extern void xft_settings_event (struct x_display_info *dpyinfo, - XEvent *); +extern void xsettings_initialize (struct x_display_info *); +extern void xft_settings_event (struct x_display_info *, const XEvent *); extern const char *xsettings_get_system_font (void); #ifdef USE_LUCID extern const char *xsettings_get_system_normal_font (void); diff --git a/src/xterm.c b/src/xterm.c index 2f3d5ca7a01..1ccc1ae649b 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -23,8 +23,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> #include <stdio.h> -#ifdef HAVE_X_WINDOWS - #include "lisp.h" #include "blockinput.h" #include "syssignal.h" @@ -86,7 +84,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #endif #endif -#ifdef USE_LUCID +#if defined (USE_LUCID) || defined (USE_MOTIF) #include "../lwlib/xlwmenu.h" #endif @@ -157,82 +155,22 @@ struct x_display_info *x_display_list; Lisp_Object x_display_name_list; -/* This is a frame waiting to be auto-raised, within XTread_socket. */ - -static struct frame *pending_autoraise_frame; - -/* This is a frame waiting for an event matching mask, within XTread_socket. */ - -static struct { - struct frame *f; - int eventtype; -} pending_event_wait; - #ifdef USE_X_TOOLKIT + /* The application context for Xt use. */ XtAppContext Xt_app_con; static String Xt_default_resources[] = {0}; /* Non-zero means user is interacting with a toolkit scroll bar. */ +static bool toolkit_scroll_bar_interaction; -static int toolkit_scroll_bar_interaction; #endif /* USE_X_TOOLKIT */ /* Non-zero timeout value means ignore next mouse click if it arrives before that timeout elapses (i.e. as part of the same sequence of events resulting from clicking on a frame to select it). */ -static unsigned long ignore_next_mouse_click_timeout; - -/* Mouse movement. - - Formerly, we used PointerMotionHintMask (in standard_event_mask) - so that we would have to call XQueryPointer after each MotionNotify - event to ask for another such event. However, this made mouse tracking - slow, and there was a bug that made it eventually stop. - - Simply asking for MotionNotify all the time seems to work better. - - In order to avoid asking for motion events and then throwing most - of them away or busy-polling the server for mouse positions, we ask - the server for pointer motion hints. This means that we get only - one event per group of mouse movements. "Groups" are delimited by - other kinds of events (focus changes and button clicks, for - example), or by XQueryPointer calls; when one of these happens, we - get another MotionNotify event the next time the mouse moves. This - is at least as efficient as getting motion events when mouse - tracking is on, and I suspect only negligibly worse when tracking - is off. */ - -/* Where the mouse was last time we reported a mouse event. */ - -static XRectangle last_mouse_glyph; -static struct frame *last_mouse_glyph_frame; - -/* The scroll bar in which the last X motion event occurred. - - If the last X motion event occurred in a scroll bar, we set this so - XTmouse_position can know whether to report a scroll bar motion or - an ordinary motion. - - If the last X motion event didn't occur in a scroll bar, we set - this to Qnil, to tell XTmouse_position to return an ordinary motion - event. */ - -static Lisp_Object last_mouse_scroll_bar; - -/* This is a hack. We would really prefer that XTmouse_position would - return the time associated with the position it returns, but there - doesn't seem to be any way to wrest the time-stamp from the server - along with the position query. So, we just keep track of the time - of the last movement we received, and return that in hopes that - it's somewhat accurate. */ - -static Time last_mouse_movement_time; - -/* Time for last user interaction as returned in X events. */ - -static Time last_user_time; +static Time ignore_next_mouse_click_timeout; /* Incremented by XTread_socket whenever it really tries to read events. */ @@ -299,8 +237,6 @@ static void frame_unhighlight (struct frame *); static void x_new_focus_frame (struct x_display_info *, struct frame *); static void x_focus_changed (int, int, struct x_display_info *, struct frame *, struct input_event *); -static void x_detect_focus_change (struct x_display_info *, - XEvent *, struct input_event *); static void XTframe_rehighlight (struct frame *); static void x_frame_rehighlight (struct x_display_info *); static void x_draw_hollow_cursor (struct window *, struct glyph_row *); @@ -317,12 +253,13 @@ static void x_scroll_bar_report_motion (struct frame **, Lisp_Object *, enum scroll_bar_part *, Lisp_Object *, Lisp_Object *, Time *); -static int x_handle_net_wm_state (struct frame *, XPropertyEvent *); +static int x_handle_net_wm_state (struct frame *, const XPropertyEvent *); static void x_check_fullscreen (struct frame *); static void x_check_expected_move (struct frame *, int, int); static void x_sync_with_move (struct frame *, int, int, int); -static int handle_one_xevent (struct x_display_info *, XEvent *, - int *, struct input_event *); +static int handle_one_xevent (struct x_display_info *, + const XEvent *, int *, + struct input_event *); #ifdef USE_GTK static int x_dispatch_event (XEvent *, Display *); #endif @@ -334,29 +271,19 @@ static void x_wm_set_icon_pixmap (struct frame *, ptrdiff_t); static void x_initialize (void); -/* Flush display of frame F, or of all frames if F is null. */ +/* Flush display of frame F. */ static void x_flush (struct frame *f) { + eassert (f && FRAME_X_P (f)); /* Don't call XFlush when it is not safe to redisplay; the X connection may be broken. */ if (!NILP (Vinhibit_redisplay)) return; block_input (); - if (f) - { - eassert (FRAME_X_P (f)); - XFlush (FRAME_X_DISPLAY (f)); - } - else - { - /* Flush all displays and so all frames on them. */ - struct x_display_info *xdi; - for (xdi = x_display_list; xdi; xdi = xdi->next) - XFlush (xdi->display); - } + XFlush (FRAME_X_DISPLAY (f)); unblock_input (); } @@ -426,7 +353,7 @@ x_find_topmost_parent (struct frame *f) Window win = None, wi = x->parent_desc; Display *dpy = FRAME_X_DISPLAY (f); - while (wi != FRAME_X_DISPLAY_INFO (f)->root_window) + while (wi != FRAME_DISPLAY_INFO (f)->root_window) { Window root; Window *children; @@ -445,7 +372,7 @@ x_find_topmost_parent (struct frame *f) void x_set_frame_alpha (struct frame *f) { - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); Display *dpy = FRAME_X_DISPLAY (f); Window win = FRAME_OUTER_WINDOW (f); double alpha = 1.0; @@ -802,7 +729,7 @@ x_draw_fringe_bitmap (struct window *w, struct glyph_row *row, struct draw_fring if (p->overlay_p) { clipmask = XCreatePixmapFromBitmapData (display, - FRAME_X_DISPLAY_INFO (f)->root_window, + FRAME_DISPLAY_INFO (f)->root_window, bits, p->wd, p->h, 1, 0, 1); gcv.clip_mask = clipmask; @@ -906,14 +833,14 @@ x_set_cursor_gc (struct glyph_string *s) xgcv.graphics_exposures = False; mask = GCForeground | GCBackground | GCGraphicsExposures; - if (FRAME_X_DISPLAY_INFO (s->f)->scratch_cursor_gc) - XChangeGC (s->display, FRAME_X_DISPLAY_INFO (s->f)->scratch_cursor_gc, + if (FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc) + XChangeGC (s->display, FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc, mask, &xgcv); else - FRAME_X_DISPLAY_INFO (s->f)->scratch_cursor_gc + FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc = XCreateGC (s->display, s->window, mask, &xgcv); - s->gc = FRAME_X_DISPLAY_INFO (s->f)->scratch_cursor_gc; + s->gc = FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc; } } @@ -953,14 +880,14 @@ x_set_mouse_face_gc (struct glyph_string *s) xgcv.graphics_exposures = False; mask = GCForeground | GCBackground | GCGraphicsExposures; - if (FRAME_X_DISPLAY_INFO (s->f)->scratch_cursor_gc) - XChangeGC (s->display, FRAME_X_DISPLAY_INFO (s->f)->scratch_cursor_gc, + if (FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc) + XChangeGC (s->display, FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc, mask, &xgcv); else - FRAME_X_DISPLAY_INFO (s->f)->scratch_cursor_gc + FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc = XCreateGC (s->display, s->window, mask, &xgcv); - s->gc = FRAME_X_DISPLAY_INFO (s->f)->scratch_cursor_gc; + s->gc = FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc; } eassert (s->gc != 0); @@ -1396,7 +1323,7 @@ x_frame_of_widget (Widget widget) f = XFRAME (frame); if (FRAME_X_P (f) && f->output_data.nothing != 1 - && FRAME_X_DISPLAY_INFO (f) == dpyinfo + && FRAME_DISPLAY_INFO (f) == dpyinfo && f->output_data.x->widget == widget) return f; } @@ -1605,7 +1532,7 @@ x_color_cells (Display *dpy, int *ncells) void x_query_colors (struct frame *f, XColor *colors, int ncolors) { - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); if (dpyinfo->color_cells) { @@ -1845,7 +1772,7 @@ x_setup_relief_color (struct frame *f, struct relief *relief, double factor, int unsigned long pixel; unsigned long background = di->relief_background; Colormap cmap = FRAME_X_COLORMAP (f); - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); Display *dpy = FRAME_X_DISPLAY (f); xgcv.graphics_exposures = False; @@ -3035,26 +2962,7 @@ XTflash (struct frame *f) /* These will be the left and right margins of the rectangles. */ int flash_left = FRAME_INTERNAL_BORDER_WIDTH (f); int flash_right = FRAME_PIXEL_WIDTH (f) - FRAME_INTERNAL_BORDER_WIDTH (f); - - int width; - - /* Don't flash the area between a scroll bar and the frame - edge it is next to. */ - switch (FRAME_VERTICAL_SCROLL_BAR_TYPE (f)) - { - case vertical_scroll_bar_left: - flash_left += VERTICAL_SCROLL_BAR_WIDTH_TRIM; - break; - - case vertical_scroll_bar_right: - flash_right -= VERTICAL_SCROLL_BAR_WIDTH_TRIM; - break; - - default: - break; - } - - width = flash_right - flash_left; + int width = flash_right - flash_left; /* If window is tall, flash top and bottom line. */ if (height > 3 * FRAME_LINE_HEIGHT (f)) @@ -3146,9 +3054,9 @@ XTtoggle_invisible_pointer (struct frame *f, int invisible) block_input (); if (invisible) { - if (FRAME_X_DISPLAY_INFO (f)->invisible_cursor != 0) + if (FRAME_DISPLAY_INFO (f)->invisible_cursor != 0) XDefineCursor (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), - FRAME_X_DISPLAY_INFO (f)->invisible_cursor); + FRAME_DISPLAY_INFO (f)->invisible_cursor); } else XDefineCursor (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), @@ -3341,9 +3249,9 @@ x_new_focus_frame (struct x_display_info *dpyinfo, struct frame *frame) x_lower_frame (old_focus); if (dpyinfo->x_focus_frame && dpyinfo->x_focus_frame->auto_raise) - pending_autoraise_frame = dpyinfo->x_focus_frame; + dpyinfo->x_pending_autoraise_frame = dpyinfo->x_focus_frame; else - pending_autoraise_frame = 0; + dpyinfo->x_pending_autoraise_frame = NULL; } x_frame_rehighlight (dpyinfo); @@ -3403,18 +3311,192 @@ x_focus_changed (int type, int state, struct x_display_info *dpyinfo, struct fra } } +/* Return the Emacs frame-object corresponding to an X window. + It could be the frame's main window or an icon window. */ + +static struct frame * +x_window_to_frame (struct x_display_info *dpyinfo, int wdesc) +{ + Lisp_Object tail, frame; + struct frame *f; + + if (wdesc == None) + return NULL; + + FOR_EACH_FRAME (tail, frame) + { + f = XFRAME (frame); + if (!FRAME_X_P (f) || FRAME_DISPLAY_INFO (f) != dpyinfo) + continue; + if (f->output_data.x->hourglass_window == wdesc) + return f; +#ifdef USE_X_TOOLKIT + if ((f->output_data.x->edit_widget + && XtWindow (f->output_data.x->edit_widget) == wdesc) + /* A tooltip frame? */ + || (!f->output_data.x->edit_widget + && FRAME_X_WINDOW (f) == wdesc) + || f->output_data.x->icon_desc == wdesc) + return f; +#else /* not USE_X_TOOLKIT */ +#ifdef USE_GTK + if (f->output_data.x->edit_widget) + { + GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); + struct x_output *x = f->output_data.x; + if (gwdesc != 0 && gwdesc == x->edit_widget) + return f; + } +#endif /* USE_GTK */ + if (FRAME_X_WINDOW (f) == wdesc + || f->output_data.x->icon_desc == wdesc) + return f; +#endif /* not USE_X_TOOLKIT */ + } + return 0; +} + +#if defined (USE_X_TOOLKIT) || defined (USE_GTK) + +/* Like x_window_to_frame but also compares the window with the widget's + windows. */ + +static struct frame * +x_any_window_to_frame (struct x_display_info *dpyinfo, int wdesc) +{ + Lisp_Object tail, frame; + struct frame *f, *found = NULL; + struct x_output *x; + + if (wdesc == None) + return NULL; + + FOR_EACH_FRAME (tail, frame) + { + if (found) + break; + f = XFRAME (frame); + if (FRAME_X_P (f) && FRAME_DISPLAY_INFO (f) == dpyinfo) + { + /* This frame matches if the window is any of its widgets. */ + x = f->output_data.x; + if (x->hourglass_window == wdesc) + found = f; + else if (x->widget) + { +#ifdef USE_GTK + GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); + if (gwdesc != 0 + && gtk_widget_get_toplevel (gwdesc) == x->widget) + found = f; +#else + if (wdesc == XtWindow (x->widget) + || wdesc == XtWindow (x->column_widget) + || wdesc == XtWindow (x->edit_widget)) + found = f; + /* Match if the window is this frame's menubar. */ + else if (lw_window_is_in_menubar (wdesc, x->menubar_widget)) + found = f; +#endif + } + else if (FRAME_X_WINDOW (f) == wdesc) + /* A tooltip frame. */ + found = f; + } + } + + return found; +} + +/* Likewise, but consider only the menu bar widget. */ + +static struct frame * +x_menubar_window_to_frame (struct x_display_info *dpyinfo, + const XEvent *event) +{ + Window wdesc = event->xany.window; + Lisp_Object tail, frame; + struct frame *f; + struct x_output *x; + + if (wdesc == None) + return NULL; + + FOR_EACH_FRAME (tail, frame) + { + f = XFRAME (frame); + if (!FRAME_X_P (f) || FRAME_DISPLAY_INFO (f) != dpyinfo) + continue; + x = f->output_data.x; +#ifdef USE_GTK + if (x->menubar_widget && xg_event_is_for_menubar (f, event)) + return f; +#else + /* Match if the window is this frame's menubar. */ + if (x->menubar_widget + && lw_window_is_in_menubar (wdesc, x->menubar_widget)) + return f; +#endif + } + return 0; +} + +/* Return the frame whose principal (outermost) window is WDESC. + If WDESC is some other (smaller) window, we return 0. */ + +struct frame * +x_top_window_to_frame (struct x_display_info *dpyinfo, int wdesc) +{ + Lisp_Object tail, frame; + struct frame *f; + struct x_output *x; + + if (wdesc == None) + return NULL; + + FOR_EACH_FRAME (tail, frame) + { + f = XFRAME (frame); + if (!FRAME_X_P (f) || FRAME_DISPLAY_INFO (f) != dpyinfo) + continue; + x = f->output_data.x; + + if (x->widget) + { + /* This frame matches if the window is its topmost widget. */ +#ifdef USE_GTK + GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); + if (gwdesc == x->widget) + return f; +#else + if (wdesc == XtWindow (x->widget)) + return f; +#endif + } + else if (FRAME_X_WINDOW (f) == wdesc) + /* Tooltip frame. */ + return f; + } + return 0; +} + +#else /* !USE_X_TOOLKIT && !USE_GTK */ + +#define x_any_window_to_frame(d, i) x_window_to_frame (d, i) +#define x_top_window_to_frame(d, i) x_window_to_frame (d, i) + +#endif /* USE_X_TOOLKIT || USE_GTK */ + /* The focus may have changed. Figure out if it is a real focus change, by checking both FocusIn/Out and Enter/LeaveNotify events. Returns FOCUS_IN_EVENT event in *BUFP. */ static void -x_detect_focus_change (struct x_display_info *dpyinfo, XEvent *event, struct input_event *bufp) +x_detect_focus_change (struct x_display_info *dpyinfo, struct frame *frame, + const XEvent *event, struct input_event *bufp) { - struct frame *frame; - - frame = x_any_window_to_frame (dpyinfo, event->xany.window); - if (! frame) + if (!frame) return; switch (event->type) @@ -3476,7 +3558,7 @@ x_mouse_leave (struct x_display_info *dpyinfo) static void XTframe_rehighlight (struct frame *frame) { - x_frame_rehighlight (FRAME_X_DISPLAY_INFO (frame)); + x_frame_rehighlight (FRAME_DISPLAY_INFO (frame)); } static void @@ -3692,9 +3774,25 @@ x_get_keysym_name (int keysym) return value; } +/* Mouse clicks and mouse movement. Rah. - -/* Mouse clicks and mouse movement. Rah. */ + Formerly, we used PointerMotionHintMask (in standard_event_mask) + so that we would have to call XQueryPointer after each MotionNotify + event to ask for another such event. However, this made mouse tracking + slow, and there was a bug that made it eventually stop. + + Simply asking for MotionNotify all the time seems to work better. + + In order to avoid asking for motion events and then throwing most + of them away or busy-polling the server for mouse positions, we ask + the server for pointer motion hints. This means that we get only + one event per group of mouse movements. "Groups" are delimited by + other kinds of events (focus changes and button clicks, for + example), or by XQueryPointer calls; when one of these happens, we + get another MotionNotify event the next time the mouse moves. This + is at least as efficient as getting motion events when mouse + tracking is on, and I suspect only negligibly worse when tracking + is off. */ /* Prepare a mouse-event in *RESULT for placement in the input queue. @@ -3702,14 +3800,16 @@ x_get_keysym_name (int keysym) the mouse. */ static Lisp_Object -construct_mouse_click (struct input_event *result, XButtonEvent *event, struct frame *f) +construct_mouse_click (struct input_event *result, + const XButtonEvent *event, + struct frame *f) { /* Make the event type NO_EVENT; we'll change that when we decide otherwise. */ result->kind = MOUSE_CLICK_EVENT; result->code = event->button - Button1; result->timestamp = event->time; - result->modifiers = (x_x_to_emacs_modifiers (FRAME_X_DISPLAY_INFO (f), + result->modifiers = (x_x_to_emacs_modifiers (FRAME_DISPLAY_INFO (f), event->state) | (event->type == ButtonRelease ? up_modifier @@ -3730,65 +3830,49 @@ construct_mouse_click (struct input_event *result, XButtonEvent *event, struct f the mainstream emacs code by setting mouse_moved. If not, ask for another motion event, so we can check again the next time it moves. */ -static XMotionEvent last_mouse_motion_event; -static Lisp_Object last_mouse_motion_frame; - static int -note_mouse_movement (struct frame *frame, XMotionEvent *event) +note_mouse_movement (struct frame *frame, const XMotionEvent *event) { - last_mouse_movement_time = event->time; - last_mouse_motion_event = *event; - XSETFRAME (last_mouse_motion_frame, frame); + XRectangle *r; + struct x_display_info *dpyinfo; if (!FRAME_X_OUTPUT (frame)) return 0; + dpyinfo = FRAME_DISPLAY_INFO (frame); + dpyinfo->last_mouse_movement_time = event->time; + dpyinfo->last_mouse_motion_frame = frame; + dpyinfo->last_mouse_motion_x = event->x; + dpyinfo->last_mouse_motion_y = event->y; + if (event->window != FRAME_X_WINDOW (frame)) { frame->mouse_moved = 1; - last_mouse_scroll_bar = Qnil; + dpyinfo->last_mouse_scroll_bar = NULL; note_mouse_highlight (frame, -1, -1); - last_mouse_glyph_frame = 0; + dpyinfo->last_mouse_glyph_frame = NULL; return 1; } /* Has the mouse moved off the glyph it was on at the last sighting? */ - if (frame != last_mouse_glyph_frame - || event->x < last_mouse_glyph.x - || event->x >= last_mouse_glyph.x + last_mouse_glyph.width - || event->y < last_mouse_glyph.y - || event->y >= last_mouse_glyph.y + last_mouse_glyph.height) + r = &dpyinfo->last_mouse_glyph; + if (frame != dpyinfo->last_mouse_glyph_frame + || event->x < r->x || event->x >= r->x + r->width + || event->y < r->y || event->y >= r->y + r->height) { frame->mouse_moved = 1; - last_mouse_scroll_bar = Qnil; + dpyinfo->last_mouse_scroll_bar = NULL; note_mouse_highlight (frame, event->x, event->y); /* Remember which glyph we're now on. */ - remember_mouse_glyph (frame, event->x, event->y, &last_mouse_glyph); - last_mouse_glyph_frame = frame; + remember_mouse_glyph (frame, event->x, event->y, r); + dpyinfo->last_mouse_glyph_frame = frame; return 1; } return 0; } - -/************************************************************************ - Mouse Face - ************************************************************************/ - -static void -redo_mouse_highlight (void) -{ - if (!NILP (last_mouse_motion_frame) - && FRAME_LIVE_P (XFRAME (last_mouse_motion_frame))) - note_mouse_highlight (XFRAME (last_mouse_motion_frame), - last_mouse_motion_event.x, - last_mouse_motion_event.y); -} - - - /* Return the current position of the mouse. *FP should be a frame which indicates which display to ask about. @@ -3815,10 +3899,11 @@ XTmouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, Time *timestamp) { struct frame *f1; + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (*fp); block_input (); - if (! NILP (last_mouse_scroll_bar) && insist == 0) + if (dpyinfo->last_mouse_scroll_bar && insist == 0) x_scroll_bar_report_motion (fp, bar_window, part, x, y, timestamp); else { @@ -3836,7 +3921,7 @@ XTmouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, && FRAME_X_DISPLAY (XFRAME (frame)) == FRAME_X_DISPLAY (*fp)) XFRAME (frame)->mouse_moved = 0; - last_mouse_scroll_bar = Qnil; + dpyinfo->last_mouse_scroll_bar = NULL; /* Figure out which root window we're on. */ XQueryPointer (FRAME_X_DISPLAY (*fp), @@ -3874,22 +3959,24 @@ XTmouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, x_catch_errors (FRAME_X_DISPLAY (*fp)); - if (FRAME_X_DISPLAY_INFO (*fp)->grabbed && last_mouse_frame - && FRAME_LIVE_P (last_mouse_frame)) + if (x_mouse_grabbed (dpyinfo)) { /* If mouse was grabbed on a frame, give coords for that frame even if the mouse is now outside it. */ XTranslateCoordinates (FRAME_X_DISPLAY (*fp), - /* From-window, to-window. */ - root, FRAME_X_WINDOW (last_mouse_frame), + /* From-window. */ + root, + + /* To-window. */ + FRAME_X_WINDOW (dpyinfo->last_mouse_frame), /* From-position, to-position. */ root_x, root_y, &win_x, &win_y, /* Child of win. */ &child); - f1 = last_mouse_frame; + f1 = dpyinfo->last_mouse_frame; } else { @@ -3913,7 +4000,7 @@ XTmouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, want the edit window. For non-Gtk+ the innermost window is the edit window. For Gtk+ it might not be. It might be the tool bar for example. */ - if (x_window_to_frame (FRAME_X_DISPLAY_INFO (*fp), win)) + if (x_window_to_frame (dpyinfo, win)) break; #endif win = child; @@ -3935,10 +4022,10 @@ XTmouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, #ifdef USE_GTK /* We don't wan't to know the innermost window. We want the edit window. */ - f1 = x_window_to_frame (FRAME_X_DISPLAY_INFO (*fp), win); + f1 = x_window_to_frame (dpyinfo, win); #else /* Is win one of our frames? */ - f1 = x_any_window_to_frame (FRAME_X_DISPLAY_INFO (*fp), win); + f1 = x_any_window_to_frame (dpyinfo, win); #endif #ifdef USE_X_TOOLKIT @@ -3984,15 +4071,17 @@ XTmouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, on it, i.e. into the same rectangles that matrices on the frame are divided into. */ - remember_mouse_glyph (f1, win_x, win_y, &last_mouse_glyph); - last_mouse_glyph_frame = f1; + /* FIXME: what if F1 is not an X frame? */ + dpyinfo = FRAME_DISPLAY_INFO (f1); + remember_mouse_glyph (f1, win_x, win_y, &dpyinfo->last_mouse_glyph); + dpyinfo->last_mouse_glyph_frame = f1; *bar_window = Qnil; *part = 0; *fp = f1; XSETINT (*x, win_x); XSETINT (*y, win_y); - *timestamp = last_mouse_movement_time; + *timestamp = dpyinfo->last_mouse_movement_time; } } } @@ -4078,23 +4167,13 @@ x_window_to_menu_bar (Window window) #ifdef USE_TOOLKIT_SCROLL_BARS -static void x_scroll_bar_to_input_event (XEvent *, struct input_event *); static void x_send_scroll_bar_event (Lisp_Object, int, int, int); -static void x_create_toolkit_scroll_bar (struct frame *, - struct scroll_bar *); -static void x_set_toolkit_scroll_bar_thumb (struct scroll_bar *, - int, int, int); - /* Lisp window being scrolled. Set when starting to interact with a toolkit scroll bar, reset to nil when ending the interaction. */ static Lisp_Object window_being_scrolled; -/* Last scroll bar part sent in xm_scroll_callback. */ - -static int last_scroll_bar_part; - /* Whether this is an Xaw with arrow-scrollbars. This should imply that movements of 1/20 of the screen size are mapped to up/down. */ @@ -4136,33 +4215,29 @@ xt_action_hook (Widget widget, XtPointer client_data, String action_name, && WINDOWP (window_being_scrolled)) { struct window *w; + struct scroll_bar *bar; x_send_scroll_bar_event (window_being_scrolled, scroll_bar_end_scroll, 0, 0); w = XWINDOW (window_being_scrolled); + bar = XSCROLL_BAR (w->vertical_scroll_bar); - if (XSCROLL_BAR (w->vertical_scroll_bar)->dragging != -1) + if (bar->dragging != -1) { - XSCROLL_BAR (w->vertical_scroll_bar)->dragging = -1; + bar->dragging = -1; /* The thumb size is incorrect while dragging: fix it. */ set_vertical_scroll_bar (w); } window_being_scrolled = Qnil; - last_scroll_bar_part = -1; - +#if defined (USE_LUCID) + bar->last_seen_part = scroll_bar_nowhere; +#endif /* Xt timeouts no longer needed. */ toolkit_scroll_bar_interaction = 0; } } #endif /* not USE_GTK */ -/* A vector of windows used for communication between - x_send_scroll_bar_event and x_scroll_bar_to_input_event. */ - -static struct window **scroll_bar_windows; -static ptrdiff_t scroll_bar_windows_size; - - /* Send a client message with message type Xatom_Scrollbar for a scroll action to the frame of WINDOW. PART is a value identifying the part of the scroll bar that was clicked on. PORTION is the @@ -4172,47 +4247,33 @@ static void x_send_scroll_bar_event (Lisp_Object window, int part, int portion, int whole) { XEvent event; - XClientMessageEvent *ev = (XClientMessageEvent *) &event; + XClientMessageEvent *ev = &event.xclient; struct window *w = XWINDOW (window); struct frame *f = XFRAME (w->frame); - ptrdiff_t i; + intptr_t iw = (intptr_t) w; + enum { BITS_PER_INTPTR = CHAR_BIT * sizeof iw }; + verify (BITS_PER_INTPTR <= 64); + int sign_shift = BITS_PER_INTPTR - 32; block_input (); /* Construct a ClientMessage event to send to the frame. */ ev->type = ClientMessage; - ev->message_type = FRAME_X_DISPLAY_INFO (f)->Xatom_Scrollbar; + ev->message_type = FRAME_DISPLAY_INFO (f)->Xatom_Scrollbar; ev->display = FRAME_X_DISPLAY (f); ev->window = FRAME_X_WINDOW (f); ev->format = 32; - /* We can only transfer 32 bits in the XClientMessageEvent, which is - not enough to store a pointer or Lisp_Object on a 64 bit system. - So, store the window in scroll_bar_windows and pass the index - into that array in the event. */ - for (i = 0; i < scroll_bar_windows_size; ++i) - if (scroll_bar_windows[i] == NULL) - break; - - if (i == scroll_bar_windows_size) - { - ptrdiff_t old_nbytes = - scroll_bar_windows_size * sizeof *scroll_bar_windows; - ptrdiff_t nbytes; - enum { XClientMessageEvent_MAX = 0x7fffffff }; - scroll_bar_windows = - xpalloc (scroll_bar_windows, &scroll_bar_windows_size, 1, - XClientMessageEvent_MAX, sizeof *scroll_bar_windows); - nbytes = scroll_bar_windows_size * sizeof *scroll_bar_windows; - memset (&scroll_bar_windows[i], 0, nbytes - old_nbytes); - } - - scroll_bar_windows[i] = w; - ev->data.l[0] = (long) i; - ev->data.l[1] = (long) part; - ev->data.l[2] = (long) 0; - ev->data.l[3] = (long) portion; - ev->data.l[4] = (long) whole; + /* A 32-bit X client on a 64-bit X server can pass a window pointer + as-is. A 64-bit client on a 32-bit X server is in trouble + because a pointer does not fit and would be truncated while + passing through the server. So use two slots and hope that X12 + will resolve such issues someday. */ + ev->data.l[0] = iw >> 31 >> 1; + ev->data.l[1] = sign_shift <= 0 ? iw : iw << sign_shift >> sign_shift; + ev->data.l[2] = part; + ev->data.l[3] = portion; + ev->data.l[4] = whole; /* Make Xt timeouts work while the scroll bar is active. */ #ifdef USE_X_TOOLKIT @@ -4232,14 +4293,18 @@ x_send_scroll_bar_event (Lisp_Object window, int part, int portion, int whole) in *IEVENT. */ static void -x_scroll_bar_to_input_event (XEvent *event, struct input_event *ievent) +x_scroll_bar_to_input_event (const XEvent *event, + struct input_event *ievent) { - XClientMessageEvent *ev = (XClientMessageEvent *) event; + const XClientMessageEvent *ev = &event->xclient; Lisp_Object window; struct window *w; - w = scroll_bar_windows[ev->data.l[0]]; - scroll_bar_windows[ev->data.l[0]] = NULL; + /* See the comment in the function above. */ + intptr_t iw0 = ev->data.l[0]; + intptr_t iw1 = ev->data.l[1]; + intptr_t iw = (iw0 << 31 << 1) + (iw1 & 0xffffffffu); + w = (struct window *) iw; XSETWINDOW (window, w); @@ -4252,10 +4317,10 @@ x_scroll_bar_to_input_event (XEvent *event, struct input_event *ievent) ievent->timestamp = XtLastTimestampProcessed (FRAME_X_DISPLAY (XFRAME (w->frame))); #endif - ievent->part = ev->data.l[1]; - ievent->code = ev->data.l[2]; - ievent->x = make_number ((int) ev->data.l[3]); - ievent->y = make_number ((int) ev->data.l[4]); + ievent->code = 0; + ievent->part = ev->data.l[2]; + ievent->x = make_number (ev->data.l[3]); + ievent->y = make_number (ev->data.l[4]); ievent->modifiers = 0; } @@ -4333,7 +4398,6 @@ xm_scroll_callback (Widget widget, XtPointer client_data, XtPointer call_data) if (part >= 0) { window_being_scrolled = bar->window; - last_scroll_bar_part = part; x_send_scroll_bar_event (bar->window, part, portion, whole); } } @@ -4363,8 +4427,8 @@ xg_scroll_callback (GtkRange *range, { case GTK_SCROLL_JUMP: /* Buttons 1 2 or 3 must be grabbed. */ - if (FRAME_X_DISPLAY_INFO (f)->grabbed != 0 - && FRAME_X_DISPLAY_INFO (f)->grabbed < (1 << 4)) + if (FRAME_DISPLAY_INFO (f)->grabbed != 0 + && FRAME_DISPLAY_INFO (f)->grabbed < (1 << 4)) { part = scroll_bar_handle; whole = gtk_adjustment_get_upper (adj) - @@ -4394,7 +4458,6 @@ xg_scroll_callback (GtkRange *range, if (part >= 0) { window_being_scrolled = bar->window; - last_scroll_bar_part = part; x_send_scroll_bar_event (bar->window, part, portion, whole); } @@ -4436,7 +4499,7 @@ xaw_jump_callback (Widget widget, XtPointer client_data, XtPointer call_data) float top = *top_addr; float shown; int whole, portion, height; - int part; + enum scroll_bar_part part; /* Get the size of the thumb, a value between 0 and 1. */ block_input (); @@ -4458,7 +4521,7 @@ xaw_jump_callback (Widget widget, XtPointer client_data, XtPointer call_data) window_being_scrolled = bar->window; bar->dragging = portion; - last_scroll_bar_part = part; + bar->last_seen_part = part; x_send_scroll_bar_event (bar->window, part, portion, whole); } @@ -4478,7 +4541,7 @@ xaw_scroll_callback (Widget widget, XtPointer client_data, XtPointer call_data) /* The position really is stored cast to a pointer. */ int position = (intptr_t) call_data; Dimension height; - int part; + enum scroll_bar_part part; /* Get the height of the scroll bar. */ block_input (); @@ -4497,7 +4560,7 @@ xaw_scroll_callback (Widget widget, XtPointer client_data, XtPointer call_data) window_being_scrolled = bar->window; bar->dragging = -1; - last_scroll_bar_part = part; + bar->last_seen_part = part; x_send_scroll_bar_event (bar->window, part, position, height); } @@ -4807,16 +4870,25 @@ x_set_toolkit_scroll_bar_thumb (struct scroll_bar *bar, int portion, int positio NULL); /* Massage the top+shown values. */ - if (bar->dragging == -1 || last_scroll_bar_part == scroll_bar_down_arrow) + if (bar->dragging == -1 || bar->last_seen_part == scroll_bar_down_arrow) top = max (0, min (1, top)); else top = old_top; +#if ! defined (HAVE_XAW3D) + /* With Xaw, 'top' values too closer to 1.0 may + cause the thumb to disappear. Fix that. */ + top = min (top, 0.99f); +#endif /* Keep two pixels available for moving the thumb down. */ shown = max (0, min (1 - top - (2.0f / height), shown)); +#if ! defined (HAVE_XAW3D) + /* Likewise with too small 'shown'. */ + shown = max (shown, 0.01f); +#endif - /* If the call to XawScrollbarSetThumb below doesn't seem to work, - check that your system's configuration file contains a define - for `NARROWPROTO'. See s/freebsd.h for an example. */ + /* If the call to XawScrollbarSetThumb below doesn't seem to + work, check that 'NARROWPROTO' is defined in src/config.h. + If this is not so, most likely you need to fix configure. */ if (top != old_top || shown != old_shown) { if (bar->dragging == -1) @@ -4875,7 +4947,7 @@ x_scroll_bar_create (struct window *w, int top, int left, int width, int height) a.event_mask = (ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | PointerMotionHintMask | ExposureMask); - a.cursor = FRAME_X_DISPLAY_INFO (f)->vertical_scroll_bar_cursor; + a.cursor = FRAME_DISPLAY_INFO (f)->vertical_scroll_bar_cursor; mask = (CWBackPixel | CWEventMask | CWCursor); @@ -4888,12 +4960,9 @@ x_scroll_bar_create (struct window *w, int top, int left, int width, int height) window = XCreateWindow (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), /* Position and size of scroll bar. */ - left + VERTICAL_SCROLL_BAR_WIDTH_TRIM, - top, - width - VERTICAL_SCROLL_BAR_WIDTH_TRIM * 2, - height, + left, top, width, height, /* Border width, depth, class, and visual. */ - 0, + 0, CopyFromParent, CopyFromParent, CopyFromParent, @@ -4912,6 +4981,9 @@ x_scroll_bar_create (struct window *w, int top, int left, int width, int height) bar->end = 0; bar->dragging = -1; bar->fringe_extended_p = 0; +#if defined (USE_TOOLKIT_SCROLL_BARS) && defined (USE_LUCID) + bar->last_seen_part = scroll_bar_nowhere; +#endif /* Add bar to its frame's list of scroll bars. */ bar->next = FRAME_SCROLL_BARS (f); @@ -4925,19 +4997,11 @@ x_scroll_bar_create (struct window *w, int top, int left, int width, int height) #ifdef USE_TOOLKIT_SCROLL_BARS { #ifdef USE_GTK - xg_update_scrollbar_pos (f, - bar->x_window, - top, - left + VERTICAL_SCROLL_BAR_WIDTH_TRIM, - width - VERTICAL_SCROLL_BAR_WIDTH_TRIM * 2, - max (height, 1)); + xg_update_scrollbar_pos (f, bar->x_window, top, + left,width, max (height, 1)); #else /* not USE_GTK */ Widget scroll_bar = SCROLL_BAR_X_WIDGET (FRAME_X_DISPLAY (f), bar); - XtConfigureWidget (scroll_bar, - left + VERTICAL_SCROLL_BAR_WIDTH_TRIM, - top, - width - VERTICAL_SCROLL_BAR_WIDTH_TRIM * 2, - max (height, 1), 0); + XtConfigureWidget (scroll_bar, left, top, width, max (height, 1), 0); XtMapWidget (scroll_bar); #endif /* not USE_GTK */ } @@ -5185,33 +5249,15 @@ XTset_vertical_scroll_bar (struct window *w, int portion, int whole, int positio left, top, width, height); } #ifdef USE_GTK - xg_update_scrollbar_pos (f, - bar->x_window, - top, - sb_left + VERTICAL_SCROLL_BAR_WIDTH_TRIM, - sb_width - VERTICAL_SCROLL_BAR_WIDTH_TRIM *2, - max (height, 1)); + xg_update_scrollbar_pos (f, bar->x_window, top, + sb_left, sb_width, max (height, 1)); #else /* not USE_GTK */ XtConfigureWidget (SCROLL_BAR_X_WIDGET (FRAME_X_DISPLAY (f), bar), - sb_left + VERTICAL_SCROLL_BAR_WIDTH_TRIM, - top, - sb_width - VERTICAL_SCROLL_BAR_WIDTH_TRIM * 2, - max (height, 1), 0); + sb_left, top, sb_width, max (height, 1), 0); #endif /* not USE_GTK */ } #else /* not USE_TOOLKIT_SCROLL_BARS */ - /* Clear areas not covered by the scroll bar because of - VERTICAL_SCROLL_BAR_WIDTH_TRIM. */ - if (VERTICAL_SCROLL_BAR_WIDTH_TRIM) - { - x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), - left, top, VERTICAL_SCROLL_BAR_WIDTH_TRIM, height); - x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), - left + width - VERTICAL_SCROLL_BAR_WIDTH_TRIM, - top, VERTICAL_SCROLL_BAR_WIDTH_TRIM, height); - } - /* Clear areas not covered by the scroll bar because it's not as wide as the area reserved for it. This makes sure a previous mode line display is cleared after C-x 2 C-x 1, for @@ -5235,9 +5281,9 @@ XTset_vertical_scroll_bar (struct window *w, int portion, int whole, int positio { XWindowChanges wc; - wc.x = sb_left + VERTICAL_SCROLL_BAR_WIDTH_TRIM; + wc.x = sb_left; wc.y = top; - wc.width = sb_width - VERTICAL_SCROLL_BAR_WIDTH_TRIM * 2; + wc.width = sb_width; wc.height = height; XConfigureWindow (FRAME_X_DISPLAY (f), bar->x_window, mask, &wc); @@ -5395,12 +5441,11 @@ XTjudge_scroll_bars (struct frame *f) mark bits. */ static void -x_scroll_bar_expose (struct scroll_bar *bar, XEvent *event) +x_scroll_bar_expose (struct scroll_bar *bar, const XEvent *event) { Window w = bar->x_window; struct frame *f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window))); GC gc = f->output_data.x->normal_gc; - int width_trim = VERTICAL_SCROLL_BAR_WIDTH_TRIM; block_input (); @@ -5413,11 +5458,8 @@ x_scroll_bar_expose (struct scroll_bar *bar, XEvent *event) /* Draw a one-pixel border just inside the edges of the scroll bar. */ XDrawRectangle (FRAME_X_DISPLAY (f), w, gc, - /* x, y, width, height */ - 0, 0, - bar->width - 1 - width_trim - width_trim, - bar->height - 1); + 0, 0, bar->width - 1, bar->height - 1); /* Restore the foreground color of the GC if we changed it above. */ if (f->output_data.x->scroll_bar_foreground_pixel != -1) @@ -5437,7 +5479,9 @@ x_scroll_bar_expose (struct scroll_bar *bar, XEvent *event) static void -x_scroll_bar_handle_click (struct scroll_bar *bar, XEvent *event, struct input_event *emacs_event) +x_scroll_bar_handle_click (struct scroll_bar *bar, + const XEvent *event, + struct input_event *emacs_event) { if (! WINDOWP (bar->window)) emacs_abort (); @@ -5445,7 +5489,7 @@ x_scroll_bar_handle_click (struct scroll_bar *bar, XEvent *event, struct input_e emacs_event->kind = SCROLL_BAR_CLICK_EVENT; emacs_event->code = event->xbutton.button - Button1; emacs_event->modifiers - = (x_x_to_emacs_modifiers (FRAME_X_DISPLAY_INFO + = (x_x_to_emacs_modifiers (FRAME_DISPLAY_INFO (XFRAME (WINDOW_FRAME (XWINDOW (bar->window)))), event->xbutton.state) | (event->type == ButtonRelease @@ -5494,14 +5538,15 @@ x_scroll_bar_handle_click (struct scroll_bar *bar, XEvent *event, struct input_e mark bits. */ static void -x_scroll_bar_note_movement (struct scroll_bar *bar, XMotionEvent *event) +x_scroll_bar_note_movement (struct scroll_bar *bar, + const XMotionEvent *event) { struct frame *f = XFRAME (XWINDOW (bar->window)->frame); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); - last_mouse_movement_time = event->time; - + dpyinfo->last_mouse_movement_time = event->time; + dpyinfo->last_mouse_scroll_bar = bar; f->mouse_moved = 1; - XSETVECTOR (last_mouse_scroll_bar, bar); /* If we're dragging the bar, display it. */ if (bar->dragging != -1) @@ -5528,7 +5573,8 @@ x_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_window, enum scroll_bar_part *part, Lisp_Object *x, Lisp_Object *y, Time *timestamp) { - struct scroll_bar *bar = XSCROLL_BAR (last_mouse_scroll_bar); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (*fp); + struct scroll_bar *bar = dpyinfo->last_mouse_scroll_bar; Window w = bar->x_window; struct frame *f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window))); int win_x, win_y; @@ -5540,22 +5586,19 @@ x_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_window, /* Get the mouse's position relative to the scroll bar window, and report that. */ - if (! XQueryPointer (FRAME_X_DISPLAY (f), w, + if (XQueryPointer (FRAME_X_DISPLAY (f), w, - /* Root, child, root x and root y. */ - &dummy_window, &dummy_window, - &dummy_coord, &dummy_coord, + /* Root, child, root x and root y. */ + &dummy_window, &dummy_window, + &dummy_coord, &dummy_coord, - /* Position relative to scroll bar. */ - &win_x, &win_y, + /* Position relative to scroll bar. */ + &win_x, &win_y, - /* Mouse buttons and modifier keys. */ - &dummy_mask)) - ; - else + /* Mouse buttons and modifier keys. */ + &dummy_mask)) { - int top_range - = VERTICAL_SCROLL_BAR_TOP_RANGE (f, bar->height); + int top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, bar->height); win_y -= VERTICAL_SCROLL_BAR_TOP_BORDER; @@ -5583,11 +5626,10 @@ x_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_window, XSETINT (*y, top_range); f->mouse_moved = 0; - last_mouse_scroll_bar = Qnil; + dpyinfo->last_mouse_scroll_bar = NULL; + *timestamp = dpyinfo->last_mouse_movement_time; } - *timestamp = last_mouse_movement_time; - unblock_input (); } @@ -5646,20 +5688,6 @@ static struct x_display_info *XTread_socket_fake_io_error; static struct x_display_info *next_noop_dpyinfo; -#if defined USE_X_TOOLKIT || defined USE_GTK -#define SET_SAVED_BUTTON_EVENT \ - do \ - { \ - if (f->output_data.x->saved_menu_event == 0) \ - f->output_data.x->saved_menu_event = \ - xmalloc (sizeof (XEvent)); \ - *f->output_data.x->saved_menu_event = event; \ - inev.ie.kind = MENU_BAR_ACTIVATE_EVENT; \ - XSETFRAME (inev.ie.frame_or_window, f); \ - } \ - while (0) -#endif - enum { X_EVENT_NORMAL, @@ -5753,11 +5781,13 @@ static void xembed_send_message (struct frame *f, Time, *FINISH is X_EVENT_GOTO_OUT if caller should stop reading events. *FINISH is zero if caller should continue reading events. *FINISH is X_EVENT_DROP if event should not be passed to the toolkit. + *EVENT is unchanged unless we're processing KeyPress event. We return the number of characters stored into the buffer. */ static int -handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, +handle_one_xevent (struct x_display_info *dpyinfo, + const XEvent *event, int *finish, struct input_event *hold_quit) { union { @@ -5767,9 +5797,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, int count = 0; int do_help = 0; ptrdiff_t nbytes = 0; - struct frame *f = NULL; + struct frame *any, *f = NULL; struct coding_system coding; - XEvent event = *eventptr; Mouse_HLInfo *hlinfo = &dpyinfo->mouse_highlight; /* This holds the state XLookupString needs to implement dead keys and other tricks known as "compose processing". _X Window System_ @@ -5785,24 +5814,24 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, inev.ie.kind = NO_EVENT; inev.ie.arg = Qnil; - if (pending_event_wait.eventtype == event.type) - pending_event_wait.eventtype = 0; /* Indicates we got it. */ + any = x_any_window_to_frame (dpyinfo, event->xany.window); + + if (any && any->wait_event_type == event->type) + any->wait_event_type = 0; /* Indicates we got it. */ - switch (event.type) + switch (event->type) { case ClientMessage: { - if (event.xclient.message_type - == dpyinfo->Xatom_wm_protocols - && event.xclient.format == 32) + if (event->xclient.message_type == dpyinfo->Xatom_wm_protocols + && event->xclient.format == 32) { - if (event.xclient.data.l[0] - == dpyinfo->Xatom_wm_take_focus) + if (event->xclient.data.l[0] == dpyinfo->Xatom_wm_take_focus) { - /* Use x_any_window_to_frame because this - could be the shell widget window - if the frame has no title bar. */ - f = x_any_window_to_frame (dpyinfo, event.xclient.window); + /* Use the value returned by x_any_window_to_frame + because this could be the shell widget window + if the frame has no title bar. */ + f = any; #ifdef HAVE_X_I18N /* Not quite sure this is needed -pd */ if (f && FRAME_XIC (f)) @@ -5826,15 +5855,15 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, since that might be an event for a deleted frame. */ if (f) { - Display *d = event.xclient.display; + Display *d = event->xclient.display; /* Catch and ignore errors, in case window has been iconified by a window manager such as GWM. */ x_catch_errors (d); - XSetInputFocus (d, event.xclient.window, + XSetInputFocus (d, event->xclient.window, /* The ICCCM says this is the only valid choice. */ RevertToParent, - event.xclient.data.l[1]); + event->xclient.data.l[1]); /* This is needed to detect the error if there is an error. */ XSync (d, False); @@ -5845,8 +5874,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, goto done; } - if (event.xclient.data.l[0] - == dpyinfo->Xatom_wm_save_yourself) + if (event->xclient.data.l[0] == dpyinfo->Xatom_wm_save_yourself) { /* Save state modify the WM_COMMAND property to something which can reinstate us. This notifies @@ -5861,26 +5889,24 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, #endif { f = x_top_window_to_frame (dpyinfo, - event.xclient.window); + event->xclient.window); /* This is just so we only give real data once for a single Emacs process. */ if (f == SELECTED_FRAME ()) XSetCommand (FRAME_X_DISPLAY (f), - event.xclient.window, + event->xclient.window, initial_argv, initial_argc); else if (f) XSetCommand (FRAME_X_DISPLAY (f), - event.xclient.window, + event->xclient.window, 0, 0); } goto done; } - if (event.xclient.data.l[0] - == dpyinfo->Xatom_wm_delete_window) + if (event->xclient.data.l[0] == dpyinfo->Xatom_wm_delete_window) { - f = x_any_window_to_frame (dpyinfo, - event.xclient.window); + f = any; if (!f) goto OTHER; /* May be a dialog that is to be removed */ @@ -5892,20 +5918,16 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, goto done; } - if (event.xclient.message_type - == dpyinfo->Xatom_wm_configure_denied) - { - goto done; - } + if (event->xclient.message_type == dpyinfo->Xatom_wm_configure_denied) + goto done; - if (event.xclient.message_type - == dpyinfo->Xatom_wm_window_moved) + if (event->xclient.message_type == dpyinfo->Xatom_wm_window_moved) { int new_x, new_y; - f = x_window_to_frame (dpyinfo, event.xclient.window); + f = x_window_to_frame (dpyinfo, event->xclient.window); - new_x = event.xclient.data.s[0]; - new_y = event.xclient.data.s[1]; + new_x = event->xclient.data.s[0]; + new_y = event->xclient.data.s[1]; if (f) { @@ -5916,28 +5938,25 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, } #ifdef HACK_EDITRES - if (event.xclient.message_type - == dpyinfo->Xatom_editres) + if (event->xclient.message_type == dpyinfo->Xatom_editres) { - f = x_any_window_to_frame (dpyinfo, event.xclient.window); + f = any; if (f) - _XEditResCheckMessages (f->output_data.x->widget, NULL, - &event, NULL); + _XEditResCheckMessages (f->output_data.x->widget, + NULL, (XEvent *) event, NULL); goto done; } #endif /* HACK_EDITRES */ - if ((event.xclient.message_type - == dpyinfo->Xatom_DONE) - || (event.xclient.message_type - == dpyinfo->Xatom_PAGE)) + if (event->xclient.message_type == dpyinfo->Xatom_DONE + || event->xclient.message_type == dpyinfo->Xatom_PAGE) { /* Ghostview job completed. Kill it. We could reply with "Next" if we received "Page", but we currently never do because we are interested in images, only, which should have 1 page. */ - Pixmap pixmap = (Pixmap) event.xclient.data.l[1]; - f = x_window_to_frame (dpyinfo, event.xclient.window); + Pixmap pixmap = (Pixmap) event->xclient.data.l[1]; + f = x_window_to_frame (dpyinfo, event->xclient.window); if (!f) goto OTHER; x_kill_gs_process (pixmap, f); @@ -5948,54 +5967,52 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, #ifdef USE_TOOLKIT_SCROLL_BARS /* Scroll bar callbacks send a ClientMessage from which we construct an input_event. */ - if (event.xclient.message_type - == dpyinfo->Xatom_Scrollbar) + if (event->xclient.message_type == dpyinfo->Xatom_Scrollbar) { - x_scroll_bar_to_input_event (&event, &inev.ie); + x_scroll_bar_to_input_event (event, &inev.ie); *finish = X_EVENT_GOTO_OUT; goto done; } #endif /* USE_TOOLKIT_SCROLL_BARS */ /* XEmbed messages from the embedder (if any). */ - if (event.xclient.message_type - == dpyinfo->Xatom_XEMBED) + if (event->xclient.message_type == dpyinfo->Xatom_XEMBED) { - enum xembed_message msg = event.xclient.data.l[1]; + enum xembed_message msg = event->xclient.data.l[1]; if (msg == XEMBED_FOCUS_IN || msg == XEMBED_FOCUS_OUT) - x_detect_focus_change (dpyinfo, &event, &inev.ie); + x_detect_focus_change (dpyinfo, any, event, &inev.ie); *finish = X_EVENT_GOTO_OUT; goto done; } - xft_settings_event (dpyinfo, &event); + xft_settings_event (dpyinfo, event); - f = x_any_window_to_frame (dpyinfo, event.xclient.window); + f = any; if (!f) goto OTHER; - if (x_handle_dnd_message (f, &event.xclient, dpyinfo, &inev.ie)) + if (x_handle_dnd_message (f, &event->xclient, dpyinfo, &inev.ie)) *finish = X_EVENT_DROP; } break; case SelectionNotify: - last_user_time = event.xselection.time; + dpyinfo->last_user_time = event->xselection.time; #ifdef USE_X_TOOLKIT - if (! x_window_to_frame (dpyinfo, event.xselection.requestor)) + if (! x_window_to_frame (dpyinfo, event->xselection.requestor)) goto OTHER; #endif /* not USE_X_TOOLKIT */ - x_handle_selection_notify (&event.xselection); + x_handle_selection_notify (&event->xselection); break; case SelectionClear: /* Someone has grabbed ownership. */ - last_user_time = event.xselectionclear.time; + dpyinfo->last_user_time = event->xselectionclear.time; #ifdef USE_X_TOOLKIT - if (! x_window_to_frame (dpyinfo, event.xselectionclear.window)) + if (! x_window_to_frame (dpyinfo, event->xselectionclear.window)) goto OTHER; #endif /* USE_X_TOOLKIT */ { - XSelectionClearEvent *eventp = &(event.xselectionclear); + const XSelectionClearEvent *eventp = &event->xselectionclear; inev.ie.kind = SELECTION_CLEAR_EVENT; SELECTION_EVENT_DISPLAY (&inev.sie) = eventp->display; @@ -6005,29 +6022,29 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, break; case SelectionRequest: /* Someone wants our selection. */ - last_user_time = event.xselectionrequest.time; + dpyinfo->last_user_time = event->xselectionrequest.time; #ifdef USE_X_TOOLKIT - if (!x_window_to_frame (dpyinfo, event.xselectionrequest.owner)) + if (!x_window_to_frame (dpyinfo, event->xselectionrequest.owner)) goto OTHER; #endif /* USE_X_TOOLKIT */ { - XSelectionRequestEvent *eventp = &(event.xselectionrequest); - - inev.ie.kind = SELECTION_REQUEST_EVENT; - SELECTION_EVENT_DISPLAY (&inev.sie) = eventp->display; - SELECTION_EVENT_REQUESTOR (&inev.sie) = eventp->requestor; - SELECTION_EVENT_SELECTION (&inev.sie) = eventp->selection; - SELECTION_EVENT_TARGET (&inev.sie) = eventp->target; - SELECTION_EVENT_PROPERTY (&inev.sie) = eventp->property; - SELECTION_EVENT_TIME (&inev.sie) = eventp->time; + const XSelectionRequestEvent *eventp = &event->xselectionrequest; + + inev.ie.kind = SELECTION_REQUEST_EVENT; + SELECTION_EVENT_DISPLAY (&inev.sie) = eventp->display; + SELECTION_EVENT_REQUESTOR (&inev.sie) = eventp->requestor; + SELECTION_EVENT_SELECTION (&inev.sie) = eventp->selection; + SELECTION_EVENT_TARGET (&inev.sie) = eventp->target; + SELECTION_EVENT_PROPERTY (&inev.sie) = eventp->property; + SELECTION_EVENT_TIME (&inev.sie) = eventp->time; } break; case PropertyNotify: - last_user_time = event.xproperty.time; - f = x_top_window_to_frame (dpyinfo, event.xproperty.window); - if (f && event.xproperty.atom == dpyinfo->Xatom_net_wm_state) - if (x_handle_net_wm_state (f, &event.xproperty) + dpyinfo->last_user_time = event->xproperty.time; + f = x_top_window_to_frame (dpyinfo, event->xproperty.window); + if (f && event->xproperty.atom == dpyinfo->Xatom_net_wm_state) + if (x_handle_net_wm_state (f, &event->xproperty) && FRAME_ICONIFIED_P (f) && f->output_data.x->net_wm_state_hidden_seen) { @@ -6042,39 +6059,29 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, XSETFRAME (inev.ie.frame_or_window, f); } - x_handle_property_notify (&event.xproperty); - xft_settings_event (dpyinfo, &event); + x_handle_property_notify (&event->xproperty); + xft_settings_event (dpyinfo, event); goto OTHER; case ReparentNotify: - f = x_top_window_to_frame (dpyinfo, event.xreparent.window); + f = x_top_window_to_frame (dpyinfo, event->xreparent.window); if (f) { - int x, y; - f->output_data.x->parent_desc = event.xreparent.parent; - x_real_positions (f, &x, &y); - f->left_pos = x; - f->top_pos = y; + f->output_data.x->parent_desc = event->xreparent.parent; + x_real_positions (f, &f->left_pos, &f->top_pos); /* Perhaps reparented due to a WM restart. Reset this. */ - FRAME_X_DISPLAY_INFO (f)->wm_type = X_WMTYPE_UNKNOWN; - FRAME_X_DISPLAY_INFO (f)->net_supported_window = 0; + FRAME_DISPLAY_INFO (f)->wm_type = X_WMTYPE_UNKNOWN; + FRAME_DISPLAY_INFO (f)->net_supported_window = 0; x_set_frame_alpha (f); } goto OTHER; case Expose: - f = x_window_to_frame (dpyinfo, event.xexpose.window); + f = x_window_to_frame (dpyinfo, event->xexpose.window); if (f) { -#ifdef USE_GTK - /* This seems to be needed for GTK 2.6. */ - x_clear_area (event.xexpose.display, - event.xexpose.window, - event.xexpose.x, event.xexpose.y, - event.xexpose.width, event.xexpose.height); -#endif if (!FRAME_VISIBLE_P (f)) { SET_FRAME_VISIBLE (f, 1); @@ -6083,9 +6090,18 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, SET_FRAME_GARBAGED (f); } else - expose_frame (f, - event.xexpose.x, event.xexpose.y, - event.xexpose.width, event.xexpose.height); + { +#ifdef USE_GTK + /* This seems to be needed for GTK 2.6 and later, see + http://debbugs.gnu.org/cgi/bugreport.cgi?bug=15398. */ + x_clear_area (event->xexpose.display, + event->xexpose.window, + event->xexpose.x, event->xexpose.y, + event->xexpose.width, event->xexpose.height); +#endif + expose_frame (f, event->xexpose.x, event->xexpose.y, + event->xexpose.width, event->xexpose.height); + } } else { @@ -6097,8 +6113,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, themselves, so there's no way to dispatch events to them. Recognize this case separately. */ { - Widget widget - = x_window_to_menu_bar (event.xexpose.window); + Widget widget = x_window_to_menu_bar (event->xexpose.window); if (widget) xlwmenu_redisplay (widget); } @@ -6108,11 +6123,11 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, /* Dispatch event to the widget. */ goto OTHER; #else /* not USE_TOOLKIT_SCROLL_BARS */ - bar = x_window_to_scroll_bar (event.xexpose.display, - event.xexpose.window); + bar = x_window_to_scroll_bar (event->xexpose.display, + event->xexpose.window); if (bar) - x_scroll_bar_expose (bar, &event); + x_scroll_bar_expose (bar, event); #ifdef USE_X_TOOLKIT else goto OTHER; @@ -6124,14 +6139,12 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, case GraphicsExpose: /* This occurs when an XCopyArea's source area was obscured or not available. */ - f = x_window_to_frame (dpyinfo, event.xgraphicsexpose.drawable); + f = x_window_to_frame (dpyinfo, event->xgraphicsexpose.drawable); if (f) - { - expose_frame (f, - event.xgraphicsexpose.x, event.xgraphicsexpose.y, - event.xgraphicsexpose.width, - event.xgraphicsexpose.height); - } + expose_frame (f, event->xgraphicsexpose.x, + event->xgraphicsexpose.y, + event->xgraphicsexpose.width, + event->xgraphicsexpose.height); #ifdef USE_X_TOOLKIT else goto OTHER; @@ -6145,13 +6158,13 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, case UnmapNotify: /* Redo the mouse-highlight after the tooltip has gone. */ - if (event.xunmap.window == tip_window) + if (event->xunmap.window == tip_window) { tip_window = 0; - redo_mouse_highlight (); + x_redo_mouse_highlight (dpyinfo); } - f = x_top_window_to_frame (dpyinfo, event.xunmap.window); + f = x_top_window_to_frame (dpyinfo, event->xunmap.window); if (f) /* F may no longer exist if the frame was deleted. */ { @@ -6176,7 +6189,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, goto OTHER; case MapNotify: - if (event.xmap.window == tip_window) + if (event->xmap.window == tip_window) /* The tooltip has been drawn already. Avoid the SET_FRAME_GARBAGED below. */ goto OTHER; @@ -6184,7 +6197,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, /* We use x_top_window_to_frame because map events can come for sub-windows and they don't mean that the frame is visible. */ - f = x_top_window_to_frame (dpyinfo, event.xmap.window); + f = x_top_window_to_frame (dpyinfo, event->xmap.window); if (f) { bool iconified = FRAME_ICONIFIED_P (f); @@ -6224,7 +6237,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, case KeyPress: - last_user_time = event.xkey.time; + dpyinfo->last_user_time = event->xkey.time; ignore_next_mouse_click_timeout = 0; #if defined (USE_X_TOOLKIT) || defined (USE_GTK) @@ -6233,8 +6246,9 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, goto OTHER; #endif - f = x_any_window_to_frame (dpyinfo, event.xkey.window); + f = any; +#if ! defined (USE_GTK) /* If mouse-highlight is an integer, input clears out mouse highlighting. */ if (!hlinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight) @@ -6244,6 +6258,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, clear_mouse_face (hlinfo); hlinfo->mouse_face_hidden = 1; } +#endif #if defined USE_MOTIF && defined USE_TOOLKIT_SCROLL_BARS if (f == 0) @@ -6251,7 +6266,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, /* Scroll bars consume key events, but we want the keys to go to the scroll bar's frame. */ Widget widget = XtWindowToWidget (dpyinfo->display, - event.xkey.window); + event->xkey.window); if (widget && XmIsScrollBar (widget)) { widget = XtParent (widget); @@ -6280,6 +6295,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, int modifiers; Lisp_Object coding_system = Qlatin_1; Lisp_Object c; + /* Event will be modified. */ + XKeyEvent xkey = event->xkey; #ifdef USE_GTK /* Don't pass keys to GTK. A Tab will shift focus to the @@ -6289,20 +6306,19 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, *finish = X_EVENT_DROP; #endif - event.xkey.state - |= x_emacs_to_x_modifiers (FRAME_X_DISPLAY_INFO (f), - extra_keyboard_modifiers); - modifiers = event.xkey.state; + xkey.state |= x_emacs_to_x_modifiers (FRAME_DISPLAY_INFO (f), + extra_keyboard_modifiers); + modifiers = xkey.state; /* This will have to go some day... */ /* make_lispy_event turns chars into control chars. Don't do it here because XLookupString is too eager. */ - event.xkey.state &= ~ControlMask; - event.xkey.state &= ~(dpyinfo->meta_mod_mask - | dpyinfo->super_mod_mask - | dpyinfo->hyper_mod_mask - | dpyinfo->alt_mod_mask); + xkey.state &= ~ControlMask; + xkey.state &= ~(dpyinfo->meta_mod_mask + | dpyinfo->super_mod_mask + | dpyinfo->hyper_mod_mask + | dpyinfo->alt_mod_mask); /* In case Meta is ComposeCharacter, clear its status. According to Markus Ehrnsperger @@ -6319,7 +6335,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, coding_system = Vlocale_coding_system; nbytes = XmbLookupString (FRAME_XIC (f), - &event.xkey, (char *) copy_bufptr, + &xkey, (char *) copy_bufptr, copy_bufsiz, &keysym, &status_return); if (status_return == XBufferOverflow) @@ -6327,7 +6343,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, copy_bufsiz = nbytes + 1; copy_bufptr = alloca (copy_bufsiz); nbytes = XmbLookupString (FRAME_XIC (f), - &event.xkey, (char *) copy_bufptr, + &xkey, (char *) copy_bufptr, copy_bufsiz, &keysym, &status_return); } @@ -6344,11 +6360,11 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, emacs_abort (); } else - nbytes = XLookupString (&event.xkey, (char *) copy_bufptr, + nbytes = XLookupString (&xkey, (char *) copy_bufptr, copy_bufsiz, &keysym, &compose_status); #else - nbytes = XLookupString (&event.xkey, (char *) copy_bufptr, + nbytes = XLookupString (&xkey, (char *) copy_bufptr, copy_bufsiz, &keysym, &compose_status); #endif @@ -6364,8 +6380,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, /* Common for all keysym input events. */ XSETFRAME (inev.ie.frame_or_window, f); inev.ie.modifiers - = x_x_to_emacs_modifiers (FRAME_X_DISPLAY_INFO (f), modifiers); - inev.ie.timestamp = event.xkey.time; + = x_x_to_emacs_modifiers (FRAME_DISPLAY_INFO (f), modifiers); + inev.ie.timestamp = xkey.time; /* First deal with keysyms which have defined translations to characters. */ @@ -6541,6 +6557,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, if (keysym == NoSymbol) break; } + /* FIXME: check side effects and remove this. */ + ((XEvent *) event)->xkey = xkey; } done_keysym: #ifdef HAVE_X_I18N @@ -6553,7 +6571,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, #endif case KeyRelease: - last_user_time = event.xkey.time; + dpyinfo->last_user_time = event->xkey.time; #ifdef HAVE_X_I18N /* Don't dispatch this event since XtDispatchEvent calls XFilterEvent, and two calls in a row may freeze the @@ -6564,35 +6582,35 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, #endif case EnterNotify: - last_user_time = event.xcrossing.time; - x_detect_focus_change (dpyinfo, &event, &inev.ie); + dpyinfo->last_user_time = event->xcrossing.time; + x_detect_focus_change (dpyinfo, any, event, &inev.ie); - f = x_any_window_to_frame (dpyinfo, event.xcrossing.window); + f = any; if (f && x_mouse_click_focus_ignore_position) - ignore_next_mouse_click_timeout = event.xmotion.time + 200; + ignore_next_mouse_click_timeout = event->xmotion.time + 200; /* EnterNotify counts as mouse movement, so update things that depend on mouse position. */ if (f && !f->output_data.x->hourglass_p) - note_mouse_movement (f, &event.xmotion); + note_mouse_movement (f, &event->xmotion); #ifdef USE_GTK /* We may get an EnterNotify on the buttons in the toolbar. In that case we moved out of any highlighted area and need to note this. */ - if (!f && last_mouse_glyph_frame) - note_mouse_movement (last_mouse_glyph_frame, &event.xmotion); + if (!f && dpyinfo->last_mouse_glyph_frame) + note_mouse_movement (dpyinfo->last_mouse_glyph_frame, &event->xmotion); #endif goto OTHER; case FocusIn: - x_detect_focus_change (dpyinfo, &event, &inev.ie); + x_detect_focus_change (dpyinfo, any, event, &inev.ie); goto OTHER; case LeaveNotify: - last_user_time = event.xcrossing.time; - x_detect_focus_change (dpyinfo, &event, &inev.ie); + dpyinfo->last_user_time = event->xcrossing.time; + x_detect_focus_change (dpyinfo, any, event, &inev.ie); - f = x_top_window_to_frame (dpyinfo, event.xcrossing.window); + f = x_top_window_to_frame (dpyinfo, event->xcrossing.window); if (f) { if (f == hlinfo->mouse_face_mouse_frame) @@ -6612,26 +6630,23 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, } #ifdef USE_GTK /* See comment in EnterNotify above */ - else if (last_mouse_glyph_frame) - note_mouse_movement (last_mouse_glyph_frame, &event.xmotion); + else if (dpyinfo->last_mouse_glyph_frame) + note_mouse_movement (dpyinfo->last_mouse_glyph_frame, &event->xmotion); #endif goto OTHER; case FocusOut: - x_detect_focus_change (dpyinfo, &event, &inev.ie); + x_detect_focus_change (dpyinfo, any, event, &inev.ie); goto OTHER; case MotionNotify: { - last_user_time = event.xmotion.time; + dpyinfo->last_user_time = event->xmotion.time; previous_help_echo_string = help_echo_string; help_echo_string = Qnil; - if (dpyinfo->grabbed && last_mouse_frame - && FRAME_LIVE_P (last_mouse_frame)) - f = last_mouse_frame; - else - f = x_window_to_frame (dpyinfo, event.xmotion.window); + f = (x_mouse_grabbed (dpyinfo) ? dpyinfo->last_mouse_frame + : x_window_to_frame (dpyinfo, event->xmotion.window)); if (hlinfo->mouse_face_hidden) { @@ -6640,7 +6655,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, } #ifdef USE_GTK - if (f && xg_event_is_for_scrollbar (f, &event)) + if (f && xg_event_is_for_scrollbar (f, event)) f = 0; #endif if (f) @@ -6652,7 +6667,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, { static Lisp_Object last_mouse_window; Lisp_Object window = window_from_coordinates - (f, event.xmotion.x, event.xmotion.y, 0, 0); + (f, event->xmotion.x, event->xmotion.y, 0, 0); /* Window will be selected only when it is not selected now and last mouse movement event was not in it. Minibuffer window @@ -6673,18 +6688,18 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, /* Remember the last window where we saw the mouse. */ last_mouse_window = window; } - if (!note_mouse_movement (f, &event.xmotion)) + if (!note_mouse_movement (f, &event->xmotion)) help_echo_string = previous_help_echo_string; } else { #ifndef USE_TOOLKIT_SCROLL_BARS struct scroll_bar *bar - = x_window_to_scroll_bar (event.xmotion.display, - event.xmotion.window); + = x_window_to_scroll_bar (event->xmotion.display, + event->xmotion.window); if (bar) - x_scroll_bar_note_movement (bar, &event.xmotion); + x_scroll_bar_note_movement (bar, &event->xmotion); #endif /* USE_TOOLKIT_SCROLL_BARS */ /* If we move outside the frame, then we're @@ -6701,14 +6716,14 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, } case ConfigureNotify: - f = x_top_window_to_frame (dpyinfo, event.xconfigure.window); + f = x_top_window_to_frame (dpyinfo, event->xconfigure.window); #ifdef USE_GTK if (!f - && (f = x_any_window_to_frame (dpyinfo, event.xconfigure.window)) - && event.xconfigure.window == FRAME_X_WINDOW (f)) + && (f = any) + && event->xconfigure.window == FRAME_X_WINDOW (f)) { - xg_frame_resized (f, event.xconfigure.width, - event.xconfigure.height); + xg_frame_resized (f, event->xconfigure.width, + event->xconfigure.height); f = 0; } #endif @@ -6716,8 +6731,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, { #ifndef USE_X_TOOLKIT #ifndef USE_GTK - int rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, event.xconfigure.height); - int columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, event.xconfigure.width); + int rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, event->xconfigure.height); + int columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, event->xconfigure.width); /* In the toolkit version, change_frame_size is called by the code that handles resizing @@ -6728,16 +6743,16 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, to check the pixel dimensions as well. */ if (columns != FRAME_COLS (f) || rows != FRAME_LINES (f) - || event.xconfigure.width != FRAME_PIXEL_WIDTH (f) - || event.xconfigure.height != FRAME_PIXEL_HEIGHT (f)) + || event->xconfigure.width != FRAME_PIXEL_WIDTH (f) + || event->xconfigure.height != FRAME_PIXEL_HEIGHT (f)) { change_frame_size (f, rows, columns, 0, 1, 0); SET_FRAME_GARBAGED (f); cancel_mouse_face (f); } - FRAME_PIXEL_WIDTH (f) = event.xconfigure.width; - FRAME_PIXEL_HEIGHT (f) = event.xconfigure.height; + FRAME_PIXEL_WIDTH (f) = event->xconfigure.width; + FRAME_PIXEL_HEIGHT (f) = event->xconfigure.height; #endif /* not USE_GTK */ #endif @@ -6747,9 +6762,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, if (FRAME_GTK_OUTER_WIDGET (f) && gtk_widget_get_mapped (FRAME_GTK_OUTER_WIDGET (f))) #endif - { - x_real_positions (f, &f->left_pos, &f->top_pos); - } + x_real_positions (f, &f->left_pos, &f->top_pos); #ifdef HAVE_X_I18N if (FRAME_XIC (f) && (FRAME_XIC_STYLE (f) & XIMStatusArea)) @@ -6766,42 +6779,37 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, by the rest of Emacs, we put it here. */ bool tool_bar_p = 0; - memset (&compose_status, 0, sizeof (compose_status)); - last_mouse_glyph_frame = 0; - last_user_time = event.xbutton.time; + memset (&compose_status, 0, sizeof (compose_status)); + dpyinfo->last_mouse_glyph_frame = NULL; + dpyinfo->last_user_time = event->xbutton.time; - if (dpyinfo->grabbed - && last_mouse_frame - && FRAME_LIVE_P (last_mouse_frame)) - f = last_mouse_frame; - else - f = x_window_to_frame (dpyinfo, event.xbutton.window); + f = (x_mouse_grabbed (dpyinfo) ? dpyinfo->last_mouse_frame + : x_window_to_frame (dpyinfo, event->xbutton.window)); #ifdef USE_GTK - if (f && xg_event_is_for_scrollbar (f, &event)) + if (f && xg_event_is_for_scrollbar (f, event)) f = 0; #endif if (f) { +#if ! defined (USE_GTK) /* Is this in the tool-bar? */ if (WINDOWP (f->tool_bar_window) && WINDOW_TOTAL_LINES (XWINDOW (f->tool_bar_window))) { Lisp_Object window; - int x = event.xbutton.x; - int y = event.xbutton.y; + int x = event->xbutton.x; + int y = event->xbutton.y; window = window_from_coordinates (f, x, y, 0, 1); tool_bar_p = EQ (window, f->tool_bar_window); - if (tool_bar_p && event.xbutton.button < 4) - { - handle_tool_bar_click (f, x, y, - event.xbutton.type == ButtonPress, - x_x_to_emacs_modifiers (dpyinfo, - event.xbutton.state)); - } + if (tool_bar_p && event->xbutton.button < 4) + handle_tool_bar_click + (f, x, y, event->xbutton.type == ButtonPress, + x_x_to_emacs_modifiers (dpyinfo, event->xbutton.state)); } +#endif /* !USE_GTK */ if (!tool_bar_p) #if defined (USE_X_TOOLKIT) || defined (USE_GTK) @@ -6810,52 +6818,52 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, { if (ignore_next_mouse_click_timeout) { - if (event.type == ButtonPress - && (int)(event.xbutton.time - ignore_next_mouse_click_timeout) > 0) + if (event->type == ButtonPress + && event->xbutton.time > ignore_next_mouse_click_timeout) { ignore_next_mouse_click_timeout = 0; - construct_mouse_click (&inev.ie, &event.xbutton, f); + construct_mouse_click (&inev.ie, &event->xbutton, f); } - if (event.type == ButtonRelease) + if (event->type == ButtonRelease) ignore_next_mouse_click_timeout = 0; } else - construct_mouse_click (&inev.ie, &event.xbutton, f); + construct_mouse_click (&inev.ie, &event->xbutton, f); } if (FRAME_X_EMBEDDED_P (f)) - xembed_send_message (f, event.xbutton.time, + xembed_send_message (f, event->xbutton.time, XEMBED_REQUEST_FOCUS, 0, 0, 0); } else { struct scroll_bar *bar - = x_window_to_scroll_bar (event.xbutton.display, - event.xbutton.window); + = x_window_to_scroll_bar (event->xbutton.display, + event->xbutton.window); #ifdef USE_TOOLKIT_SCROLL_BARS /* Make the "Ctrl-Mouse-2 splits window" work for toolkit scroll bars. */ - if (bar && event.xbutton.state & ControlMask) + if (bar && event->xbutton.state & ControlMask) { - x_scroll_bar_handle_click (bar, &event, &inev.ie); + x_scroll_bar_handle_click (bar, event, &inev.ie); *finish = X_EVENT_DROP; } #else /* not USE_TOOLKIT_SCROLL_BARS */ if (bar) - x_scroll_bar_handle_click (bar, &event, &inev.ie); + x_scroll_bar_handle_click (bar, event, &inev.ie); #endif /* not USE_TOOLKIT_SCROLL_BARS */ } - if (event.type == ButtonPress) + if (event->type == ButtonPress) { - dpyinfo->grabbed |= (1 << event.xbutton.button); - last_mouse_frame = f; + dpyinfo->grabbed |= (1 << event->xbutton.button); + dpyinfo->last_mouse_frame = f; if (!tool_bar_p) last_tool_bar_item = -1; } else - dpyinfo->grabbed &= ~(1 << event.xbutton.button); + dpyinfo->grabbed &= ~(1 << event->xbutton.button); /* Ignore any mouse motion that happened before this event; any subsequent mouse-movement Emacs events should reflect @@ -6864,7 +6872,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, f->mouse_moved = 0; #if defined (USE_X_TOOLKIT) || defined (USE_GTK) - f = x_menubar_window_to_frame (dpyinfo, &event); + f = x_menubar_window_to_frame (dpyinfo, event); /* For a down-event in the menu bar, don't pass it to Xt right now. Instead, save it away @@ -6873,19 +6881,23 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, if (! popup_activated () #ifdef USE_GTK /* Gtk+ menus only react to the first three buttons. */ - && event.xbutton.button < 3 + && event->xbutton.button < 3 #endif - && f && event.type == ButtonPress + && f && event->type == ButtonPress /* Verify the event is really within the menu bar and not just sent to it due to grabbing. */ - && event.xbutton.x >= 0 - && event.xbutton.x < FRAME_PIXEL_WIDTH (f) - && event.xbutton.y >= 0 - && event.xbutton.y < f->output_data.x->menubar_height - && event.xbutton.same_screen) + && event->xbutton.x >= 0 + && event->xbutton.x < FRAME_PIXEL_WIDTH (f) + && event->xbutton.y >= 0 + && event->xbutton.y < f->output_data.x->menubar_height + && event->xbutton.same_screen) { - SET_SAVED_BUTTON_EVENT; - *finish = X_EVENT_DROP; + if (!f->output_data.x->saved_menu_event) + f->output_data.x->saved_menu_event = xmalloc (sizeof *event); + *f->output_data.x->saved_menu_event = *event; + inev.ie.kind = MENU_BAR_ACTIVATE_EVENT; + XSETFRAME (inev.ie.frame_or_window, f); + *finish = X_EVENT_DROP; } else goto OTHER; @@ -6905,18 +6917,18 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, case MappingNotify: /* Someone has changed the keyboard mapping - update the local cache. */ - switch (event.xmapping.request) + switch (event->xmapping.request) { case MappingModifier: x_find_modifier_meanings (dpyinfo); /* This is meant to fall through. */ case MappingKeyboard: - XRefreshKeyboardMapping (&event.xmapping); + XRefreshKeyboardMapping ((XMappingEvent *) &event->xmapping); } goto OTHER; case DestroyNotify: - xft_settings_event (dpyinfo, &event); + xft_settings_event (dpyinfo, event); break; default: @@ -6924,7 +6936,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, #ifdef USE_X_TOOLKIT block_input (); if (*finish != X_EVENT_DROP) - XtDispatchEvent (&event); + XtDispatchEvent ((XEvent *) event); unblock_input (); #endif /* USE_X_TOOLKIT */ break; @@ -6962,7 +6974,6 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, } SAFE_FREE (); - *eventptr = event; return count; } @@ -7002,6 +7013,7 @@ XTread_socket (struct terminal *terminal, struct input_event *hold_quit) { int count = 0; int event_found = 0; + struct x_display_info *dpyinfo = terminal->display_info.x; block_input (); @@ -7009,36 +7021,33 @@ XTread_socket (struct terminal *terminal, struct input_event *hold_quit) input_signal_count++; /* For debugging, this gives a way to fake an I/O error. */ - if (terminal->display_info.x == XTread_socket_fake_io_error) + if (dpyinfo == XTread_socket_fake_io_error) { XTread_socket_fake_io_error = 0; - x_io_error_quitter (terminal->display_info.x->display); + x_io_error_quitter (dpyinfo->display); } #ifndef USE_GTK - while (XPending (terminal->display_info.x->display)) + while (XPending (dpyinfo->display)) { int finish; XEvent event; - XNextEvent (terminal->display_info.x->display, &event); + XNextEvent (dpyinfo->display, &event); #ifdef HAVE_X_I18N /* Filter events for the current X input method. */ - if (x_filter_event (terminal->display_info.x, &event)) + if (x_filter_event (dpyinfo, &event)) continue; #endif event_found = 1; - count += handle_one_xevent (terminal->display_info.x, - &event, &finish, hold_quit); + count += handle_one_xevent (dpyinfo, &event, &finish, hold_quit); if (finish == X_EVENT_GOTO_OUT) - goto out; + break; } - out:; - #else /* USE_GTK */ /* For GTK we must use the GTK event loop. But XEvents gets passed @@ -7088,12 +7097,11 @@ XTread_socket (struct terminal *terminal, struct input_event *hold_quit) } /* If the focus was just given to an auto-raising frame, - raise it now. */ - /* ??? This ought to be able to handle more than one such frame. */ - if (pending_autoraise_frame) + raise it now. FIXME: handle more than one such frame. */ + if (dpyinfo->x_pending_autoraise_frame) { - x_raise_frame (pending_autoraise_frame); - pending_autoraise_frame = 0; + x_raise_frame (dpyinfo->x_pending_autoraise_frame); + dpyinfo->x_pending_autoraise_frame = NULL; } unblock_input (); @@ -7141,7 +7149,7 @@ static void x_draw_hollow_cursor (struct window *w, struct glyph_row *row) { struct frame *f = XFRAME (WINDOW_FRAME (w)); - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); Display *dpy = FRAME_X_DISPLAY (f); int x, y, wd, h; XGCValues xgcv; @@ -7208,7 +7216,7 @@ x_draw_bar_cursor (struct window *w, struct glyph_row *row, int width, enum text { Display *dpy = FRAME_X_DISPLAY (f); Window window = FRAME_X_WINDOW (f); - GC gc = FRAME_X_DISPLAY_INFO (f)->scratch_cursor_gc; + GC gc = FRAME_DISPLAY_INFO (f)->scratch_cursor_gc; unsigned long mask = GCForeground | GCBackground | GCGraphicsExposures; struct face *face = FACE_FROM_ID (f, cursor_glyph->face_id); XGCValues xgcv; @@ -7229,7 +7237,7 @@ x_draw_bar_cursor (struct window *w, struct glyph_row *row, int width, enum text else { gc = XCreateGC (dpy, window, mask, &xgcv); - FRAME_X_DISPLAY_INFO (f)->scratch_cursor_gc = gc; + FRAME_DISPLAY_INFO (f)->scratch_cursor_gc = gc; } x_clip_to_row (w, row, TEXT_AREA, gc); @@ -7361,9 +7369,7 @@ x_draw_window_cursor (struct window *w, struct glyph_row *glyph_row, int x, #endif } -#ifndef XFlush XFlush (FRAME_X_DISPLAY (f)); -#endif } @@ -7398,7 +7404,7 @@ x_bitmap_icon (struct frame *f, Lisp_Object file) else { /* Create the GNU bitmap and mask if necessary. */ - if (FRAME_X_DISPLAY_INFO (f)->icon_bitmap_id < 0) + if (FRAME_DISPLAY_INFO (f)->icon_bitmap_id < 0) { ptrdiff_t rc = -1; @@ -7412,7 +7418,7 @@ x_bitmap_icon (struct frame *f, Lisp_Object file) rc = x_create_bitmap_from_xpm_data (f, gnu_xpm_bits); if (rc != -1) - FRAME_X_DISPLAY_INFO (f)->icon_bitmap_id = rc; + FRAME_DISPLAY_INFO (f)->icon_bitmap_id = rc; #endif @@ -7424,8 +7430,8 @@ x_bitmap_icon (struct frame *f, Lisp_Object file) if (rc == -1) return 1; - FRAME_X_DISPLAY_INFO (f)->icon_bitmap_id = rc; - x_create_bitmap_mask (f, FRAME_X_DISPLAY_INFO (f)->icon_bitmap_id); + FRAME_DISPLAY_INFO (f)->icon_bitmap_id = rc; + x_create_bitmap_mask (f, FRAME_DISPLAY_INFO (f)->icon_bitmap_id); } } @@ -7433,9 +7439,9 @@ x_bitmap_icon (struct frame *f, Lisp_Object file) this increments the ref-count one extra time. As a result, the GNU bitmap and mask are never freed. That way, we don't have to worry about allocating it again. */ - x_reference_bitmap (f, FRAME_X_DISPLAY_INFO (f)->icon_bitmap_id); + x_reference_bitmap (f, FRAME_DISPLAY_INFO (f)->icon_bitmap_id); - bitmap_id = FRAME_X_DISPLAY_INFO (f)->icon_bitmap_id; + bitmap_id = FRAME_DISPLAY_INFO (f)->icon_bitmap_id; } x_wm_set_icon_pixmap (f, bitmap_id); @@ -7649,7 +7655,7 @@ x_connection_closed (Display *dpy, const char *error_message) if (FRAME_X_P (XFRAME (frame)) && FRAME_X_P (XFRAME (minibuf_frame)) && ! EQ (frame, minibuf_frame) - && FRAME_X_DISPLAY_INFO (XFRAME (minibuf_frame)) == dpyinfo) + && FRAME_DISPLAY_INFO (XFRAME (minibuf_frame)) == dpyinfo) delete_frame (frame, Qnoelisp); } @@ -7658,7 +7664,7 @@ x_connection_closed (Display *dpy, const char *error_message) for another frame that we need to delete. */ FOR_EACH_FRAME (tail, frame) if (FRAME_X_P (XFRAME (frame)) - && FRAME_X_DISPLAY_INFO (XFRAME (frame)) == dpyinfo) + && FRAME_DISPLAY_INFO (XFRAME (frame)) == dpyinfo) { /* Set this to t so that delete_frame won't get confused trying to find a replacement. */ @@ -7881,7 +7887,7 @@ xim_destroy_callback (XIM xim, XPointer client_data, XPointer call_data) FOR_EACH_FRAME (tail, frame) { struct frame *f = XFRAME (frame); - if (FRAME_X_P (f) && FRAME_X_DISPLAY_INFO (f) == dpyinfo) + if (FRAME_X_P (f) && FRAME_DISPLAY_INFO (f) == dpyinfo) { FRAME_XIC (f) = NULL; xic_free_xfontset (f); @@ -7972,7 +7978,7 @@ xim_instantiate_callback (Display *display, XPointer client_data, XPointer call_ struct frame *f = XFRAME (frame); if (FRAME_X_P (f) - && FRAME_X_DISPLAY_INFO (f) == xim_inst->dpyinfo) + && FRAME_DISPLAY_INFO (f) == xim_inst->dpyinfo) if (FRAME_XIC (f) == NULL) { create_frame_xic (f); @@ -8070,7 +8076,7 @@ x_calc_absolute_position (struct frame *f) /* Treat negative positions as relative to the leftmost bottommost position that fits on the screen. */ if (flags & XNegative) - f->left_pos = x_display_pixel_width (FRAME_X_DISPLAY_INFO (f)) + f->left_pos = x_display_pixel_width (FRAME_DISPLAY_INFO (f)) - FRAME_PIXEL_WIDTH (f) + f->left_pos; { @@ -8093,7 +8099,7 @@ x_calc_absolute_position (struct frame *f) #endif if (flags & YNegative) - f->top_pos = x_display_pixel_height (FRAME_X_DISPLAY_INFO (f)) + f->top_pos = x_display_pixel_height (FRAME_DISPLAY_INFO (f)) - height + f->top_pos; } @@ -8133,7 +8139,7 @@ x_set_offset (struct frame *f, register int xoff, register int yoff, int change_ modified_left = f->left_pos; modified_top = f->top_pos; - if (change_gravity != 0 && FRAME_X_DISPLAY_INFO (f)->wm_type == X_WMTYPE_A) + if (change_gravity != 0 && FRAME_DISPLAY_INFO (f)->wm_type == X_WMTYPE_A) { /* Some WMs (twm, wmaker at least) has an offset that is smaller than the WM decorations. So we use the calculated offset instead @@ -8146,7 +8152,7 @@ x_set_offset (struct frame *f, register int xoff, register int yoff, int change_ modified_left, modified_top); x_sync_with_move (f, f->left_pos, f->top_pos, - FRAME_X_DISPLAY_INFO (f)->wm_type == X_WMTYPE_UNKNOWN + FRAME_DISPLAY_INFO (f)->wm_type == X_WMTYPE_UNKNOWN ? 1 : 0); /* change_gravity is non-zero when this function is called from Lisp to @@ -8160,8 +8166,8 @@ x_set_offset (struct frame *f, register int xoff, register int yoff, int change_ need to compute the top/left offset adjustment for this frame. */ if (change_gravity != 0 && - (FRAME_X_DISPLAY_INFO (f)->wm_type == X_WMTYPE_UNKNOWN - || (FRAME_X_DISPLAY_INFO (f)->wm_type == X_WMTYPE_A + (FRAME_DISPLAY_INFO (f)->wm_type == X_WMTYPE_UNKNOWN + || (FRAME_DISPLAY_INFO (f)->wm_type == X_WMTYPE_A && (FRAME_X_OUTPUT (f)->move_offset_left == 0 && FRAME_X_OUTPUT (f)->move_offset_top == 0)))) x_check_expected_move (f, modified_left, modified_top); @@ -8182,7 +8188,7 @@ wm_supports (struct frame *f, Atom want_atom) unsigned long actual_size, bytes_remaining; int i, rc, actual_format; Window wmcheck_window; - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); Window target_window = dpyinfo->root_window; long max_len = 65536; Display *dpy = FRAME_X_DISPLAY (f); @@ -8263,7 +8269,7 @@ wm_supports (struct frame *f, Atom want_atom) static void set_wm_state (Lisp_Object frame, int add, Atom atom, Atom value) { - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (XFRAME (frame)); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (XFRAME (frame)); x_send_client_event (frame, make_number (0), frame, dpyinfo->Xatom_net_wm_state, @@ -8282,7 +8288,7 @@ void x_set_sticky (struct frame *f, Lisp_Object new_value, Lisp_Object old_value) { Lisp_Object frame; - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); XSETFRAME (frame, f); @@ -8305,7 +8311,7 @@ get_current_wm_state (struct frame *f, Atom actual_type; unsigned long actual_size, bytes_remaining; int i, rc, actual_format, is_hidden = 0; - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); long max_len = 65536; Display *dpy = FRAME_X_DISPLAY (f); unsigned char *tmp_data = NULL; @@ -8369,7 +8375,7 @@ get_current_wm_state (struct frame *f, static int do_ewmh_fullscreen (struct frame *f) { - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); int have_net_atom = wm_supports (f, dpyinfo->Xatom_net_wm_state); int cur, dummy; @@ -8449,7 +8455,7 @@ XTfullscreen_hook (struct frame *f) static int -x_handle_net_wm_state (struct frame *f, XPropertyEvent *event) +x_handle_net_wm_state (struct frame *f, const XPropertyEvent *event) { int value = FULLSCREEN_NONE; Lisp_Object lval; @@ -8487,7 +8493,7 @@ x_check_fullscreen (struct frame *f) if (do_ewmh_fullscreen (f)) return; - if (f->output_data.x->parent_desc != FRAME_X_DISPLAY_INFO (f)->root_window) + if (f->output_data.x->parent_desc != FRAME_DISPLAY_INFO (f)->root_window) return; /* Only fullscreen without WM or with EWM hints (above). */ /* Setting fullscreen to nil doesn't do anything. We could save the @@ -8497,7 +8503,7 @@ x_check_fullscreen (struct frame *f) if (f->want_fullscreen != FULLSCREEN_NONE) { int width = FRAME_PIXEL_WIDTH (f), height = FRAME_PIXEL_HEIGHT (f); - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); switch (f->want_fullscreen) { @@ -8544,7 +8550,7 @@ x_check_expected_move (struct frame *f, int expected_left, int expected_top) int adjusted_left; int adjusted_top; - FRAME_X_DISPLAY_INFO (f)->wm_type = X_WMTYPE_A; + FRAME_DISPLAY_INFO (f)->wm_type = X_WMTYPE_A; FRAME_X_OUTPUT (f)->move_offset_left = expected_left - current_left; FRAME_X_OUTPUT (f)->move_offset_top = expected_top - current_top; @@ -8562,7 +8568,7 @@ x_check_expected_move (struct frame *f, int expected_left, int expected_top) /* It's a "Type B" window manager. We don't have to adjust the frame's position. */ - FRAME_X_DISPLAY_INFO (f)->wm_type = X_WMTYPE_B; + FRAME_DISPLAY_INFO (f)->wm_type = X_WMTYPE_B; } @@ -8618,15 +8624,14 @@ x_wait_for_event (struct frame *f, int eventtype) struct timespec tmo, tmo_at, time_now; int fd = ConnectionNumber (FRAME_X_DISPLAY (f)); - pending_event_wait.f = f; - pending_event_wait.eventtype = eventtype; + f->wait_event_type = eventtype; /* Set timeout to 0.1 second. Hopefully not noticeable. Maybe it should be configurable. */ tmo = make_timespec (0, 100 * 1000 * 1000); tmo_at = timespec_add (current_timespec (), tmo); - while (pending_event_wait.eventtype) + while (f->wait_event_type) { pending_signals = 1; totally_unblock_input (); @@ -8645,8 +8650,8 @@ x_wait_for_event (struct frame *f, int eventtype) if (pselect (fd + 1, &fds, NULL, NULL, &tmo, NULL) == 0) break; /* Timeout */ } - pending_event_wait.f = 0; - pending_event_wait.eventtype = 0; + + f->wait_event_type = 0; } @@ -8854,15 +8859,16 @@ x_ewmh_activate_frame (struct frame *f) /* See Window Manager Specification/Extended Window Manager Hints at http://freedesktop.org/wiki/Specifications/wm-spec */ - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); if (FRAME_VISIBLE_P (f) && wm_supports (f, dpyinfo->Xatom_net_active_window)) { Lisp_Object frame; XSETFRAME (frame, f); x_send_client_event (frame, make_number (0), frame, - dpyinfo->Xatom_net_active_window, - make_number (32), list2i (1, last_user_time)); + dpyinfo->Xatom_net_active_window, + make_number (32), + list2i (1, dpyinfo->last_user_time)); } } @@ -8887,7 +8893,7 @@ static void xembed_set_info (struct frame *f, enum xembed_info flags) { unsigned long data[2]; - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); data[0] = XEMBED_VERSION; data[1] = flags; @@ -8906,7 +8912,7 @@ xembed_send_message (struct frame *f, Time t, enum xembed_message msg, event.xclient.type = ClientMessage; event.xclient.window = FRAME_X_OUTPUT (f)->parent_desc; - event.xclient.message_type = FRAME_X_DISPLAY_INFO (f)->Xatom_XEMBED; + event.xclient.message_type = FRAME_DISPLAY_INFO (f)->Xatom_XEMBED; event.xclient.format = 32; event.xclient.data.l[0] = t; event.xclient.data.l[1] = msg; @@ -8931,7 +8937,6 @@ xembed_send_message (struct frame *f, Time t, enum xembed_message msg, void x_make_frame_visible (struct frame *f) { - Lisp_Object type; int original_top, original_left; int retry_count = 2; @@ -8939,9 +8944,7 @@ x_make_frame_visible (struct frame *f) block_input (); - type = x_icon_type (f); - if (!NILP (type)) - x_bitmap_icon (f, type); + x_set_bitmap_icon (f); if (! FRAME_VISIBLE_P (f)) { @@ -9096,8 +9099,8 @@ x_make_frame_invisible (struct frame *f) window = FRAME_OUTER_WINDOW (f); /* Don't keep the highlight on an invisible frame. */ - if (FRAME_X_DISPLAY_INFO (f)->x_highlight_frame == f) - FRAME_X_DISPLAY_INFO (f)->x_highlight_frame = 0; + if (FRAME_DISPLAY_INFO (f)->x_highlight_frame == f) + FRAME_DISPLAY_INFO (f)->x_highlight_frame = 0; block_input (); @@ -9148,20 +9151,17 @@ x_iconify_frame (struct frame *f) #ifdef USE_X_TOOLKIT int result; #endif - Lisp_Object type; /* Don't keep the highlight on an invisible frame. */ - if (FRAME_X_DISPLAY_INFO (f)->x_highlight_frame == f) - FRAME_X_DISPLAY_INFO (f)->x_highlight_frame = 0; + if (FRAME_DISPLAY_INFO (f)->x_highlight_frame == f) + FRAME_DISPLAY_INFO (f)->x_highlight_frame = 0; if (FRAME_ICONIFIED_P (f)) return; block_input (); - type = x_icon_type (f); - if (!NILP (type)) - x_bitmap_icon (f, type); + x_set_bitmap_icon (f); #if defined (USE_GTK) if (FRAME_GTK_OUTER_WIDGET (f)) @@ -9227,7 +9227,7 @@ x_iconify_frame (struct frame *f) msg.xclient.window = FRAME_X_WINDOW (f); msg.xclient.type = ClientMessage; - msg.xclient.message_type = FRAME_X_DISPLAY_INFO (f)->Xatom_wm_change_state; + msg.xclient.message_type = FRAME_DISPLAY_INFO (f)->Xatom_wm_change_state; msg.xclient.format = 32; msg.xclient.data.l[0] = IconicState; @@ -9266,7 +9266,7 @@ x_iconify_frame (struct frame *f) void x_free_frame_resources (struct frame *f) { - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); Mouse_HLInfo *hlinfo = &dpyinfo->mouse_highlight; #ifdef USE_X_TOOLKIT Lisp_Object bar; @@ -9389,7 +9389,7 @@ x_free_frame_resources (struct frame *f) static void x_destroy_window (struct frame *f) { - struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); /* If a display connection is dead, don't try sending more commands to the X server. */ @@ -9435,9 +9435,9 @@ x_wm_set_size_hint (struct frame *f, long flags, bool user_position) size_hints.width_inc = FRAME_COLUMN_WIDTH (f); size_hints.height_inc = FRAME_LINE_HEIGHT (f); - size_hints.max_width = x_display_pixel_width (FRAME_X_DISPLAY_INFO (f)) + size_hints.max_width = x_display_pixel_width (FRAME_DISPLAY_INFO (f)) - FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, 0); - size_hints.max_height = x_display_pixel_height (FRAME_X_DISPLAY_INFO (f)) + size_hints.max_height = x_display_pixel_height (FRAME_DISPLAY_INFO (f)) - FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, 0); /* Calculate the base and minimum sizes. */ @@ -10384,11 +10384,6 @@ static struct redisplay_interface x_redisplay_interface = x_update_window_begin, x_update_window_end, x_flush, -#ifdef XFlush - x_flush, -#else - 0, /* flush_display_optional */ -#endif x_clear_window_mouse_face, x_get_glyph_overhangs, x_fix_overlapping_area, @@ -10572,10 +10567,6 @@ x_initialize (void) #endif #endif - pending_autoraise_frame = 0; - pending_event_wait.f = 0; - pending_event_wait.eventtype = 0; - /* Note that there is no real way portable across R3/R4 to get the original error handler. */ XSetErrorHandler (x_error_handler); @@ -10591,9 +10582,6 @@ syms_of_xterm (void) staticpro (&x_display_name_list); x_display_name_list = Qnil; - staticpro (&last_mouse_scroll_bar); - last_mouse_scroll_bar = Qnil; - DEFSYM (Qvendor_specific_keysyms, "vendor-specific-keysyms"); DEFSYM (Qlatin_1, "latin-1"); @@ -10652,9 +10640,6 @@ With MS Windows or Nextstep, the value is t. */); Vx_toolkit_scroll_bars = Qnil; #endif - staticpro (&last_mouse_motion_frame); - last_mouse_motion_frame = Qnil; - Qmodifier_value = intern_c_string ("modifier-value"); Qalt = intern_c_string ("alt"); Fput (Qalt, Qmodifier_value, make_number (alt_modifier)); @@ -10700,5 +10685,3 @@ default is nil, which is the same as `super'. */); make_float (DEFAULT_REHASH_THRESHOLD), Qnil); } - -#endif /* HAVE_X_WINDOWS */ diff --git a/src/xterm.h b/src/xterm.h index 883a249629d..36aa8e52b1c 100644 --- a/src/xterm.h +++ b/src/xterm.h @@ -78,10 +78,11 @@ typedef GtkWidget *xt_or_gtk_widget; #include "dispextern.h" #include "termhooks.h" -#define BLACK_PIX_DEFAULT(f) BlackPixel (FRAME_X_DISPLAY (f), \ - XScreenNumberOfScreen (FRAME_X_SCREEN (f))) -#define WHITE_PIX_DEFAULT(f) WhitePixel (FRAME_X_DISPLAY (f), \ - XScreenNumberOfScreen (FRAME_X_SCREEN (f))) +/* Black and white pixel values for the screen which frame F is on. */ +#define BLACK_PIX_DEFAULT(f) \ + BlackPixel (FRAME_X_DISPLAY (f), FRAME_X_SCREEN_NUMBER (f)) +#define WHITE_PIX_DEFAULT(f) \ + WhitePixel (FRAME_X_DISPLAY (f), FRAME_X_SCREEN_NUMBER (f)) #define FONT_WIDTH(f) ((f)->max_width) #define FONT_HEIGHT(f) ((f)->ascent + (f)->descent) @@ -301,6 +302,41 @@ struct x_display_info minibuffer. */ struct frame *x_highlight_frame; + /* The frame waiting to be auto-raised in XTread_socket. */ + struct frame *x_pending_autoraise_frame; + + /* The frame where the mouse was last time we reported a ButtonPress event. */ + struct frame *last_mouse_frame; + + /* The frame where the mouse was last time we reported a mouse position. */ + struct frame *last_mouse_glyph_frame; + + /* The frame where the mouse was last time we reported a mouse motion. */ + struct frame *last_mouse_motion_frame; + + /* The scroll bar in which the last X motion event occurred. */ + struct scroll_bar *last_mouse_scroll_bar; + + /* Time of last user interaction as returned in X events on this display. */ + Time last_user_time; + + /* Position where the mouse was last time we reported a motion. + This is a position on last_mouse_motion_frame. */ + int last_mouse_motion_x; + int last_mouse_motion_y; + + /* Where the mouse was last time we reported a mouse position. + This is a rectangle on last_mouse_glyph_frame. */ + XRectangle last_mouse_glyph; + + /* Time of last mouse movement on this display. This is a hack because + we would really prefer that XTmouse_position would return the time + associated with the position it returns, but there doesn't seem to be + any way to wrest the time-stamp from the server along with the position + query. So, we just keep track of the time of the last movement we + received, and return that in hopes that it's somewhat accurate. */ + Time last_mouse_movement_time; + /* The gray pixmap. */ Pixmap gray; @@ -373,20 +409,6 @@ struct x_display_info extern int use_xim; #endif -extern struct frame *x_window_to_frame (struct x_display_info *, int); -extern struct frame *x_any_window_to_frame (struct x_display_info *, int); -extern struct frame *x_menubar_window_to_frame (struct x_display_info *, - XEvent *); -extern struct frame *x_top_window_to_frame (struct x_display_info *, int); - -extern struct frame *x_menubar_window_to_frame (struct x_display_info *, - XEvent *); - -#if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) -#define x_any_window_to_frame x_window_to_frame -#define x_top_window_to_frame x_window_to_frame -#endif - /* This is a chain of structures for all the X displays currently in use. */ extern struct x_display_info *x_display_list; @@ -397,7 +419,7 @@ extern struct x_display_info *x_display_list; extern Lisp_Object x_display_name_list; extern struct x_display_info *x_display_info_for_display (Display *); - +extern struct frame *x_top_window_to_frame (struct x_display_info *, int); extern struct x_display_info *x_term_init (Lisp_Object, char *, char *); extern bool x_display_ok (const char *); @@ -711,20 +733,22 @@ enum #define FRAME_BASELINE_OFFSET(f) ((f)->output_data.x->baseline_offset) /* This gives the x_display_info structure for the display F is on. */ -#define FRAME_X_DISPLAY_INFO(f) ((f)->output_data.x->display_info) +#define FRAME_DISPLAY_INFO(f) ((f)->output_data.x->display_info) /* This is the `Display *' which frame F is on. */ -#define FRAME_X_DISPLAY(f) (FRAME_X_DISPLAY_INFO (f)->display) +#define FRAME_X_DISPLAY(f) (FRAME_DISPLAY_INFO (f)->display) /* This is the `Screen *' which frame F is on. */ -#define FRAME_X_SCREEN(f) (FRAME_X_DISPLAY_INFO (f)->screen) +#define FRAME_X_SCREEN(f) (FRAME_DISPLAY_INFO (f)->screen) + +/* This is the screen index number of screen which frame F is on. */ #define FRAME_X_SCREEN_NUMBER(f) XScreenNumberOfScreen (FRAME_X_SCREEN (f)) /* This is the Visual which frame F is on. */ -#define FRAME_X_VISUAL(f) FRAME_X_DISPLAY_INFO (f)->visual +#define FRAME_X_VISUAL(f) FRAME_DISPLAY_INFO (f)->visual /* This is the Colormap which frame F uses. */ -#define FRAME_X_COLORMAP(f) FRAME_X_DISPLAY_INFO (f)->cmap +#define FRAME_X_COLORMAP(f) FRAME_DISPLAY_INFO (f)->cmap /* The difference in pixels between the top left corner of the Emacs window (including possible window manager decorations) @@ -737,21 +761,11 @@ enum #define FRAME_XIC(f) ((f)->output_data.x->xic) -#define FRAME_X_XIM(f) (FRAME_X_DISPLAY_INFO (f)->xim) -#define FRAME_X_XIM_STYLES(f) (FRAME_X_DISPLAY_INFO (f)->xim_styles) +#define FRAME_X_XIM(f) (FRAME_DISPLAY_INFO (f)->xim) +#define FRAME_X_XIM_STYLES(f) (FRAME_DISPLAY_INFO (f)->xim_styles) #define FRAME_XIC_STYLE(f) ((f)->output_data.x->xic_style) #define FRAME_XIC_FONTSET(f) ((f)->output_data.x->xic_xfs) -/* Value is the smallest width of any character in any font on frame F. */ - -#define FRAME_SMALLEST_CHAR_WIDTH(F) \ - FRAME_X_DISPLAY_INFO(F)->smallest_char_width - -/* Value is the smallest height of any font on frame F. */ - -#define FRAME_SMALLEST_FONT_HEIGHT(F) \ - FRAME_X_DISPLAY_INFO(F)->smallest_font_height - /* X-specific scroll bar stuff. */ /* We represent scroll bars as lisp vectors. This allows us to place @@ -801,6 +815,11 @@ struct scroll_bar being dragged, this is -1. */ int dragging; +#if defined (USE_TOOLKIT_SCROLL_BARS) && defined (USE_LUCID) + /* Last scroll bar part seen in xaw_jump_callback and xaw_scroll_callback. */ + enum scroll_bar_part last_seen_part; +#endif + /* 1 if the background of the fringe that is adjacent to a scroll bar is extended to the gap between the fringe and the bar. */ unsigned fringe_extended_p : 1; @@ -809,6 +828,7 @@ struct scroll_bar /* Turning a lisp vector value into a pointer to a struct scroll_bar. */ #define XSCROLL_BAR(vec) ((struct scroll_bar *) XVECTOR (vec)) +#ifdef USE_X_TOOLKIT /* Extract the X widget of the scroll bar from a struct scroll_bar. XtWindowToWidget should be fast enough since Xt uses a hash table @@ -825,14 +845,14 @@ struct scroll_bar ptr->x_window = window; \ } while (0) +#endif /* USE_X_TOOLKIT */ /* Return the inside width of a vertical scroll bar, given the outside width. */ #define VERTICAL_SCROLL_BAR_INSIDE_WIDTH(f, width) \ ((width) \ - VERTICAL_SCROLL_BAR_LEFT_BORDER \ - - VERTICAL_SCROLL_BAR_RIGHT_BORDER \ - - VERTICAL_SCROLL_BAR_WIDTH_TRIM * 2) + - VERTICAL_SCROLL_BAR_RIGHT_BORDER) /* Return the length of the rectangle within which the top of the handle must stay. This isn't equivalent to the inside height, @@ -869,11 +889,6 @@ struct scroll_bar /* Minimum lengths for scroll bar handles, in pixels. */ #define VERTICAL_SCROLL_BAR_MIN_HANDLE (5) -/* Trimming off a few pixels from each side prevents - text from glomming up against the scroll bar */ -#define VERTICAL_SCROLL_BAR_WIDTH_TRIM (0) - - /* If a struct input_event has a kind which is SELECTION_REQUEST_EVENT or SELECTION_CLEAR_EVENT, then its contents are really described by this structure. */ @@ -905,11 +920,6 @@ struct selection_input_event #define SELECTION_EVENT_TIME(eventp) \ (((struct selection_input_event *) (eventp))->time) -/* From xselect.c. */ - -void x_handle_selection_notify (XSelectionEvent *); -void x_handle_property_notify (XPropertyEvent *); - /* From xfns.c. */ extern void x_free_gcs (struct frame *); @@ -963,8 +973,8 @@ extern void x_wait_for_event (struct frame *, int); /* Defined in xselect.c */ -extern void x_handle_property_notify (XPropertyEvent *); -extern void x_handle_selection_notify (XSelectionEvent *); +extern void x_handle_property_notify (const XPropertyEvent *); +extern void x_handle_selection_notify (const XSelectionEvent *); extern void x_handle_selection_event (struct input_event *); extern void x_clear_frame_selections (struct frame *); @@ -976,9 +986,9 @@ extern void x_send_client_event (Lisp_Object display, Lisp_Object values); extern int x_handle_dnd_message (struct frame *, - XClientMessageEvent *, + const XClientMessageEvent *, struct x_display_info *, - struct input_event *bufp); + struct input_event *); extern int x_check_property_data (Lisp_Object); extern void x_fill_property_data (Display *, Lisp_Object, @@ -994,7 +1004,6 @@ extern void x_clipboard_manager_save_all (void); /* Defined in xfns.c */ -extern struct x_display_info * check_x_display_info (Lisp_Object); extern Lisp_Object x_get_focus_frame (struct frame *); #ifdef USE_GTK diff --git a/test/ChangeLog b/test/ChangeLog index 7b39097d3b5..c8785ab4fec 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,60 @@ +2013-09-22 Daniel Colascione <dancol@dancol.org> + + * automated/data-test.el: + (bool-vector-count-matches-all-0-nil) + (bool-vector-count-matches-all-0-t) + (bool-vector-count-matches-1-il,bool-vector-count-matches-1-t) + (bool-vector-count-matches-at,bool-vector-intersection-op) + (bool-vector-union-op,bool-vector-xor-op) + (bool-vector-set-difference-op) + (bool-vector-change-detection,bool-vector-not): New tests. + (mock-bool-vector-count-matches-at) + (test-bool-vector-bv-from-hex-string) + (test-bool-vector-to-hex-string) + (test-bool-vector-count-matches-at-tc) + (test-bool-vector-apply-mock-op) + (test-bool-vector-binop): New helper functions. + (bool-vector-test-vectors): New testcase data. + +2013-09-20 Ryan <rct@thompsonclan.org> (tiny change) + + * automated/advice-tests.el (advice-test-called-interactively-p-around) + (advice-test-called-interactively-p-filter-args) + (advice-test-called-interactively-p-around): New tests. + +2013-09-16 Glenn Morris <rgm@gnu.org> + + * automated/eshell.el (eshell-match-result): + Return a more informative failure than simply "false". Update callers. + + * automated/eshell.el (eshell-test/for-name-shadow-loop): + Test value before and after loop as well as during. + +2013-09-15 Glenn Morris <rgm@gnu.org> + + * automated/eshell.el (eshell-test/for-name-shadow-loop): + New test. (Bug#15372) + (eshell-test/for-loop, eshell-test/for-name-loop): Doc fix. + +2013-09-13 Glenn Morris <rgm@gnu.org> + + * automated/eshell.el (with-temp-eshell): + Use a temp directory for eshell-directory-name. + (eshell-test-command-result): New, again using a temp directory. + Replace eshell-command-result with this throughout. + (eshell-test/for-loop, eshell-test/for-name-loop): + Ensure environment variables don't confuse us. + +2013-09-12 Glenn Morris <rgm@gnu.org> + + * automated/eshell.el (with-temp-eshell): Avoid hangs in batch mode + due to "has a running process; kill it?" prompts. + +2013-09-12 Stefan Monnier <monnier@iro.umontreal.ca> + + * automated/eshell.el: Rename from eshell.el. + (eshell-test/for-loop, eshell-test/for-name-loop): New tests (bug#15231). + 2013-09-01 Glenn Morris <rgm@gnu.org> * automated/Makefile.in (setwins): Avoid leading space in $wins. @@ -164,25 +221,25 @@ 2013-07-05 Michael Albinus <michael.albinus@gmx.de> * automated/file-notify-tests.el - (file-notify-test-remote-temporary-file-directory): Use - `null-device' on w32. + (file-notify-test-remote-temporary-file-directory): + Use `null-device' on w32. (file-notify--test-tmpfile, file-notify--test-tmpfile1) (file-notify--test-results, file-notify--test-event) (file-notify--deftest-remote, file-notify--event-test) (file-notify--test-event-handler) - (file-notify--test-make-temp-name): Renamed, in order to mark them + (file-notify--test-make-temp-name): Rename, in order to mark them internal. (tramp-message-show-message, tramp-read-passwd): Tweak them for better fitting in noninteractive tests. - (file-notify-test00-availability): Renamed from `file-notify-test0'. - (file-notify-test01-add-watch): Renamed from `file-notify-test1'. + (file-notify-test00-availability): Rename from `file-notify-test0'. + (file-notify-test01-add-watch): Rename from `file-notify-test1'. Use `temporary-file-directory '. (file-notify-test01-add-watch-remote): New test. - (file-notify-test02-events): Renamed from `file-notify-test2'. - (file-notify-test02-events-remote): Renamed from `file-notify-test3'. - (file-notify-test03-autorevert): Renamed from + (file-notify-test02-events): Rename from `file-notify-test2'. + (file-notify-test02-events-remote): Rename from `file-notify-test3'. + (file-notify-test03-autorevert): Rename from `file-notify-test4'. Use timeouts. - (file-notify-test03-autorevert-remote): Renamed from + (file-notify-test03-autorevert-remote): Rename from `file-notify-test5'. 2013-07-04 Michael Albinus <michael.albinus@gmx.de> @@ -192,7 +249,7 @@ 2013-06-28 Kenichi Handa <handa@gnu.org> * automated/decoder-tests.el (decoder-tests-gen-file): New arg FILE. - (decoder-tests-ao-gen-file): Renamed from decoder-tests-filename. + (decoder-tests-ao-gen-file): Rename from decoder-tests-filename. Callers changed. (decoder-tests-filename): New function. (decoder-tests-prefer-utf-8-read) diff --git a/test/automated/advice-tests.el b/test/automated/advice-tests.el index 424f447ae4b..bdb0eb09b40 100644 --- a/test/automated/advice-tests.el +++ b/test/automated/advice-tests.el @@ -130,6 +130,38 @@ (cons (cons 2 (called-interactively-p)) (apply f args)))) (should (equal (call-interactively 'sm-test7) '((2 . t) (1 . t) 11)))) +(ert-deftest advice-test-called-interactively-p-around () + "Check interaction between around advice and called-interactively-p. + +This tests the currently broken case of the innermost advice to a +function being an around advice." + :expected-result :failed + (defun sm-test7.2 () (interactive) (cons 1 (called-interactively-p))) + (advice-add 'sm-test7.2 :around + (lambda (f &rest args) + (list (cons 1 (called-interactively-p)) (apply f args)))) + (should (equal (sm-test7.2) '((1 . nil) (1 . nil)))) + (should (equal (call-interactively 'sm-test7.2) '((1 . t) (1 . t))))) + +(ert-deftest advice-test-called-interactively-p-filter-args () + "Check interaction between filter-args advice and called-interactively-p." + :expected-result :failed + (defun sm-test7.3 () (interactive) (cons 1 (called-interactively-p))) + (advice-add 'sm-test7.3 :filter-args #'list) + (should (equal (sm-test7.3) '(1 . nil))) + (should (equal (call-interactively 'sm-test7.3) '(1 . t)))) + +(ert-deftest advice-test-call-interactively () + "Check interaction between advice on call-interactively and called-interactively-p." + (defun sm-test7.4 () (interactive) (cons 1 (called-interactively-p))) + (let ((old (symbol-function 'call-interactively))) + (unwind-protect + (progn + (advice-add 'call-interactively :before #'ignore) + (should (equal (sm-test7.4) '(1 . nil))) + (should (equal (call-interactively 'sm-test7.4) '(1 . t)))) + (fset 'call-interactively old)))) + (ert-deftest advice-test-interactive () "Check handling of interactive spec." (defun sm-test8 (a) (interactive "p") a) diff --git a/test/automated/data-tests.el b/test/automated/data-tests.el new file mode 100644 index 00000000000..d79e1643848 --- /dev/null +++ b/test/automated/data-tests.el @@ -0,0 +1,259 @@ +;;; data-tests.el --- tests for src/data.c + +;; Copyright (C) 2013 Free Software Foundation, Inc. + +;; This file is part of GNU Emacs. + +;; This program is free software: you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation, either version 3 of the +;; License, or (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see `http://www.gnu.org/licenses/'. + +;;; Commentary: + +;;; Code: + +(require 'cl-lib) +(eval-when-compile (require 'cl)) + +(ert-deftest data-tests-= () + (should-error (=)) + (should (= 1)) + (should (= 2 2)) + (should (= 9 9 9 9 9 9 9 9 9)) + (should-not (apply #'= '(3 8 3))) + (should-error (= 9 9 'foo)) + ;; Short circuits before getting to bad arg + (should-not (= 9 8 'foo))) + +(ert-deftest data-tests-< () + (should-error (<)) + (should (< 1)) + (should (< 2 3)) + (should (< -6 -1 0 2 3 4 8 9 999)) + (should-not (apply #'< '(3 8 3))) + (should-error (< 9 10 'foo)) + ;; Short circuits before getting to bad arg + (should-not (< 9 8 'foo))) + +(ert-deftest data-tests-> () + (should-error (>)) + (should (> 1)) + (should (> 3 2)) + (should (> 6 1 0 -2 -3 -4 -8 -9 -999)) + (should-not (apply #'> '(3 8 3))) + (should-error (> 9 8 'foo)) + ;; Short circuits before getting to bad arg + (should-not (> 8 9 'foo))) + +(ert-deftest data-tests-<= () + (should-error (<=)) + (should (<= 1)) + (should (<= 2 3)) + (should (<= -6 -1 -1 0 0 0 2 3 4 8 999)) + (should-not (apply #'<= '(3 8 3 3))) + (should-error (<= 9 10 'foo)) + ;; Short circuits before getting to bad arg + (should-not (<= 9 8 'foo))) + +(ert-deftest data-tests->= () + (should-error (>=)) + (should (>= 1)) + (should (>= 3 2)) + (should (>= 666 1 0 0 -2 -3 -3 -3 -4 -8 -8 -9 -999)) + (should-not (apply #'>= '(3 8 3))) + (should-error (>= 9 8 'foo)) + ;; Short circuits before getting to bad arg + (should-not (>= 8 9 'foo))) + +;; Bool vector tests. Compactly represent bool vectors as hex +;; strings. + +(ert-deftest bool-vector-count-matches-all-0-nil () + (cl-loop for sz in '(0 45 1 64 9 344) + do (let* ((bv (make-bool-vector sz nil))) + (should + (eql + (bool-vector-count-matches bv nil) + sz))))) + +(ert-deftest bool-vector-count-matches-all-0-t () + (cl-loop for sz in '(0 45 1 64 9 344) + do (let* ((bv (make-bool-vector sz nil))) + (should + (eql + (bool-vector-count-matches bv t) + 0))))) + +(ert-deftest bool-vector-count-matches-1-nil () + (let* ((bv (make-bool-vector 45 nil))) + (aset bv 40 t) + (aset bv 0 t) + (should + (eql + (bool-vector-count-matches bv t) + 2))) + ) + +(ert-deftest bool-vector-count-matches-1-t () + (let* ((bv (make-bool-vector 45 nil))) + (aset bv 40 t) + (aset bv 0 t) + (should + (eql + (bool-vector-count-matches bv nil) + 43)))) + +(defun mock-bool-vector-count-matches-at (a b i) + (loop for i from i below (length a) + while (eq (aref a i) b) + sum 1)) + +(defun test-bool-vector-bv-from-hex-string (desc) + (let (bv nchars nibbles) + (dolist (c (string-to-list desc)) + (push (string-to-number + (char-to-string c) + 16) + nibbles)) + (setf bv (make-bool-vector (* 4 (length nibbles)) nil)) + (let ((i 0)) + (dolist (n (nreverse nibbles)) + (dotimes (_ 4) + (aset bv i (> (logand 1 n) 0)) + (incf i) + (setf n (lsh n -1))))) + bv)) + +(defun test-bool-vector-to-hex-string (bv) + (let (nibbles (v (cl-coerce bv 'list))) + (while v + (push (logior + (lsh (if (nth 0 v) 1 0) 0) + (lsh (if (nth 1 v) 1 0) 1) + (lsh (if (nth 2 v) 1 0) 2) + (lsh (if (nth 3 v) 1 0) 3)) + nibbles) + (setf v (nthcdr 4 v))) + (mapconcat (lambda (n) (format "%X" n)) + (nreverse nibbles) + ""))) + +(defun test-bool-vector-count-matches-at-tc (desc) + "Run a test case for bool-vector-count-matches-at. +DESC is a string describing the test. It is a sequence of +hexadecimal digits describing the bool vector. We exhaustively +test all counts at all possible positions in the vector by +comparing the subr with a much slower lisp implementation." + (let ((bv (test-bool-vector-bv-from-hex-string desc))) + (loop + for lf in '(nil t) + do (loop + for pos from 0 upto (length bv) + for cnt = (mock-bool-vector-count-matches-at bv lf pos) + for rcnt = (bool-vector-count-matches-at bv lf pos) + unless (eql cnt rcnt) + do (error "FAILED testcase %S %3S %3S %3S" + pos lf cnt rcnt))))) + +(defconst bool-vector-test-vectors +'("" + "0" + "F" + "0F" + "F0" + "00000000000000000000000000000FFFFF0000000" + "44a50234053fba3340000023444a50234053fba33400000234" + "12341234123456123412346001234123412345612341234600" + "44a50234053fba33400000234" + "1234123412345612341234600" + "44a50234053fba33400000234" + "1234123412345612341234600" + "44a502340" + "123412341" + "0000000000000000000000000" + "FFFFFFFFFFFFFFFF1")) + +(ert-deftest bool-vector-count-matches-at () + (mapc #'test-bool-vector-count-matches-at-tc + bool-vector-test-vectors)) + +(defun test-bool-vector-apply-mock-op (mock a b c) + "Compute (slowly) the correct result of a bool-vector set operation." + (let (changed nv) + (assert (eql (length b) (length c))) + (if a (setf nv a) + (setf a (make-bool-vector (length b) nil)) + (setf changed t)) + + (loop for i below (length b) + for mockr = (funcall mock + (if (aref b i) 1 0) + (if (aref c i) 1 0)) + for r = (not (= 0 mockr)) + do (progn + (unless (eq (aref a i) r) + (setf changed t)) + (setf (aref a i) r))) + (if changed a))) + +(defun test-bool-vector-binop (mock real) + "Test a binary set operation." + (loop for s1 in bool-vector-test-vectors + for bv1 = (test-bool-vector-bv-from-hex-string s1) + for vecs2 = (cl-remove-if-not + (lambda (x) (eql (length x) (length s1))) + bool-vector-test-vectors) + do (loop for s2 in vecs2 + for bv2 = (test-bool-vector-bv-from-hex-string s2) + for mock-result = (test-bool-vector-apply-mock-op + mock nil bv1 bv2) + for real-result = (funcall real bv1 bv2) + do (progn + (should (equal mock-result real-result)))))) + +(ert-deftest bool-vector-intersection-op () + (test-bool-vector-binop + #'logand + #'bool-vector-intersection)) + +(ert-deftest bool-vector-union-op () + (test-bool-vector-binop + #'logior + #'bool-vector-union)) + +(ert-deftest bool-vector-xor-op () + (test-bool-vector-binop + #'logxor + #'bool-vector-exclusive-or)) + +(ert-deftest bool-vector-set-difference-op () + (test-bool-vector-binop + (lambda (a b) (logand a (lognot b))) + #'bool-vector-set-difference)) + +(ert-deftest bool-vector-change-detection () + (let* ((vc1 (test-bool-vector-bv-from-hex-string "abcdef")) + (vc2 (test-bool-vector-bv-from-hex-string "012345")) + (vc3 (make-bool-vector (length vc1) nil)) + (c1 (bool-vector-union vc1 vc2 vc3)) + (c2 (bool-vector-union vc1 vc2 vc3))) + (should (equal c1 (test-bool-vector-apply-mock-op + #'logior + nil + vc1 vc2))) + (should (not c2)))) + +(ert-deftest bool-vector-not () + (let* ((v1 (test-bool-vector-bv-from-hex-string "FFFF3")) + (v2 (test-bool-vector-bv-from-hex-string "0000C")) + (v3 (bool-vector-not v1))) + (should (equal v2 v3)))) diff --git a/test/eshell.el b/test/automated/eshell.el index 126a47220c4..3cc3e92d1e5 100644 --- a/test/eshell.el +++ b/test/automated/eshell.el @@ -30,11 +30,15 @@ (defmacro with-temp-eshell (&rest body) "Evaluate BODY in a temporary Eshell buffer." - `(let ((eshell-buffer (eshell t))) + `(let* ((eshell-directory-name (make-temp-file "eshell" t)) + (eshell-history-file-name nil) + (eshell-buffer (eshell t))) (unwind-protect (with-current-buffer eshell-buffer ,@body) - (kill-buffer eshell-buffer)))) + (let (kill-buffer-query-functions) + (kill-buffer eshell-buffer) + (delete-directory eshell-directory-name t))))) (defun eshell-insert-command (text &optional func) "Insert a command at the end of the buffer." @@ -43,99 +47,124 @@ (funcall (or func 'eshell-send-input))) (defun eshell-match-result (regexp) - "Insert a command at the end of the buffer." + "Check that text after `eshell-last-input-end' matches REGEXP." (goto-char eshell-last-input-end) - (looking-at regexp)) + (should (string-match-p regexp (buffer-substring-no-properties + (point) (point-max))))) (defun eshell-command-result-p (text regexp &optional func) "Insert a command at the end of the buffer." (eshell-insert-command text func) (eshell-match-result regexp)) +(defun eshell-test-command-result (command) + "Like `eshell-command-result', but not using HOME." + (let ((eshell-directory-name (make-temp-file "eshell" t)) + (eshell-history-file-name nil)) + (unwind-protect + (eshell-command-result command) + (delete-directory eshell-directory-name t)))) + ;;; Tests: (ert-deftest eshell-test/simple-command-result () "Test `eshell-command-result' with a simple command." - (should (equal (eshell-command-result "+ 1 2") 3))) + (should (equal (eshell-test-command-result "+ 1 2") 3))) (ert-deftest eshell-test/lisp-command () "Test `eshell-command-result' with an elisp command." - (should (equal (eshell-command-result "(+ 1 2)") 3))) + (should (equal (eshell-test-command-result "(+ 1 2)") 3))) + +(ert-deftest eshell-test/for-loop () + "Test `eshell-command-result' with a for loop.." + (let ((process-environment (cons "foo" process-environment))) + (should (equal (eshell-test-command-result + "for foo in 5 { echo $foo }") 5)))) + +(ert-deftest eshell-test/for-name-loop () ;Bug#15231 + "Test `eshell-command-result' with a for loop using `name'." + (let ((process-environment (cons "name" process-environment))) + (should (equal (eshell-test-command-result + "for name in 3 { echo $name }") 3)))) + +(ert-deftest eshell-test/for-name-shadow-loop () ; bug#15372 + "Test `eshell-command-result' with a for loop using an env-var." + (let ((process-environment (cons "name=env-value" process-environment))) + (with-temp-eshell + (eshell-command-result-p "echo $name; for name in 3 { echo $name }; echo $name" + "env-value\n3\nenv-value\n")))) (ert-deftest eshell-test/lisp-command-args () "Test `eshell-command-result' with elisp and trailing args. Test that trailing arguments outside the S-expression are ignored. e.g. \"(+ 1 2) 3\" => 3" - (should (equal (eshell-command-result "(+ 1 2) 3") 3))) + (should (equal (eshell-test-command-result "(+ 1 2) 3") 3))) (ert-deftest eshell-test/subcommand () "Test `eshell-command-result' with a simple subcommand." - (should (equal (eshell-command-result "{+ 1 2}") 3))) + (should (equal (eshell-test-command-result "{+ 1 2}") 3))) (ert-deftest eshell-test/subcommand-args () "Test `eshell-command-result' with a subcommand and trailing args. Test that trailing arguments outside the subcommand are ignored. e.g. \"{+ 1 2} 3\" => 3" - (should (equal (eshell-command-result "{+ 1 2} 3") 3))) + (should (equal (eshell-test-command-result "{+ 1 2} 3") 3))) (ert-deftest eshell-test/subcommand-lisp () "Test `eshell-command-result' with an elisp subcommand and trailing args. Test that trailing arguments outside the subcommand are ignored. e.g. \"{(+ 1 2)} 3\" => 3" - (should (equal (eshell-command-result "{(+ 1 2)} 3") 3))) + (should (equal (eshell-test-command-result "{(+ 1 2)} 3") 3))) (ert-deftest eshell-test/interp-cmd () "Interpolate command result" - (should (equal (eshell-command-result "+ ${+ 1 2} 3") 6))) + (should (equal (eshell-test-command-result "+ ${+ 1 2} 3") 6))) (ert-deftest eshell-test/interp-lisp () "Interpolate Lisp form evaluation" - (should (equal (eshell-command-result "+ $(+ 1 2) 3") 6))) + (should (equal (eshell-test-command-result "+ $(+ 1 2) 3") 6))) (ert-deftest eshell-test/interp-concat () "Interpolate and concat command" - (should (equal (eshell-command-result "+ ${+ 1 2}3 3") 36))) + (should (equal (eshell-test-command-result "+ ${+ 1 2}3 3") 36))) (ert-deftest eshell-test/interp-concat-lisp () "Interpolate and concat Lisp form" - (should (equal (eshell-command-result "+ $(+ 1 2)3 3") 36))) + (should (equal (eshell-test-command-result "+ $(+ 1 2)3 3") 36))) (ert-deftest eshell-test/interp-concat2 () "Interpolate and concat two commands" - (should (equal (eshell-command-result "+ ${+ 1 2}${+ 1 2} 3") 36))) + (should (equal (eshell-test-command-result "+ ${+ 1 2}${+ 1 2} 3") 36))) (ert-deftest eshell-test/interp-concat-lisp2 () "Interpolate and concat two Lisp forms" - (should (equal (eshell-command-result "+ $(+ 1 2)$(+ 1 2) 3") 36))) + (should (equal (eshell-test-command-result "+ $(+ 1 2)$(+ 1 2) 3") 36))) (ert-deftest eshell-test/window-height () "$LINES should equal (window-height)" - (should (eshell-command-result "= $LINES (window-height)"))) + (should (eshell-test-command-result "= $LINES (window-height)"))) (ert-deftest eshell-test/window-width () "$COLUMNS should equal (window-width)" - (should (eshell-command-result "= $COLUMNS (window-width)"))) + (should (eshell-test-command-result "= $COLUMNS (window-width)"))) (ert-deftest eshell-test/last-result-var () "Test using the \"last result\" ($$) variable" (with-temp-eshell - (should - (eshell-command-result-p "+ 1 2; + $$ 2" - "3\n5\n")))) + (eshell-command-result-p "+ 1 2; + $$ 2" + "3\n5\n"))) (ert-deftest eshell-test/last-result-var2 () "Test using the \"last result\" ($$) variable twice" (with-temp-eshell - (should - (eshell-command-result-p "+ 1 2; + $$ $$" - "3\n6\n")))) + (eshell-command-result-p "+ 1 2; + $$ $$" + "3\n6\n"))) (ert-deftest eshell-test/last-arg-var () "Test using the \"last arg\" ($_) variable" (with-temp-eshell - (should - (eshell-command-result-p "+ 1 2; + $_ 4" - "3\n6\n")))) + (eshell-command-result-p "+ 1 2; + $_ 4" + "3\n6\n"))) (ert-deftest eshell-test/command-running-p () "Modeline should show no command running" @@ -169,14 +198,14 @@ e.g. \"{(+ 1 2)} 3\" => 3" (> count 0)) (sit-for 1) (setq count (1- count)))) - (should (eshell-match-result "alpha\n")))) + (eshell-match-result "alpha\n"))) (ert-deftest eshell-test/flush-output () "Test flushing of previous output" (with-temp-eshell (eshell-insert-command "echo alpha") (eshell-kill-output) - (should (eshell-match-result (regexp-quote "*** output flushed ***\n"))) + (eshell-match-result (regexp-quote "*** output flushed ***\n")) (should (forward-line)) (should (= (point) eshell-last-output-start)))) diff --git a/test/indent/ruby.rb b/test/indent/ruby.rb index af1bbb9d8ab..6c9b9775b48 100644 --- a/test/indent/ruby.rb +++ b/test/indent/ruby.rb @@ -71,3 +71,7 @@ end if something == :== do_something end + +# Bug#15369 +MSG = 'Separate every 3 digits in the integer portion of a number' \ + 'with underscores(_).' |
